kintone APIを使った理由
kintoneで扱っているデータで分析を行いたかったのですが、
UI上の絞り込みでは、AND
とOR
が混在するような条件での抽出ができないため、
kintone APIを使ってデータを抽出することにしました。
コード
コードの全文は以下。
import requests
import pandas as pd
import json
HOST_NAME = ''
KINTONE_APP_ID = ''
KINTONE_API_TOKEN = ''
FIELDS = []
QUERY = ''
def fetch_data():
url = f'https://{HOST_NAME}/k/v1/records/cursor.json'
app = KINTONE_APP_ID
fields = FIELDS
query = QUERY
size = 500
header = {
'X-Cybozu-API-Token': KINTONE_API_TOKEN,
'Content-Type': 'application/json'
}
# create cursor
body = {
'app': app,
'fields': fields,
'query': query,
'size': size
}
res = requests.post(url, headers=header, data=json.dumps(body))
print(res.text)
message = json.loads(res.text)
cursor_id = message['id']
# get records
records = []
has_next = True
while has_next:
res = requests.get(url, headers=header, data=json.dumps({'id': cursor_id}))
message = json.loads(res.text)
records += [
{key: item[key]['value'] for key in item}
for item in message['records']
]
has_next = message['next']
# delete cursor
res = requests.delete(url, headers=header, data=json.dumps({'id': cursor_id}))
print(res.text)
return records
def get_fields():
fields = {}
url = f'https://{HOST_NAME}/k/v1/app/form/fields.json'
header = {
'X-Cybozu-API-Token': KINTONE_API_TOKEN,
'Content-Type': 'application/json'
}
body = {
'app': KINTONE_APP_ID,
'lang': 'ja'
}
res = requests.get(url, headers=header, data=json.dumps(body))
# print(res.text)
message = json.loads(res.text)
for code, v in message['properties'].items():
fields[code] = v['label']
return fields
def save_to_csv(df, filename='data.csv'):
df.to_csv(filename, index=False)
if __name__ == '__main__':
fields = get_fields()
# print(fields)
data = fetch_data()
df = pd.DataFrame(data)
df = df[FIELDS] # 列ならびかえ
df = df.rename(columns=fields) # 列を日本語に変える
save_to_csv(df)
print("Done")
KINTONE_API_TOKEN
APIトークンの作成方法は以下のリンク先。
QUERY
クエリの書き方は以下のリンク先。
fetch_data
/k/v1/records.json
でもデータの抽出はできるのですが、欲しいデータは100,000件以上存在するため、カーソルを使う方法を選択しました。
クエリで検索した結果のレコードが100,000件以上存在するとき、絞り込みは中断されます。
その場合、レスポンスヘッダーの「X-Cybozu-Warning」に「Filter aborted because of too many search results」が追加されます。
参考
(レコードの一括取得)カーソルを作成する
(レコードの一括取得)カーソルからレコードを取得する
(レコードの一括取得)カーソルを削除する