背景
仕事でBOXに自動アップロードをするツールを作成しました。その時に詰まったところが何点かあったのでまとめようと思いました。
開発環境
MacOS
Python 3.11.2
Vscode
認証方式
JWT認証
手順
BOX側で行うこと
1.BOXの開発者ページへ移動
参考にしたサイト
https://ja.developer.box.com/guides/tooling/sdks/python/
2.アプリの新規作成⇒カスタムアプリを選択
3.アプリ名・目的を入力(必須)
4.サーバー認証(JWT使用)を選択
5.構成タブのアプリアクセスレベルを"アプリ+Enterpriseアクセス"を選択⇒変更を保存
6.組織に属している場合は承認タブの確認して送信を選択
Enterpriseアクセスの場合、これが承認されないとAPIが使えない
7.承認されているか確認
8.構成タブの公開キーの追加と管理⇒公開/秘密キーペアを生成
ボタン押下すると自動でJSONファイルがダウンロードされる。
後々のためにファイル名を"config.json"に変更しておく。
9.対象BOXへ編集者権限
APIアカウントについて対象BOXの編集者権限を与える。APIアカウントの情報は一般設定タブのService Account IDを参考にする。
サンプルコードの作成手順
1.必要ライブラリのインストール
pip install boxsdk
pip install "boxsdk[jwt]"
2.APIが使えるか下記コードで確認する。
box_test.py
from boxsdk import JWTAuth
from boxsdk import Client
from boxsdk.exception import BoxAPIException
#jsonファイルのパス
CONFIG_FILE = '/configファイルのパス/config.json'
#BOX APIを使う準備
auth = JWTAuth.from_settings_file(CONFIG_FILE)
client = Client(auth)
# ユーザー情報を取得して表示(APIテスト)
user = client.user().get()
print(f'UserName:{user.name}(ID:{user.id}), Email: {user.login}')
3.自動化処理を実装して検証を行う。
※BOX上に存在するファイルに対して新規アップロードをするとエラーを起こす仕様。
box_upload.py
# 必要なライブラリをインポートします。
from boxsdk import JWTAuth
from boxsdk import Client
from boxsdk.exception import BoxAPIException
#jsonファイルのパス
CONFIG_FILE = '/configファイルのパス/config.json'
#BOX APIを使う準備
auth = JWTAuth.from_settings_file(CONFIG_FILE)
client = Client(auth)
#親フォルダのID。フォルダIDはBOX上のフォルダページのURLの末尾の数字
folder_id = '12桁のフォルダID'
#上書きするファイルのID。ファイルIDがBOX上のファイルページのURLの末尾の数字
file_id = '12桁のファイルID'
#Boxのフォルダ内のファイルを取得します。
box_items = client.folder(folder_id).get_items()
box_files = []
for item in box_items:
box_files.append(item.name)
#BOXフォルダ内のファイル名とアップロードするファイル名を比較して一致していれば上書き、
#一致していなければ新規アップロードをする処理をここに書く(あらかじめ辞書を作成して実装した)
#今回は省略
#上書き
try:
updated_file = client.file(file_id).update_contents('ファイルパス')
except BoxAPIException:
print('上書きできませんでした。ファイルIDがあっているか確認してください。')
#新規アップロード
try:
box_file = client.folder(folder_id).upload('ファイルパス')
except BoxAPIException:
print('アップロードできませんでした。')