手元のPCから定期的にMasotodonへランダムに呟く

はじめに

最近ホスティングサービスなどで自分のMastodonサーバーを作られた方が、ご自身の作品を定期的に投稿できるBotを作られようとしていたのがこの記事を書くきっかけ。

その方は以下のるびまの記事を元にAWS Lambdaで定期実行をさせようとしていたんだけど、記事の内容はRuby 2.5とすでにLambdaではサポートされていないバージョンだった。 ちなみに僕の書いた記事だったりするので世間は広いようで狭い。

magazine.rubyist.net

しかも、Lambdaが現在サポートしているRubyのバージョンは2.7のみ。

docs.aws.amazon.com

さらにRuby 2.7は今年2023年3月に最終リリースがされており、セキュリティパッチなどは今後リリースされない状況。

www.ruby-lang.org

また記事中のMastodon APIを利用できるgemはRuby 2.7以降は動作しないという.......。

github.com

一応、これも僕のほうでだいぶ前にPRを投げているんだけどまだマージされていない状況。

github.com

ソースコードからビルドすれば問題はないけど、ホスティングサービスを使ってMastodonサーバーを建てられた方には中々に厳しい道のり......。

というわけで簡単に定期投稿Botを作れないか調査して、使えるようにしたのがこの記事になります。

作ったもの

n8nというコードをあまり書かずに色々なAPIやサービスのピタゴラスイッチを作れるものをベースにMastodonへと定期投稿できるようにしてみました。

n8n.io

で、以下のようなワークフローを作成した感じです。

  • Schedule Trigger で定期的に実行するインターバルを設定し、Read Binary File でPC内のCSVファイルを読み取る。
  • で、Spreadsheet Fileでバイナリとして読み込んだCSVをテキストに変換し、Codeで簡単なコードを追加してランダムに投稿内容を選択。
  • 最後にHTTP Requestで定期的に投稿を投げたいサーバーへリクエストを投げる。

という感じのワークフローになっています。

作り方

n8n のインストール

まずはn8nをPCにインストールします。 以下のリンクから利用しているOSに合わせてインストール用の実行ファイルをダウンロードします。

docs.n8n.io

実行ファイルをダウンロード後、インストールしましょう。

CSVの作成

以下のようなCSVを作成します。

text,
てすと,
テスト,
あり,
HALO,

今回はテキストだけを投稿する想定で進めます。 (たんに画像付きの場合どうすればいいかが思いつかなかっただけとも言います......)

この後CSVファイルの保存場所までのパスを利用するので、CSVファイル作成をパスをひかえておきましょう。

Botの作成

ワークフローの作成

まずは以下の画面からワークフローを追加します。

すると以下のような画面に切り替わります。

インストールしたばかりだと上のような画面になっているのでワークフローの追加は不要かもしれないので注意してください。

Schedule Triggerを設定

次にSchedule Triggerを追加します。

先ほどの画像内の「Add first step....」をクリックすると以下のような画面に変化します。 追加する処理を検索できるようになっている感じです。

「Search nodes....」と書かれているところに「Schedule Trigger」と入力すると以下のようにSchedule Triggerが表示されるので、それをクリックします。

クリック後、以下のような画面に切り替わります。

あとは以下のようにTrigger Intervalなどを設定します。

最後に「Execute node」をクリックするとワークフローにSchedule Triggerが追加されます。 「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

すると以下のような画面になっているかと思います。

これでSchedule Triggerは追加できました。

Read Binary Fileの設定

次に先ほどの画像のSchedule Triggerの先についている「+」をクリックします。

すると先ほど同様に追加する処理を検索できるようになるので「Read Binary File」を検索します。

ここで気を付けてほしいのが「Read Binary Files」ではなく「Read Binary File」を必ず選択してください。 今回は複数のファイルを読み込むわけではないので単数形のほうを選択します。

選択すると以下の画面が表示されます。

「File Path」の部分に読み込ませたいCSVファイルまでのパスを渡し、「Property Name」に「text」と入力します。

この後「Execute node」をクリックするとワークフローにRead Binary FIleが追加されます。 「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下の画面のようになっていればOKです。

Spreadsheet Fileの設定

次に、Read Binary Fileで読み込んだCSVファイルをコードで処理するためのテキストデータに変換していきます。 先ほどの画像のRead Binary Fileの先についている「+」をクリックします。

先ほどと同様に検索欄に「Spreadsheet File」と入力してSpreadsheet Fileを選択します。

選択すると以下のような画面に切り替わります。

こちらは特に設定は不要です。 そのまま「Execute node」をクリックするとSpreadsheet Fileが追加され、先ほど作成したCSVファイルが読み取られているかと思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

Codeの設定

次に、読み込んだCSVファイルをコードで処理していきます。 先ほどの画像のSpreadsheet Fileの先についている「+」をクリックします。

先ほどと同様に検索欄に「Code」と入力してCodeを選択します。

以下のような画面に切り替わりますので、「JavaScript」と書かれている部分にあるコードをすべて消します。

すべてコードを消した後に以下のコードを貼り付けます。

// ランダムなインデックスの値を取得
function getRandomNum(max) {
  return Math.floor(Math.random() * max);
}

// 全データを取得
const items = $input.all();

// ランダムに選択されたインデックスを取得
const index = getRandomNum(items.length);

// 該当のインデックスのデータを後続の処理に渡す
return items[index];

そのまま「Execute node」をクリックするとCodeが追加され、データの中からどれか一つがランダムに選択されていると思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

HTTP Requestの設定

次に、Mastodonへ投稿する処理を追加していきます。 先ほどの画像のCodeの先についている「+」をクリックします。

先ほどと同様に検索欄に「HTTP Request」と入力してHTTP Requestを選択します。

選択すると、以下のような画面に切り替わります。

あとは以下のように各項目を変更してきます。

  • 「Method」を「POST」に変更
  • 「URL」に「https://gamelinks007.net/api/v1/statuses?access_token=token」のようなアドレスを渡す
  • 「Send Body」にチェックを入れる
  • 「Body Parameters」の各項目を入力する
    • 「Name」は「status」
    • Value」は「Expresstion」を選択し「{{ $json.text }}」と入力します

そのまま「Execute node」をクリックするとHTTP Requestが追加され、データの中からどれか一つがランダムに選択されていると思います。

「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。

以下のような画面になっていればOKです。

定期投稿処理を実行する

画面右上の以下の画像の部分に注目してください。

「inactive」と書かれている部分をクリックすると以下のモーダルが表示されます。

「Got it」をクリックすると定期投稿処理が実行されるようになります。

これでPC上のn8nを動かしているタイミングで自動的にMastodonへ定期投稿を行うことができます。

おわりに

n8nを使うとテキストでの定期投稿は意外と簡単にできました。 が、画像とかその辺はまだ未検証なのでその辺はおいおいやっていきたいですね。

この記事を読んだ人が定期投稿とかを簡単にできるようになれば幸いです。

なお、記事に関する質問は以下のMasotodonアカウントまでDMなどしていただければと思います。

gamelinks007.net