Pythonを使ってPardot APIからデータを取得してみた
こんにちは。CRMチームのosamです。
Pardotのプロスペクトのデータをクレンジングするにあたり、Pardotの画面UIのエクスポート機能では取得できない項目の値が必要となった為、Pythonを使いPardot APIからデータを取得してみました。
(関連記事こちらもどうぞ 【Pardot】Alteryxのおかげでデータクレンジングが捗った話)
前提
- SalesforceとPardotを接続する接続アプリケーションの設定は完了しているものとします。
- Pardot APIはVersion 5を使用しています。 (外部リンク Pardot API Version 5 Overview)
環境
- Python 3.8.9
- requests 2.27.1
- pandas 1.4.1
Pardot APIへのリクエスト
アクセストークンの取得
Salesforceで認証を行いアクセストークンを取得します。
認証情報はJSONファイルにまとめて記述しておき、そこから取得した値をパラメータに指定してSalesforceの認証用URLへPOSTリクエストを実行します。
import json import csv import requests import pandas as pd conf_open = open('sf_conf.json', 'r') sf_conf = json.load(conf_open) sf_url = 'https://login.salesforce.com/services/oauth2/token' payload = { 'grant_type': 'password', 'client_id': sf_conf['client_id'], 'client_secret': sf_conf['client_secret'], 'username': sf_conf['username'], 'password': sf_conf['password'] } sf_res = requests.post(sf_url,params=payload) access_token = sf_res.json()['access_token']
プロスペクトデータの取得
取得したアクセストークンとJSONファイルに記述してあるPardotのビジネスユニットIDをヘッダに指定します。
headers = { 'Authorization':'Bearer ' + access_token, 'Pardot-Business-Unit-Id':sf_conf['Pardot-Business-Unit-Id'] }
出力する項目の一覧をリストで作成し、カンマ区切りで連結してパラメータに指定します。
今回はバウンス関連の項目を指定します。
fields = ['id','isEmailHardBounced','emailBouncedAt','emailBouncedReason'] params = { 'fields':','.join(fields) }
プロスペクトを取得するクエリを実行します。
ヘッダとパラメータを指定してPardot APIのURLへGETリクエストを行います。
pdt_url = 'https://pi.pardot.com/api/v5/objects/prospects' pdt_res = requests.get(pdt_url,headers=headers,params=params)
下記のようなJSON形式のレスポンスデータが返ってきます。
{ "nextPageToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "nextPageUrl": "https://pi.pardot.com/api/v5/objects/prospects? fields=id,isEmailHardBounced,emailBouncedAt,emailBouncedReason&nextPageToken=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "values":[ { "id": 10000001, "emailBouncedAt": null, "emailBouncedReason": null, "isEmailHardBounced": null }, { "id": 10000002, "emailBouncedAt": null, "emailBouncedReason": null, "isEmailHardBounced": null }, { "id": 10000003, "emailBouncedAt": null, . . . } ] }
プロスペクトのデータが格納されているvaluesのリストをpandasのDataFrameに変換します。
pdt_json = pdt_res.json() pdt_df = pd.json_normalize(pdt_json['values'])
全件の取得
Pardot APIの仕様で1回のクエリで返されるデータは200件までとなっています。
nextPageUrlのURLへGETリクエストを実行する事で次の200件を取得することができるので、nextPageUrlの値がnullを返すまでGETリクエストとDataFrameへの追加を繰り返します。
while pdt_json['nextPageUrl'] is not None: np_url = pdt_json['nextPageUrl'] np_res = requests.get(np_url,headers=headers) pdt_json = np_res.json() np_df = pd.json_normalize(pdt_json['values']) pdt_df = pd.concat([pdt_df,np_df])
ファイル出力
最後にDataFrameをCSVファイルに出力して終了です。
pdt_df.to_csv("Output.csv", encoding='utf-8', index=False, quotechar='"', quoting=csv.QUOTE_ALL)
注意事項
Pardot APIは1日当たりのリクエスト数に制限があり、エディションごとに制限値が異なります。
例えば10万件のプロスペクトデータを取得する為には500リクエストを消費することになるので、リクエスト数が制限に達しないよう注意してください。
(外部リンク Pardot API の使用に関する考慮事項)
最後に
PardotにはSalesforceのデータローダのような便利なツールがないため、データクレンジングに際してどうしようか悩んでいましたが、Pardot APIを使うことで一歩前進できた気がします。