頼まれてBOX APIを使った簡単なプログラムを作ったんですが、そのときに???な事態が起こったんでメモ。
環境
- Python 3.9.6
- boxsdk 2.12.1
起こったこと
PythonSDKを使って、指定フォルダの中身を一覧化してexcel出力したい。
なので、↓このAPIを使うことにした。
https://ja.developer.box.com/reference/get-folders-id-items/
from boxsdk import OAuth2, Client
import pandas as pd
import numpy
CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxxxxxx'
CLIENT_SECRET = 'yyyyyyyyyyyyyyyyyyyyyyyyy'
access_token = 'aaaaaaaaaaaaaaaaaaaaa' #あらかじめ取得しておいたtoken
oauth = OAuth2(
client_id = CLIENT_ID,
client_secret = CLIENT_SECRET,
access_token=access_token
)
client = Client(oauth)
items = client.folder(folder_id=0).get_items(limit=1,offset=2,sort="name")
list_in_folder = []
for item in items:
list_in_folder.append([format(item.type.capitalize()), item.name])
df = pd.DataFrame(list_in_folder)
df.to_excel('list.xlsx')
しかしいざSDKを使ってlimit, offsetを指定しても
「offset位置から残り全部を取ってくる」挙動になってしまい、limit指定が効いてない様子だった。
結論
公式への質問で指摘してるのがあった。
https://github.com/box/box-python-sdk/issues/366
これによると、APIに対してのlimit指定はできない。offset位置から全部取ってくる。
取ってきたうえでlimit指定した分だけプログラム上でページングできるみたいなことが書いてある。(多分)
ええ~~~~紛らわしい。
試しにcurlでAPI自体を叩いてみると期待通りの動きをしたので、SDKを使用せずAPIに直でアクセスするように修正した。
import pandas as pd
import requests
access_token = 'aaaaaaaaaaaaaaaaaaaaa' #あらかじめ取得しておいたtoken
url = "https://api.box.com/2.0/folders/0/items"
data = {"limit": "1", "offset":"2", "sort":"name"}
headers = {'Authorization': 'Bearer {}'.format(access_token)}
r = requests.get(url, headers=headers, params=data)
print('ステータスコード:{}'.format(r.status_code))
json_data = r.json();
items = json_data['entries']
print('総ファイル数:{}'.format(json_data['total_count']))
list_in_folder = []
for item in items:
list_in_folder.append([item['type'], item['name']])
df = pd.DataFrame(list_in_folder)
df.to_excel('list.xlsx')