質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Mastodon

Mastodon(マストドン)は、短文投稿型SNS。サービス利用のための仮想サーバー「インスタンス」が多く存在し、サーバが一つのTwitterと比較して分散型SNSと呼ばれています。また閲覧注意ボタンがあり、タイムラインが3つ用意されていることも特徴です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

Q&A

0回答

985閲覧

OAuth2でscopeが指定すると「要求されたアクセス権は無効であるか、不明、または不正なフォーマットです。」が出る。

nanokanato

総合スコア9

Mastodon

Mastodon(マストドン)は、短文投稿型SNS。サービス利用のための仮想サーバー「インスタンス」が多く存在し、サーバが一つのTwitterと比較して分散型SNSと呼ばれています。また閲覧注意ボタンがあり、タイムラインが3つ用意されていることも特徴です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth 2.0

OAuth 2.0(Open Authorization 2.0)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

0グッド

0クリップ

投稿2017/09/19 09:28

はじめまして、どうしても詰まっており詳しい方にお聞きしたく質問させていただきます。

●やりたいこと
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が設定されていないため読み取り専用になってしまいます。
読み取り専用

今回やりたいことは書き込みなので困っています。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問