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


はじめに

Salesforceのチャット機能 Chatter に対して、様々な操作を行えるChatter REST APIというものがあります。

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

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

なお、cURLコマンドによるSalesforce REST APIの操作については、こちらの記事 をご参照下さい。

実行環境

本記事の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リファレンスを参考にさせて頂きました。ありがとうございました。

Chatter REST API 開発者ガイド(英語版) -> Post a Feed Item

Chatter REST API 開発者ガイド(日本語版) -> ダイレクトメッセージの送信(日本語版)

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

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

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

PHP5からSalesforce REST APIを実行する (カスタムオブジェクトへレコードを追加する)

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

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

cURLコマンドでSalesforce REST APIを実行する

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

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

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

$ vi push_salesforce_chatter_message.sh
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に届いている事を確認します。

補足事項

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

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

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

・正しい方の資料
Chatter REST API 開発者ガイド(英語版) -> Post a Feed Item

・誤りがある方の資料(パラメータの記述が古い?)
Chatter REST API 開発者ガイド(日本語版) -> ダイレクトメッセージの送信(日本語版)

最後に

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


以上になります。