2
2

kintone APIを使ってデータを抽出する

Posted at

kintone APIを使った理由

kintoneで扱っているデータで分析を行いたかったのですが、
UI上の絞り込みでは、ANDORが混在するような条件での抽出ができないため、
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トークンの作成方法は以下のリンク先。

APIトークンの作成

QUERY

クエリの書き方は以下のリンク先。

クエリの書き方

fetch_data

/k/v1/records.jsonでもデータの抽出はできるのですが、欲しいデータは100,000件以上存在するため、カーソルを使う方法を選択しました。

複数のレコードを取得する

クエリで検索した結果のレコードが100,000件以上存在するとき、絞り込みは中断されます。
その場合、レスポンスヘッダーの「X-Cybozu-Warning」に「Filter aborted because of too many search results」が追加されます。

参考

(レコードの一括取得)カーソルを作成する
(レコードの一括取得)カーソルからレコードを取得する
(レコードの一括取得)カーソルを削除する

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2