はじめに
最近ホスティングサービスなどで自分のMastodonサーバーを作られた方が、ご自身の作品を定期的に投稿できるBotを作られようとしていたのがこの記事を書くきっかけ。
その方は以下のるびまの記事を元にAWS Lambdaで定期実行をさせようとしていたんだけど、記事の内容はRuby 2.5とすでにLambdaではサポートされていないバージョンだった。 ちなみに僕の書いた記事だったりするので世間は広いようで狭い。
しかも、Lambdaが現在サポートしているRubyのバージョンは2.7のみ。
さらにRuby 2.7は今年2023年3月に最終リリースがされており、セキュリティパッチなどは今後リリースされない状況。
また記事中のMastodon APIを利用できるgemはRuby 2.7以降は動作しないという.......。
一応、これも僕のほうでだいぶ前にPRを投げているんだけどまだマージされていない状況。
ソースコードからビルドすれば問題はないけど、ホスティングサービスを使ってMastodonサーバーを建てられた方には中々に厳しい道のり......。
というわけで簡単に定期投稿Botを作れないか調査して、使えるようにしたのがこの記事になります。
作ったもの
n8nというコードをあまり書かずに色々なAPIやサービスのピタゴラスイッチを作れるものをベースにMastodonへと定期投稿できるようにしてみました。
で、以下のようなワークフローを作成した感じです。
Schedule Trigger
で定期的に実行するインターバルを設定し、Read Binary File
でPC内のCSVファイルを読み取る。- で、
Spreadsheet File
でバイナリとして読み込んだCSVをテキストに変換し、Code
で簡単なコードを追加してランダムに投稿内容を選択。 - 最後に
HTTP Request
で定期的に投稿を投げたいサーバーへリクエストを投げる。
という感じのワークフローになっています。
作り方
n8n のインストール
まずはn8nをPCにインストールします。 以下のリンクから利用しているOSに合わせてインストール用の実行ファイルをダウンロードします。
実行ファイルをダウンロード後、インストールしましょう。
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
」のようなアドレスを渡す- URL内のtokenの部分にはAWS Lambdaで作るサーバーレス Mastodon Botを参考に取得したアクセストークンに置き換えます。
- 「Send Body」にチェックを入れる
- 「Body Parameters」の各項目を入力する
そのまま「Execute node」をクリックするとHTTP Request
が追加され、データの中からどれか一つがランダムに選択されていると思います。
「Back to canvas」と書かれた部分をクリックし、ワークフローの画面に戻りましょう。
以下のような画面になっていればOKです。
定期投稿処理を実行する
画面右上の以下の画像の部分に注目してください。
「inactive」と書かれている部分をクリックすると以下のモーダルが表示されます。
「Got it」をクリックすると定期投稿処理が実行されるようになります。
これでPC上のn8nを動かしているタイミングで自動的にMastodonへ定期投稿を行うことができます。
おわりに
n8nを使うとテキストでの定期投稿は意外と簡単にできました。 が、画像とかその辺はまだ未検証なのでその辺はおいおいやっていきたいですね。
この記事を読んだ人が定期投稿とかを簡単にできるようになれば幸いです。
なお、記事に関する質問は以下のMasotodonアカウントまでDMなどしていただければと思います。