APIを叩いてBoxのフォルダの共有リンクを取得する
この記事に対するレスポンス。整形は後にして、とりいそぎ超特急で書きましたが、画像とかを追加しました。
Boxの開発者コンソールでの設定
1. Boxページの左下から開発者コンソールへアクセスし、そこで新規Appを作成する。
種類はカスタムアプリ。
認証方式を聞かれるが、今回の目的ではOAuth 2.0を選択。で青い作成ボタンを押す。
2. MyAppの中のConfiguration内を見て設定をチェックしていく。
・上から見ていくとOAuth 2.0 Credentials のところに、エンコードされた文字列がある。これがClient ID。その下に「Secretを取得」があればクリックして、似たような文字列を取得する。こちらはClient Secret。どちらも使うのでコピっておくが、一般には公開しないように管理する。
・Redirect URLは http://localhost/ でOK。
・Application ScopesでOAuthのプロセスで取得する権限を調整しておく。ここでは書き込み権限(2番目)をクリックしておけばよい。たぶん。
・最後に右上にある青い"Save"ボタンを押すのを忘れない。
3. APIを発動するまでがなかなか遠い。処理の流れとしては、
a) oauth2 authorizationを行う。Client IDとブラウザでの認証を使って"code"を取得する。
b) アクセストークンを取得する。Client ID、Secret、codeが必要。
ここで取得するアクセストークンを持っていれば、期間中は大事な情報を使って認証をせずともこのトークンだけでAPIをたたけるようになる。アクセストークンが期限切れ(expire)した場合、リフレッシュトークンで新しいアクセストークンを取得できるのだが、今回は単発処理のはずだから、まあいいでしょう。
c) アクセストークンを使ってAPIを叩く
OAuth2 Authorization
次のURLにブラウザでアクセスする。ここで[CLIENT_ID]を自分のClient IDに入れ替える。[]も空白もなくきっちり入れ替えないと動かない。
https://account.box.com/api/oauth2/authorize?response_type=code&client_id=[CLIENT_ID]&redirect_uri=http://localhost/
するとブラウザに認証画面が現れるので、認証する。必要ならBoxへのログインもする。
アクセスを承認すると、ブラウザがlocalhost(自分のPCをサーバーと見立てたアドレス)にリダイレクトされる。ローカルでWebサーバーが走っていなければ接続エラーになるが問題ない。本来であれば、ここで自分のアプリが動いており、このコードをすくい上げて自動処理するのであろうが、いまは手動でやるので、このURLからコードを抽出し、別の場所にコピーペーストして保管する。
アクセストークンの取得
さてここまで出来たら、token取得のURLを叩いて、その結果帰ってくる情報を受け取らないと行けない。ここではcurlコマンドを使う。
curl -i -X POST "https://api.box.com/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=[CLIENT_ID]" \
-d "client_secret=[CLIENT_SECRET]" \
-d "code=[CODE]" \
-d "grant_type=authorization_code"
ここで[CLIENT_ID]と[CLIENT_SECRET]はBoxの設定の時に取得した物にきっちり入れ替える。(空白も[]も残してはダメ)
[CODE]は先ほどの認証で取得した奴を使う。
うまくいくとこんなのが帰ってくる。
{"access_token":"kZ00wOUfe9ZSd4vyWPzoyJID2154321","expires_in":4112,"restricted_to":[],"refresh_token":"Tq5sMWbRaZNy5ir9UAo0Eb4tWQAtJgpo5Bh5DeqEaxeG1FnkjCDwTd91gi00000","token_type":"bearer"}%
この一番最初のがアクセストークンなので、コピペしておく。
このコマンドで失敗すると、もうCodeは有効でなくなってしまうようで、2度目のアクセスはできなかった。なので、うまく行かなかったら、先の「認証」と「トークン取得」は連続でやる方が良い。
WindowsでもCurlは利用できるようである。
Box APIを発動させる
アクセストークンを手に入れたら権限内の作業ができるようになる。ただし、時間が経つと消滅してしまう(上記の例では4112秒なのかな?)。
今回の場合、すでに準備してあるフォルダにWeb共有リンクをパスワード付きで発行すると言うことにする。APIの説明はこちら
あらかじめ対象のフォルダのIDは調べておく。きちんとしたやり方はあると思うが、今回は単純にそのフォルダに行ってURLを調べた。
https://xxxx.app.box.com/folder/12349495176870
この場合12349495176870がそのフォルダのIDである。このフォルダに共有リンクを付与する。
curl -i -X PUT "https://api.box.com/2.0/folders/12349495176870?fields=shared_link" \
-H "Authorization: Bearer [ACCESS TOKEN]" \
-d '{
"shared_link": {
"access": "open",
"password": "mypassword",
"unshared_at": "2021-12-12T10:53:43-08:00",
"permissions": {
"can_download": false
}
}
}'
この場合、パスワードはmypassword。省略もできる。Expire Dateも設定可能。帰ってくる文字列はつぎのようになっている。(うわ、みにくい)
{"type":"folder","id":"12349495176870","etag":"0","shared_link":{"url":"https:\/\/xxxx.box.com\/s\/yrtuvbwe73rs7ln12i6bwzwrbb43210","download_url":null,"vanity_url":null,"vanity_name":null,"effective_access":"open","effective_permission":"can_preview","is_password_enabled":true,"unshared_at":"2021-12-12T10:53:43-08:00","download_count":0,"preview_count":0,"access":"open","permissions":{"can_preview":true,"can_download":false}}}%
ここで得られた
https:\/\/xxxx.box.com\/s\/yrtuvbwe73rs7ln12i6bwzwrbb43210
の\/のエスケープを取り除いて\にしたものが共有リンクである。
実用上は
これだけやってようやくフォルダひとつ共有にして、しかもURLは手動でしか得られていないので、メールに貼り付けてとか辛すぎ…
なのでこれをGAS / google spreadsheet / gmailと組み合わせるのが吉である。アクセストークンの取得まではまあ手動でやってもOKでしょう。
そのアクセストークンを使ったAPIの利用と返り値の処理、それをスプレッドシートで管理し、GMAILに貼り付ける部分はGASでできるでしょう。
GASでやる方法についてはこのリンクが良い感じです。
今日のところは以上で。