はじめまして、どうしても詰まっており詳しい方にお聞きしたく質問させていただきます。
●やりたいこと
GoogleAppScriptにてMastodonAPIと連携し、投稿したい。
●ソース
var DOMAIN = 'https://mstdn.jp/'; var SERVICE_NAME = 'Mastodon'; var SCOPE = ['read','write','follow']; /*------------------------------------* * とりあえず連携するまでやっている途中 *------------------------------------*/ function myFunction() { var response = {}; //Authorizationの取得 var Mastodon = new GetService(); if (Mastodon == null) { response = {"errors":[{"message":"Service is null.","code":0}]}; } else { if (Mastodon.errors == null) { if (Mastodon.hasAccess()) { var apiOptions = { headers : { Authorization: 'Bearer ' + Mastodon.getAccessToken() }, method: 'get', payload: { status:'test message'} }; var responseApi = UrlFetchApp.fetch( DOMAIN+'/api/v1/statuses', apiOptions ); if (res == null) { } else { var content = res.getContentText(); if (content != null) { var json = JSON.parse(content); if (json != null) { } } } } else { var authorizationUrl = Mastodon.getAuthorizationUrl(); response = {"errors":[{"message":"Please login to Mastodon: "+authorizationUrl,"code":0}]}; Logger.log('Please login to Mastodon: %s', authorizationUrl); } } else { response = Mastodon.errors; } } return response; } /*------------------------------------* * OAuth認証情報の取得 *------------------------------------*/ function GetService() { var apps = Apps_(); if (apps == null) { return {'errors':[{'message':'Apps is null','code':0}]}; } else if (apps.errors == null) { return OAuth2.createService(SERVICE_NAME) .setAuthorizationBaseUrl(DOMAIN+'/oauth/authorize') .setTokenUrl(DOMAIN+'/oauth/token') .setClientId(apps.client_id) .setClientSecret(apps.client_secret) .setScope(SCOPE,' ') .setCallbackFunction('AuthCallback') .setPropertyStore(PropertiesService.getUserProperties()); } else { return apps.errors; } } /*------------------------------------* * OAuth認証情報の初期化 *------------------------------------*/ function ClearService() { CacheService.getPublicCache().put('apps_'+SERVICE_NAME,null); OAuth2.createService(SERVICE_NAME) .setPropertyStore(PropertiesService.getUserProperties()) .reset(); } /*------------------------------------* * コールバックの受け取り *------------------------------------*/ function AuthCallback(request) { var Mastodon = GetService(); if (Mastodon == null) { return HtmlService.createHtmlOutput('エラー発生、ブラウザを閉じても大丈夫です。\nService is null.'); } else { if (Mastodon.errors == null) { var isAuthorized = Mastodon.handleCallback(request); if (isAuthorized) { return HtmlService.createHtmlOutput('認証成功、ブラウザを閉じても大丈夫です。'); } else { return HtmlService.createHtmlOutput('認証失敗、ブラウザを閉じても大丈夫です。'); } } else { return HtmlService.createHtmlOutput('エラー発生、ブラウザを閉じても大丈夫です。\n'+Mastodon.errors[0].message); } } } /*------------------------------------* * コールバックURLの作成 *------------------------------------*/ function CallbackURL_() { var scriptURL = 'https://script.google.com/macros/d/'+ScriptApp.getScriptId()+'/usercallback'; return scriptURL; } /*------------------------------------* * アプリケーションの作成 *------------------------------------*/ function Apps_(){ var json = {}; var content_cache = CacheService.getPublicCache().get('apps_'+SERVICE_NAME); if (content_cache != null && content_cache != '') { if (toString.call(content_cache) == '[object String]') { try { json = JSON.parse(content_cache); } catch (e) { } } } if (json == null || json.client_id == null || json.client_secret == null) { json = {}; var options = { method:'post', payload:{ client_name:'ELEMastodon', redirect_uris:CallbackURL_(), scope:SCOPE.join(' '), website:'http://madgenius.hateblo.jp/' } }; var response = UrlFetchApp.fetch(DOMAIN+'/api/v1/apps', options); if (response == null) { json = {'errors':[{'message':'Response is null','code':0}]}; } else { var content = response.getContentText(); if (content != null && toString.call(content) == '[object String]') { json = JSON.parse(content); if (json.client_id != null && json.client_secret != null) { CacheService.getPublicCache().put('apps_'+SERVICE_NAME,content); } else { json = {'errors':[{'message':'No data necessary for response','code':0}]}; } } } } return json; }
OAuth2というライブラリを使用しています。
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
●エラーが発生している場所
myFunction()から実行し、Apps_()でアプリケーションを作成、「Mastodon.getAuthorizationUrl();」で認証用のURLを生成までは一応動いているように見えます。
その認証用のURLにアクセスすると「要求されたアクセス権は無効であるか、不明、または不正なフォーマットです。」という表示になってしまいます。
GetService()の.setScope(SCOPE,' ')の部分でSCOPEを設定しているつもりです。
この設定部分をコメントアウトすると通常の認証画面になりますが、SCOPEが設定されていないため読み取り専用になってしまいます。
今回やりたいことは書き込みなので困っています。
よろしくお願いいたします。
あなたの回答
tips
プレビュー