BashからSalesforceのREST APIを呼び出すには

SalesforceのREST APIを呼び出して、簡単な作業を自動化したい時があります。
Bashを使って簡単にREST APIを呼び出してみました。

事前準備

接続アプリケーションの作成

Bashから呼び出されるために接続アプリケーションを設定して接続に必要な情報を生成します。
まず、Salesforceの設定で[接続アプリケーション]を作成します。

[新規接続アプリケーション]ボタンをクリックする
必須項目を入力します。

アプリケーション名、API参照名、取引先責任者メールを設定します。
OAuth設定の有効化をオンにして、必要な設定をします。
コールバックURLは必須ですが、Web UIがないため、適当に「http://localhost」で大丈夫です。
OAuthの範囲として必要なものを設定します。ここでは「api」と「openid」を設定しています。他の機能も呼び出す場合は必要に応じて追加します。

[接続アプリケーション]が作成されるので[コンシューマの詳細を管理]ボタンをクリックしてコンシューマ鍵(クライアントID)とコンシューマの秘密(クライアントシークレット)を取得します

取得(生成)したコンシューマ鍵とコンシューマの秘密を使ってBashから接続できます。

jqコマンドのインストール

BashからJSONを取り扱うためにjqコマンドをインストールします。

sudo apt install jq

APIの呼び出し

あとは、以下のようにcURLでAPIを呼び出します。

#! /bin/bash
USER_ID=SalesforceにログインしているユーザID
PASSWORD=Salesforceにログインしているパスワード
SECURITY_TOKEN=ユーザのセキュリティトークン
CLIENT_ID=コンシューマ鍵
CLIENT_SECRET=コンシューマの秘密
PASSWORD_TOKEN=$PASSWORD$SECURITY_TOKEN

CALLLOGIN="curl https://login.salesforce.com/services/oauth2/token -d ""grant_type=password"" -d ""client_id=$CLIENT_ID"" -d ""client_secret=$CLIENT_SECRET"" -d ""username=$USER_ID"" -d ""password=$PASSWORD_TOKEN"""
eval $CALLLOGIN > tmp_token

ACCESS_TOKEN=`cat tmp_token | jq -r ".access_token"`
INSTANCE_URL=`cat tmp_token | jq -r ".instance_url"`
rm tmp_token

curl $INSTANCE_URL/services/data/v57.0/sobjects/Contact -H "Authorization: Bearer $ACCESS_TOKEN" | jq .

アクセストークンを取得するために/services/oauth2/tokenを呼び出します。以下のようなレスポンスが返されます。

{
  "access_token": "00D5h000001....8aD3!.EpA",
  "instance_url": "https://mydomain.my.salesforce.com",
  "id": "https://login.salesforce.com/id/00D5h000xxxxxxx/0055h0xxxxxxx",
  "token_type": "Bearer",
  "issued_at": "1683335932221",
  "signature": "qkZKzzzzzzzX4FeI7JFfcuRM="
}

アクセストークン(access_token)や接続先のインスタンスURL(instance_url)が返されるので、これを使ってREST APIの呼び出しができるようになります。
上記のサンプルでは、取引先責任者のレコードを取得しています。(/services/data/v57.0/objects/Contact)

{
  "objectDescribe": {
    "activateable": false,
    "associateEntityType": null,
    "associateParentEntity": null,
    "createable": true,
    "custom": false,
    "customSetting": false,
    "deepCloneable": false,
    "deletable": true,
    "deprecatedAndHidden": false,
    "feedEnabled": true,
    "hasSubtypes": false,
    "isInterface": false,
    "isSubtype": false,
    "keyPrefix": "003",
    "label": "取引先責任者",
    "labelPlural": "取引先責任者",
    "layoutable": true,
    "mergeable": true,
    "mruEnabled": true,
    "name": "Contact",
    "queryable": true,
    "replicateable": true,
    "retrieveable": true,
    "searchable": true,
    "triggerable": true,
    "undeletable": true,
    "updateable": true,
    "urls": {
      "compactLayouts": "/services/data/v57.0/sobjects/Contact/describe/compactLayouts",
      "rowTemplate": "/services/data/v57.0/sobjects/Contact/{ID}",
      "approvalLayouts": "/services/data/v57.0/sobjects/Contact/describe/approvalLayouts",
      "listviews": "/services/data/v57.0/sobjects/Contact/listviews",
      "describe": "/services/data/v57.0/sobjects/Contact/describe",
      "quickActions": "/services/data/v57.0/sobjects/Contact/quickActions",
      "layouts": "/services/data/v57.0/sobjects/Contact/describe/layouts",
      "sobject": "/services/data/v57.0/sobjects/Contact"
    }
  },
  "recentItems": [
    {
      "attributes": {
        "type": "Contact",
        "url": "/services/data/v57.0/sobjects/Contact/0035h0000aaaa"
      },
      "Id": "0035h0000aaaa",
      "Name": "購買 花子"
    },
    {
      "attributes": {
        "type": "Contact",
        "url": "/services/data/v57.0/sobjects/Contact/0035h00001xxxxxx"
      },
      "Id": "0035h00001xxxxxx",
      "Name": "営業 次郎"
    }  
  ]
}


この記事が気に入ったらサポートをしてみませんか?