APIを叩いてBoxのフォルダの共有リンクを取得する その2 GASでフロー改善
前回記事
OAUTH2、コマンドラインだけだとキツすぎるので、GASでフローを改善してみた。
1. 認証
安全性の問題からGASから直接ブラウザページは開けないようなので、リンク付きのページを作って、そこから認証ページへ行けるようにします。やり方はここの記述を踏襲。
まず、GASの開発画面で以下のようなHTMLコードを作成。HTMLですよ!ファイル名はindex.htmlとします。
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<a href="https://account.box.com/api/oauth2/authorize?response_type=code&client_id=[Client_ID]&redirect_uri=http://localhost/">TEST</a>
</body>
</html>
次に以下のコードを適当な名前のスクリプトとして保存。
function doGet() {
return HtmlService.createHtmlOutputFromFile('index');
}
その上で、先ほどのHTMLにて右上のボタンを使って、WebAppとしてデプロイ。実行用リンクを取得します。↓こんな感じ
https://script.google.com/macros/s/AKfycbwVfRn1ofRFtAkU.....3l7QAyiWkWIukC_JnvfRVb1VzIGlmD5vRW4hDun5Tg/exec
で、リンクを踏むと、真っ白のページに飛ばされるので、ブラウザのURLから"code"を取得。これは次節で使います。
2. アクセストークン取得
function myFunction() {
let apiURL = "https://api.box.com/oauth2/token";
let payload = {
'client_id' : 'spziu5ka.....phihhnx8q6or',
'client_secret' : 'ivylfGXXbt.....ZO4R2Xn7nzcRW',
'code' : 'b8WjxHA05ObU.....MDKQgegQZ1CJS',
'grant_type' : 'authorization_code'
};
let options = {
'method' : 'post',
'payload' : payload
};
//APIにリクエストし、結果をログ出力する
let responseDataPOST = UrlFetchApp.fetch(apiURL,options).getContentText();
console.log(responseDataPOST);
}
ここで、client_id / client_secretはApp作成時から固定ですが、codeはさきほどの認証で得られたリダイレクトURLから取得してコピペします。
これを実行すると結果が
{"access_token":"6p37lfGmJj9b3Ed7dLGFqkkB","expires_in":4071,"restricted_to":[],"refresh_token":"4lq6vmo8aEQis1UzBQgx1QgIAjdFDyItPLH8jCfBxdDY7dKT6e37g","token_type":"bearer"}
こうなるので、ここからaccess_tokenを取得。頑張ればaccess_tokenだけコードで抽出することも簡単です。
3. API実行
今度はアクセストークンを使ってAPIを実行します。
function myFunction2() {
let apiURL = "https://api.box.com/2.0/folders/12349495176870?fields=shared_link";
let param = {
"access": "open",
"password": "mypassword",
"unshared_at": "2021-12-12T10:53:43-08:00",
"permissions": {
"can_download": false
}
};
let payload = {
"shared_link" : param
};
let options = {
'method' : 'put',
headers: {
'Authorization': 'Bearer [Access_Token]'
},
'payload' : JSON.stringify(payload),
'muteHttpExceptions': true
};
let responseDataPOST = UrlFetchApp.fetch(apiURL,options).getContentText();
console.log(responseDataPOST);
obj = JSON.parse(responseDataPOST)
console.log(obj.shared_link.url);
}
結果はまずは
{"type":"folder","id":"12349495176870","etag":"0","shared_link":{"url":"https:\/\/xxx.box.com\/s\/yrtuvbwe7bwzwrbbdoaakc","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}}}
こんな感じの文字列ですが、これをJSON.parseに通してJSON->オブジェクト変換して、shared_link内のurlの部分だけ取ってくると、こんな感じに作成したリンクだけを抽出することができます。
https://xxx.box.com/s/yrtuvbwe7bwzwrbbdoaakc
ここまでくれば、煮たり焼いたりできそう!
うん勉強になった。なんか作れそうな気がしてきた。