この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは植木和樹@上越妙高オフィスです。今回はPythonからSalesforceのREST APIを叩くための準備作業についての備忘録です。
ひょんなことからSalesforceへデータ投入することになりました。Salesforceへのデータ投入へはData Loaderやcliを使えばできますが、今回は元データに対して色々処理をしてからデータ投入する必要があったので、スクリプト経由で使ってみることにします。
プログラミング言語はPythonを選択しました。
Salesforce Python SDKについて
いろいろ調べてみたところ、SalesforceをPythonから叩くためのSDKは何種類かでているようです。 今回はsimple_salesforceというモジュールを使うことにしました。
採用の理由
- 現在も活発に開発が行われている
- 最初に試した htarevern/salesforce-python-sdk: Salesforce Python SDK という別モジュールと使い方が似てる
- コードが単純で裏で何してるかわかりやすかった
準備と設定
接続アプリケーションを作成
最初にSalesforceの管理画面で接続アプリケーションを作成してコンシューマ鍵(client_id)とコンシューマの秘密(client_secret)を取得しておきます。この辺はややこしいので省略してさらっと概要だけ。
- ページ右上の「設定」 → 「ビルド」セクション /作成/アプリケーション → 接続アプリケーションの「新規」から作成
- 接続アプリケーションの作成 を見ながらOAuthの設定
- アプリケーションを作成すると表示されるコンシューマの鍵と秘密をメモっておく
simple_salesforceモジュールのインストール
simple_salesforceはpipでインストールできます。環境を汚したくないのでpyenvとvirtualenvを使って実行環境配下(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とかを駆使して実装することになります。これについてはまた別の機会に。