この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
チームメンバーからAlteryxでBacklogの課題をAPIを使い全件取得したいと相談を受け、Downloadツールを使ったワークフローを作成したのですが、ふとPythonツールでも出来るのではと思ったので試してみました。
Downloadツールを使ったワークフロー
Backlog APIの課題一覧は1回のリクエストで最大100件までしかデータを取得できないため、課題数を取得した後に行作成ツールでoffset値をインクリメントしたURLを作成してリクエストを行います。
データを取得した後にJSONパースや列分割、クロスタブ等で整形します。
実行結果
ネットワークやPCスペックに依存すると思いますが1.5秒で終わりました。速い。
参考
Backlog API 課題数の取得
Backlog API 課題一覧の取得
AlteryxからSalesforce PardotへのAPIアクセス
Pythonツールを使ったワークフロー
シンプルです。
コード
URLやAPIキー、プロジェクトIDの値はテキスト入力に入力した値を参照します。
Downloadツールを使用したワークフローと同様に、課題数を取得した後、offset値が課題数に達するまでリクエストをループします。
取得したデータはPandasのDataFrameとして出力することで後続のツールで参照可能です。
from ayx import Alteryx
import requests
import pandas as pd
import json
issues_count_URL = Alteryx.read("backlog_conf")['issuesCountURL'][0]
issues_URL = Alteryx.read("backlog_conf")['issuesURL'][0]
api_key = Alteryx.read("backlog_conf")['apiKey'][0]
project_id = Alteryx.read("backlog_conf")['projectId[]'][0]
params = {
'apiKey':api_key,
'projectId[]':project_id
}
count_res = requests.get(issues_count_URL,params=params)
count_json = count_res.json()
issues_count = count_json['count']
params = {
'apiKey':api_key,
'projectId[]':project_id,
'count':100,
'offset':0
}
issues_res = requests.get(issues_URL,params=params)
issues_json = issues_res.json()
issues_df = pd.json_normalize(issues_json)
i = 100
while i < issues_count:
params = {
'apiKey':api_key,
'projectId[]':project_id,
'count':100,
'offset':i
}
res = requests.get(issues_URL,params=params)
res_json = res.json()
df = pd.json_normalize(res_json)
issues_df = pd.concat([issues_df,df])
i+=100
Alteryx.write(issues_df, 1)
実行結果
10.5秒とDownloadツールを使用したワークフローと比べるとかなり遅いです。
深掘りはしませんが、
- Downloadツールは最大接続(デフォルトは2)を指定することで複数のURLに対して同時転送を行える事
- Pythonツールは結果をAlteryx.writeで出力する際に一時ファイルを作成する事
あたりが影響していそうです。
まとめ
外部APIからのデータ取得にPythonツールを使用するとワークフローはシンプルになります。
ただし処理時間が増える事があるので基本的はDownloadツールを使った方が良さそうです。