
どうも、俺だ。今日は、俺の相棒、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.txt の nacl が見つからねぇだの(実は 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。次の冒険の扉を開けに行くぜ。
