Pythonを使ってPardot APIからデータを取得してみた

2022.02.25

こんにちは。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を使うことで一歩前進できた気がします。