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

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

ただいまの
回答率

90.52%

  • Google Apps Script

    844questions

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

  • OAuth 2.0

    85questions

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

  • Mastodon

    13questions

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 472

nanokanato

score 1

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    844questions

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

  • OAuth 2.0

    85questions

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

  • Mastodon

    13questions