GASを使用したMastodon自動投稿

Mastodonアイキャッチ Uncategorized
Mastodonアイキャッチimg

ローカルでMastodonにAPIを使ってトゥートすることはできたけど、できれば、常時稼働しているサーバー上で実行したいと欲が出てきました。インターネットにサーバーを構築後、運用するにはセキュリティの観点でめんどくさいのと、自分のPCで実行する場合は、PCを常時起動しておかなければいけないので大変だなと思い、Google Apps Script(以降GASと省略)を使ってみようと思い立ちました。また、できれば自動投稿したいとも考えて、あらかじめ投稿内容をスプレッドシートに記載しておき、1行ごとにトゥートすることを目指しました。

Mastodonアクセストークンの取得

アクセストークンは、最初、APIを使用して取得しなければいけないと考えていましたが、Mastodon画面から取得できることがわかりました。以下手順です。

左下の「開発」を押します。

mstdn_get_access_token_20230111_01_03

右上の「新規アプリ」を押します。

mstdn_get_access_token_20230111_02_01

アプリの名前を入力します。

アプリの名前は必須事項なので入力が必要ですが、それ以外のアプリのウェブサイトやリダイレクトURIはそのままで大丈夫です。

mstdn_get_access_token_20230111_03_01

今回アプリの名前は「GAS_toot_test」としました。

mstdn_get_access_token_20230111_04_01

下の方にスクロールすると、このアプリのアクセス権の設定選択画面になります。必要に応じてアクセス権を付与してください。今回はデフォルトにしました。

mstdn_get_access_token_20230111_05_01

最後までスクロールしたら「送信」を押します。

mstdn_get_access_token_20230111_06_01

アプリが作成されます。アプリ名(今回は「GAS_toot_test」)部分を押します。

mstdn_get_access_token_20230111_07_01

アクセストークン等の情報が表示されるので、アクセストークン情報をコピーしておきます

※注意 こちらの画面に記載されている通り、ここに記載されている情報は、ほかに漏らさないようにしてください。

mstdn_get_access_token_20230111_08_01

これでアクセストークンの取得ができました。

(GASから実行するための)トークン情報の保存

GASのコード内にアクセストークンを入力しても良いのですが、セキュリティ上ほかに記載することにします。スクリプトプロパティを使用します。スクリプトプロパティの設定手順を記載します。

GASを作成します。いくつか方法はあると思いますが、Googleドライブから下記の画面のように「Google Apps Script」を選択します。

mstdn_GAS_test_20230111_01_02

歯車アイコンを押します。

mstdn_GAS_test_20230111_02_01

「プロジェクトの設定」を押します。

mstdn_GAS_test_20230111_03_02

プロジェクトの設定が表示されたら、下の方にスクロールします。

mstdn_GAS_test_20230111_04_01

「スクリプトプロパティを追加」を押します。

mstdn_GAS_test_20230111_05_01

「プロパティ」にはGASで読み込む際のプロパティ名を記載します。例として今回はmstdn_tokenとしました。この値を変更する場合はGASのコードの該当部分も修正する必要があります。ご注意ください。

「値」には「Mastodonのアクセストークン」を入力します。

「プロパティ」と「値」が入力出来たら「スクリプトプロパティを保存」を押します。

mstdn_GAS_test_20230111_07_01

保存されたことを確認します。

mstdn_GAS_test_20230111_08_01

(GASから読み込む)投稿記事のスプレッドシートの作成

GASから読み込んで、Mastodonにトゥートする内容を記載したスプレッドシートを作成します(例としてスプレッドシート名を「mstdntoot_file」とします)。

作成したスプレッドシートに下記2つのシートを用意します。シート名は例になります。ご自身の環境に合わせて変更してください(ただし、スプレッドシートのファイル名やシート名を変更した場合は、GAS内のコードを修正する必要がありますのでご注意ください)。

「toot_text」:トゥートする内容を記載したシート

「value_set」:最後にトゥートした行を記録しておくためのシート

例えばスプレッドシートに記載した内容を毎日1投稿することを考えた時に、GASのトリガーを使用することになると思います。前回実行した情報をスクリプト内に記録しておくことができないようなので、外部に記録することにしました。外部に記憶するときに、スクリプトプロパティ上に記録することもできるのですが、今回はスプレッドシートの「value_set」シートのセルに何行目まで実行したかの数値を記録することにしました。「value_set」シートの値を見ることで、上から何行目までトゥートしたかわかるので、こちらを採用しました。当然、この値を書き換えることで、再度1行目からトゥートしなおすことも可能です。

具体的なGASのコード

具体的なGASのコードは下記になります。3つの関数からなっています。

  1. mstdntoot関数:アクセストークンの取得、トゥートするテキストの取得、APIを使用したトゥート、結果のメール通知
  2. text_get関数:スプレッドシートやシートの存在確認、トゥートする行数を取得しテキストがあった場合は、テキストを取得、その後行数を1増やす
  3. send_mail関数:スクリプト実行結果を指定のメールアドレスに通知
function mstdntoot() {
  // アクセストークンをスクリプトプロパティから取得
  var token = PropertiesService.getScriptProperties().getProperty('mstdn_token');

  // 投稿内容取得
  var toot_text = text_get();

  //トゥートするメッセージがなかった時の処理
  if (toot_text == 'no_file') {
      no_file_msg = 'ファイルなし'
      //ファイルがないことを指定のメールアドレスにメール送信
      send_mail(no_file_msg);
      //処理の終了
      return false;
    }else if(toot_text == 'no_sheet'){
      no_sheet_msg = 'シートなし'
      //カウントがないことを指定のメールアドレスにメール送信
      send_mail(no_sheet_msg);
      //処理の終了
      return false;
    }else if(toot_text == 'no_count'){
      no_count_msg = 'カウントなし'
      //カウントがないことを指定のメールアドレスにメール送信
      send_mail(no_count_msg);
      //処理の終了
      return false;
    }else if(toot_text == 'none') {
      no_post_msg = '本日投稿なし'
      //投稿がないことを指定のメールアドレスにメール送信
      send_mail(no_post_msg);
      //処理の終了
      return false;
  };

  // post用URL生成
  var posturl = 'https://mstdn.jp/api/v1/statuses';

  // POSTで送る(JSON形式)
  var data = {
    'access_token': token,
    'status': toot_text
  };

  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    // Convert the JavaScript object to a JSON string.
    'payload' : JSON.stringify(data)
  };

  UrlFetchApp.fetch(posturl, options);
  //トゥートした内容を指定のメールアドレスにメール送信
  send_mail(toot_text);

}

function text_get() {

  // スプレッドシート名:mstdntoot_file の取得
  var files = DriveApp.getFilesByName('mstdntoot_file');

  //スプレッドシートの存在確認
  if (files.hasNext()) {
    var spreadsheet = SpreadsheetApp.open(files.next());
    var check_sheet1 = spreadsheet.getSheetByName('value_set');
    var check_sheet2 = spreadsheet.getSheetByName('toot_text');

    if(!check_sheet1 || !check_sheet2){
      return_toot = 'no_sheet'
    }else{
      var countsheet = spreadsheet.getSheetByName('value_set');
      var count = countsheet.getRange("A1");
      //カウントの数字があるかの確認
      if (count.isBlank()) {
          //console.log('カウントなし')
          return_toot = 'no_count'
      }else{
        var int_count = parseInt(count.getValues())
        var text_sheet = spreadsheet.getSheetByName('toot_text');
        var get_text = text_sheet.getRange(int_count, 1);
        //トゥートするテキストの確認
        if (get_text.isBlank()) {
          //console.log('トゥートするテキストなし')
          return_toot = 'none'
        }else{
          var return_toot = get_text.getValue();

          //トゥートするテキストを取得した後、カウントを1増やす(次の行を指定する)
          int_count = int_count + 1;
          countsheet.getRange("A1").setValue(int_count);

          //next_count = countsheet.getRange("A1").getValues();
          //console.log(next_count);
        };
      };
    
    };

  }else{
      //console.log('トゥートするファイルなし')
      return_toot = 'no_file'
  };

  return return_toot;

}

function send_mail(mail_msg){

  //メール内容
  var to_mail_address = "xxx@example.jp"; // 宛先メールアドレス
  var subject = "mstdn toot result"; // 件名
  var body = mail_msg; // 本文

 //送信
  MailApp.sendEmail(to_mail_address, subject, body);
  
}

このスクリプトを保存・実行する際に各種権限の許可を求められますので、内容を確認し、許可してください。

定期的に自動でMastodonへ投稿するための準備

「toot_text」シートのA列にトゥートする内容を上から入力してください。

「value_set」シートのA1セルに「1」を入力してください(「toot_text」シートの1行目から順に投稿します)。

このスクリプトの左側にある時計マークの「トリガー」を選択して、希望の日にち、時間を指定してタイマーをセットしてください。「toot_text」シートのA列にテキストがあれば、自動的に投稿されます。

参考になれば幸いです。

コメント

タイトルとURLをコピーしました