simple_salesforceを使ってPythonからSalesforceのREST APIへアクセスしてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹@上越妙高オフィスです。今回はPythonからSalesforceのREST APIを叩くための準備作業についての備忘録です。

ひょんなことからSalesforceへデータ投入することになりました。Salesforceへのデータ投入へはData Loaderやcliを使えばできますが、今回は元データに対して色々処理をしてからデータ投入する必要があったので、スクリプト経由で使ってみることにします。

プログラミング言語はPythonを選択しました。

Salesforce Python SDKについて

いろいろ調べてみたところ、SalesforceをPythonから叩くためのSDKは何種類かでているようです。 今回はsimple_salesforceというモジュールを使うことにしました。

採用の理由

準備と設定

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

最初にSalesforceの管理画面で接続アプリケーションを作成してコンシューマ鍵(client_id)コンシューマの秘密(client_secret)を取得しておきます。この辺はややこしいので省略してさらっと概要だけ。

  • ページ右上の「設定」 → 「ビルド」セクション /作成/アプリケーション → 接続アプリケーションの「新規」から作成
  • 接続アプリケーションの作成 を見ながらOAuthの設定
  • アプリケーションを作成すると表示されるコンシューマの鍵と秘密をメモっておく

20160607_salesforce-rest-api-python001

20160607_salesforce-rest-api-python002

simple_salesforceモジュールのインストール

simple_salesforceはpipでインストールできます。環境を汚したくないのでpyenvvirtualenvを使って実行環境配下(lambda)にモジュールをインストールします。

$ pyenv install 2.7.11
$ mkdir ~/sfproject
$ cd ~/sfproject
$ pyenv local 2.7.11

$ pip install virtualenv
$ virtualenv lambda
$ source lambda/bin/activate

$ cat > requirements.txt
requests
simple_salesforce

$ pip install -r requirements.txt

これでsimple_salesforceのバージョン0.68.2がインストールされます。

動作確認

Salesforce接続用設定ファイル

以下の内容でSalesforceに接続するための設定ファイルを作っておきます。今回はユーザークレデンシャルを使った認証・認可をしています。サンドボックスにログインする場合はユーザー名とアクセストークンのURLが変わってくるので注意。

client_id     = "<コンシューマの鍵>"
client_secret = "<コンシューマの秘密>"
username      = "<SalesforceのログインID>"
password      = "<Salesforceのパスワード>"
sandbox       = False
access_token_url = 'https://login.salesforce.com/services/oauth2/token'

if sandbox:
    username="<SalesforceのログインID>.<サンドボックス名>"
    access_token_url = 'https://test.salesforce.com/services/oauth2/token'

動作確認Pythonスクリプト

設定ファイルを作ったら動作確認してみましょう。以下のファイルをsf_describe_objects.pyという名前で保存します。Salesforceのオブジェクト一覧を表示してくれます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from simple_salesforce import Salesforce
import requests

#--------------------------------------------------------------------------------
# 初期化処理
#--------------------------------------------------------------------------------
sf_conf = {}
execfile("salesforce.conf", sf_conf)

#--------------------------------------------------------------------------------
# クラス・関数宣言
#--------------------------------------------------------------------------------
def lambda_handler(event, context):
    """
    SalesforceにOauth2を使ってログインし、オブジェクト一覧を表示します
    """
    access_token_url = sf_conf["access_token_url"]
    data = {
             'grant_type': 'password',
             'client_id' : sf_conf["client_id"],
             'client_secret' : sf_conf["client_secret"],
             'username'  : sf_conf["username"],
             'password'  : sf_conf["password"]
           }
    headers = { 'content-type': 'application/x-www-form-urlencoded' }
    response = requests.post(access_token_url,data=data,headers=headers)
    response = response.json()
    if response.get('error'):
        raise Exception(response.get('error_description'))

    session = requests.Session()
    sf = Salesforce(instance_url = response['instance_url'],
                    session_id=response['access_token'],
                    sandbox=sf_conf["sandbox"],
                    session=session)

    result = sf.describe()
    if len(result['sobjects']):
        for record in result['sobjects']:
            print u"%s: %s" % (record['name'], record['label'])

# メイン関数
if __name__ == "__main__":
    lambda_handler({}, {})

実行結果

スクリプトを実行してみます。

$ chmod +x ./sf_describe_objects.py
$ ./sf_describe_objects.py
AcceptedEventRelation: 参加行動リレーション
Account: 顧客
AccountContactRole: 顧客責任者の役割
AccountFeed: 取引先フィード
AccountHistory: 顧客履歴
AccountPartner: 顧客パートナー
AccountShare: 取引先の共有
ActivityHistory: 活動履歴
AdditionalNumber: 追加ディレクトリ番号
:
:

オブジェクトの一覧が表示されれば成功です!

まとめ

ひとまずsimple_salesforceモジュールを使ってログインするところまで確認できました。このモジュールを使えば、INSERT/UPDATE/Upsert/DELETEの他、SOQLを使ったレコードの検索などもできます。

さて、PythonからSalesforceへアクセスできるようになりましたが、実際の処理ではSOQLとかを駆使して実装することになります。これについてはまた別の機会に。

参考資料