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

ここまでくれば、煮たり焼いたりできそう!

うん勉強になった。なんか作れそうな気がしてきた。

この記事が気に入ったらサポートをしてみませんか?