この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。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を使うことで一歩前進できた気がします。