cURLコマンドとシェルスクリプトでSalesforce Chatter REST APIを実行してChatterメッセージを投稿する

はじめに
===

Salesforceのチャット機能 **「<a href="https://www.salesforce.com/jp/products/chatter/features/">Chatter</a>」** に対して、様々な操作を行えるChatter REST APIというものがあります。

Chatter REST APIはPHPやRubyといったプログラムからだけでなく、cURL(カール)コマンドでも呼び出す事が出来ます。

本記事では、cURLコマンドを使って、SalesforceのChatter REST APIを呼び出し、SalesforceのChatterへメッセージを投稿するコマンドを記します。

**なお、cURLコマンドによるSalesforce REST APIの操作については、<a href="https://qiita.com/na0AaooQ/items/a6f733f13a79658da956">こちらの記事</a> をご参照下さい。**


実行環境
===

本記事のcURLを実行している環境は以下の通りです。

| OS | マシンの種類 | OSバージョン | カーネルバージョン |
|:------------|:------------|:------------|:------------|
| Mac | MacBook PRO (Retina) | macOS Mojave 10.14.1 | Darwin Kernel Version 18.2.0 |

Chatterメッセージ投稿先(Chatter REST API呼び出し先)のSalesforce組織のバージョンは以下の通りです。

| バージョン | APIバージョン　|
|:------------|:------------|
| Salesforce Winter '19 |Salesforce.com Enterprise Web Services API Version 44.0 |

参考資料
===

Salesforce社様のChatter REST APIリファレンスを参考にさせて頂きました。ありがとうございました。

<a href="https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/quickreference_post_feed_item.htm">Chatter REST API 開発者ガイド(英語版) -> Post a Feed Item</a>

<a href="https://developer.salesforce.com/docs/atlas.ja-jp.chatterapi.meta/chatterapi/quickreference_post_feed_element_direct_message.htm">Chatter REST API 開発者ガイド(日本語版) -> ダイレクトメッセージの送信(日本語版)</a>


cURLコマンドでSalesforce REST APIへ接続する為の事前準備
===

## (1) Salesforce側でChatter REST APIを呼び出せるようにする設定

Chatter REST APIを呼び出せるようSalesforce側で「ログイン IP アドレスの制限」設定等をしておく必要があります。設定手順は以下の記事をご参照下さい。

<a href="https://qiita.com/na0AaooQ/items/157c28a80948c4b97bed">PHP5からSalesforce REST APIを実行する (カスタムオブジェクトへレコードを追加する)</a>

## (2) cURLコマンド実行マシンのOpenSSLバージョンを確認する。

以下の記事と同じく、cURLコマンドを実行するマシンには、Chatter REST APIへ接続する為に必要なOpenSSL 1.0.1以上がインストールされている必要があります。詳細は以下記事をご参照下さい。

<a href="https://qiita.com/na0AaooQ/items/a6f733f13a79658da956">cURLコマンドでSalesforce REST APIを実行する</a>

cURLコマンドでSalesforce Chatterへダイレクトメッセージを投稿する例
===

## (1) cURLコマンドでChatterへメッセージを投稿するスクリプトを作成します。

以下のようなスクリプトを作成します。

```
$ vi push_salesforce_chatter_message.sh
```

```bash:push_salesforce_chatter_message.sh
#!/bin/sh

export SFDC_HOST="login.salesforce.com"
export SFDC_API_VER="v44.0"

export SFDC_CLIENT_ID="Salesforceの「設定」->「ビルド」->「作成」->「アプリケーション」のChatter REST API接続用アプリケーションの「コンシューマ鍵」(OAuthコンシューマキー文字列)を記載します。"
export SFDC_CLIENT_SECRET="Salesforceの「設定」->「ビルド」->「作成」->「アプリケーション」のChatter REST API接続用アプリケーションの「コンシューマの秘密」(OAuthコンシューマシークレット文字列)を記載します。"
export SFDC_CLIENT_USERNAME="Chatter REST APIを有効化しているSalesforceユーザアカウント名を記載します。"
export SFDC_CLIENT_AUTHENTICATE_PASSWORD="Chatter REST APIを有効化しているSalesforceユーザアカウントのパスワードを記載します。"

## Chatterメッセージ投稿先のSalesforceユーザIDを指定する
SFDC_USER_ID="005**********"

## ChatterグループID等を指定す
## ChatterグループIDはChatterグループURLの以下g=の部分の事( https://ap7.salesforce.com/_ui/core/chatter/groups/GroupProfilePage?g=0F9************ )
SFDC_CHATTER_GROUP_ID="0F9************"

## Chatter REST APIのアクセストークンを取得する
SFDC_AUTH_RESP=`curl -s https://${SFDC_HOST}/services/oauth2/token -d "grant_type=password" -d "client_id=${SFDC_CLIENT_ID}" -d "client_secret=${SFDC_CLIENT_SECRET}" -d "username=$SFDC_CLIENT_USERNAME" -d "password=${SFDC_CLIENT_AUTHENTICATE_PASSWORD}"`=

## 取得したChatter REST APIのアクセストークンをセットする
SFDC_ACCESS_TOKEN=`echo "${SFDC_AUTH_RESP}" | awk 'BEGIN{FS="access_token\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}' | sed -e 's/\"//g'`

## 取得したChatter REST APIのSalesforceインスタンスURLをセットする
SFDC_INSTANCE_URL=`echo "${SFDC_AUTH_RESP}" | awk 'BEGIN{FS="instance_url\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}' | sed -e 's/\"//g'`

## Chatterメッセージ投稿本文に付加する文字列
SFDC_CHATTER_POST_DATE=`date '+%Y%m%d_%H%m%S'`

## Chatter REST APIを呼び出して、Chatterへメッセージを投稿する
curl -s -X POST ${SFDC_INSTANCE_URL}/services/data/${SFDC_API_VER}/chatter/feed-elements \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${SFDC_ACCESS_TOKEN}" \
-H "X-PrettyPrint:1" \
-d '{
  "body" : {
    "messageSegments" : [
      {
        "type": "Text",
        "text": "curlからのテストメッセージ 投稿日時=['${SFDC_CHATTER_POST_DATE}'] "
      },
      {  
        "type": "Mention",
        "id": "'${SFDC_USER_ID}'"
      }
    ]
  },
  "feedElementType": "FeedItem",
  "subjectId": "'${SFDC_CHATTER_GROUP_ID}'"
}'
```

作成したシェルスクリプトの構文チェックを行います。以下のように何も表示されなければ、構文上の問題はございません。

```
$ sh -n push_salesforce_chatter_message.sh
$ 
```

作成したシェルスクリプトに実行権限を付与します。

```
$ chmod 750 push_salesforce_chatter_message.sh
$ 
```

## (2) 前述で作成したシェルスクリプトを実行し、Chatterへメッセージを投稿します。

以下のようにスクリプトを実行し、Chatterへメッセージを投稿します。

スクリプト実行結果として、Chatter REST APIのレスポンスがずらずらと表示されますが、これでChatterへメッセージが投稿されます。

```
$ ./push_salesforce_chatter_message.sh
{
  "actor" : {
    "additionalLabel" : null,

　(中略)

  },
  "body" : {
    "isRichText" : false,
    "messageSegments" : [ {
      "text" : "curlからのテストメッセージ 投稿日時=[20181225_011241] ",
      "type" : "Text"
    }, {
      "accessible" : true,
      "name" : "** **",
      "record" : {

　(中略)

  "visibility" : "AllUsers"
}
```

## (3) Salesforceにログインして、Chatterにメッセージが届いている事を確認します。

Salesforceにログインして、cURLから投稿したメッセージがChatterに届いている事を確認します。

<img width="1200" alt="スクリーンショット 2018-12-25 1.57.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/bd35794d-d871-bab4-0d90-e0eb0bd873d8.png">

<img width="1198" alt="スクリーンショット 2018-12-25 1.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/450ecffd-d101-178c-4dd2-ed4fb6361b11.png">


補足事項
===

Salesforce Chatter REST APIリファレンス(日本語版)では、Chatterメッセージ投稿API( https://******.salesforce.com/services/data/v44.0/chatter/feed-elements
 )のパラメータに「subjectId」の記載ないのですが、英語版APIリファレンスには「subjectId」の記載があります。

実際にcURLで「subjectId」を付けないでリクエストを投げてみると、「subjectId」がないとエラーになるので、英語版APIリファレンスの記載が正しいようです。


```bash:subjectIdなしでcURL実行した場合のエラー
$ ./push_salesforce_chatter_message_badrequest.sh
[ {
  "errorCode" : "MISSING_ARGUMENT",
  "message" : "Missing required 'subjectId' parameter."
} ]$ 
$
```

・正しい方の資料
<a href="https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/quickreference_post_feed_item.htm">Chatter REST API 開発者ガイド(英語版) -> Post a Feed Item</a>

・誤りがある方の資料(パラメータの記述が古い？)
<a href="https://developer.salesforce.com/docs/atlas.ja-jp.chatterapi.meta/chatterapi/quickreference_post_feed_element_direct_message.htm">Chatter REST API 開発者ガイド(日本語版) -> ダイレクトメッセージの送信(日本語版)</a>

最後に
===

cURLコマンドにより、Salesforce REST APIだけでなく、Chatter REST APIも実行可能です。

***

以上になります。