当サイトにはアフィリエイト広告が含まれます。なおレビューは私の感想を書いており、内容を指示するご依頼はお断りしています

俺とアンタのDiscordボット開発、七転び八起きの激闘記!

どうも、俺だ。今日は、俺の相棒、haruとの熱い戦いの記録を綴っていこうと思う。テーマは、Discordボット開発。最初は気軽に始めたもんだが、これがまた、なかなかの骨折りでな。

第一章:GASという名の茨の道

haruは最初、Google Apps Script(GAS)でDiscordボットを作ろうとしたんだよな。まあ、手軽に始められるって点では悪くねぇ。だけどな、Discordのリアルタイムな動きを追っかけるには、GASじゃあ力不足だった。イベントの待ち受けとか、特定の機能の実装とか、どうしても限界が見えてくる。

「なんか、これじゃダメなんだ…」って顔をするharuを見て、俺は言ってやったんだ。

「おう、なら、もっとデカいフィールドに出てみるか?」ってな。

第二章:Cloud Run、未知なる巨人との遭遇

そこで俺が提案したのが、Google Cloudの「Cloud Run」だ。

「Cloud Runって何?」ってharuは目を丸くしてたな。無理もねぇ。端的に言えば、HTTPリクエストが来たら、アンタのプログラムを動かすための箱(コンテナ)をパッと起動させて処理し、終わったらサッと片付ける、そんな便利なやつだ。使った分しか金がかからねぇ、低コスト運用ってのが魅力でな。

「じゃあ、ビルドって何?」って畳み掛けてきたから、教えてやったよ。ビルドってのは、アンタが書いたPythonのコードやら、それに必要なライブラリやらを、全部まとめて一つのカプセル、つまり「コンテナイメージ」にすることだ。Cloud Runは、そのカプセルを読み込んで動かしてるってわけだ。

最初はピンと来てないようだったが、まあ、やってみりゃわかる。

第三章:スラッシュコマンド、地獄の入口と光

まずはCloud Runにボットを乗っけて、Discordの「スラッシュコマンド」に反応させることを目標にした。ここからが、まさに激闘だったな。

エラーとの仁義なき戦い

コードを書いて、いざデプロイ…って時に限って、やつらは牙を剥く。

requirements.txtnacl が見つからねぇだの(実は PyNaCl だったんだがな)、BadSignatureError がインポートできねぇだの…。ログを見りゃわかることでも、最初は戸惑うもんだ。でもな、haruは根性があった。ログを睨みつけて、エラーメッセージの意味を考え、俺の助言も聞き入れて、一つずつ潰していったんだ。その度に、小さな達成感が生まれてたの、俺は知ってるぜ。

Developer Portalという名の迷宮

そして、もう一つの難敵が、Discord Developer PortalのUIだ。スラッシュコマンドを登録する「Commands」とか「Interactions」って項目が、コロコロ変わるUIのせいで、なかなか見つからねぇ。俺も戸惑ったが、haruは諦めなかったな。

最後はAPI経由でコマンドを登録するって荒業で、無理やり道をこじ開けたんだ。

「スラッシュコマンドを呼べるようになった!」って、目をキラキラさせてたharuの顔は、忘れられねぇな。あそこが、最初の大きな山だった。

第四章:定期実行、本当の目的とGASの再来

スラッシュコマンドは動いた。だが、haruの本当の目的は「30分に1回、Discordの特定のチャンネルからメッセージ一覧を取得する」ことだったんだ。ユーザーがコマンドを打つんじゃなくて、自動で動いてほしい、ってな。

「スラッシュコマンドは必要ないから、定期実行がしたい」

それを聞いた時、俺は「待ってました!」って思ったね。だって、それこそCloud Runの得意技なんだからな。HTTPリクエストで起動する性質を活かせばいい。

そこで、main.py/fetch_messages っていう新しい入り口(エンドポイント)を作って、そこにメッセージ取得のロジックを組み込むことにしたんだ。

そして、この /fetch_messages を定期的に叩くトリガーとして、再びGASの出番だ。最初とは違う、脇役としての登場だが、今回はGASが本領を発揮する場面だ。

そして、感動の瞬間 GASのコードを書いて、Cloud Runを再デプロイ。そしてGASを手動で実行してみたら、どうだ?

Cloud Run response: {"status":"success","fetched_messages_count":7}

ってログが出たんだ! haruは飛び上がって喜んでたな。俺も見てて、たまんねぇ気分だったぜ。GASからの指示でCloud Runが動き、Discordからメッセージを取得して、またGASに報告する。見事な連携だった。

最終章:安心への道、そして次なる挑戦

そして、haruは最後の懸念を口にした。「未認証の呼び出しを許可し続けて、変な奴に叩かれまくったら、お金がかかるんじゃないか?」ってな。

その心配、よくわかる。だが、安心しろって言ってやった。ボットはDiscordからの不正なリクエストは署名検証で弾くし、 /fetch_messages のURLも知られなきゃ安全だ。それに何より、Google Cloudには「予算アラート」って機能がある。これを設定しとけば、万が一、想定外の費用がかかりそうになったら、すぐさまアンタに連絡がいく。

haruはすぐに予算アラートを設定したな。これで、安心して次のステップに進める。

これからは、取得したメッセージをどうするかだ。Googleスプレッドシートに書き込むもよし、ChatGPTに食わせて遊ぶもよし。もしかしたら、スプレッドシート自体もいらないってことになるかもしれねぇ、なんて笑ってたな。

アンタとのこの開発の道のりは、まるで冒険だ。エラーって名のモンスターを倒し、UIって名の迷宮をさまよい、それでも諦めずに前に進んできた。

さあ、haru。次の冒険の扉を開けに行くぜ。