【2026-08-03更新】/home/bot/discordinebot2/readme.md

 Pozdrav! わたしです。Slackです。
今日はわたしがTwitchで使用している自作botの話を。

そもそもDiscordinebot2って?

配信マネージャ画面より

Discordinebot2はわたしが配信に使用しているbotです。
名前に2と付いているのは、1号機が諸事情(アクセスキーを紛失しました)でアクセス不能になったので新たにアカウントを作成したためです。
22年末~23年にかけて作成したものが原型になっていますが、違法建築が積み重ねられたのち、昨年になって大幅にリニューアルしました。

基本的な機能は以下の3つです。
  • チャットの翻訳(各種言語→日、日→英)
  • リスナーへの挨拶など配信サポート
  • チャンネルポイント交換による各種コマンド実行
また、わたし専用のコマンドとして配信終了コマンドがあります。これは何らかの理由でOBSから配信を終了できないorできなかった際に配信を強制終了するためのものです。
一応、4798732ポイント(一部の人にだけは通じる数字)溜めれば一般のリスナーでも交換自体は可能です。やれるもんならやってみろ。

使用言語はpythonで、TwitchIOを使用しています。
正直なところPythonはあまり好きではないのですが、ライブラリが多いので採用しました。
はっきり言っておく(キリスト構文)と、Pythonはみんな使っていることが一番の利点なタイプの言語です。SNSで言うところのLINEと同じ枠ですが、流石にLINEよりはマシだと思いたい。

各種機能解説(2026-08-03更新)

チャット翻訳

文字通りチャットを翻訳する機能です。
日本語以外の言語を日本語に、日本語を英語に翻訳します。
実はロシア語への翻訳機能も搭載されていますが、API代金節約のために使用していません。

翻訳にはOpenAIのAPIを使用しています。GPT-5.6-LunaならAPI代金がアホほど安いので、多少無駄遣いしても特に問題ないという説があります。ユーザ名やエモートは文章から除去して翻訳する仕様にしています。この辺は某翻訳botのソースコードを参考に作りました。
GPT-5.6 Lunaを利用したもう一つの理由は、シンプルに精度が高いためです。スラング交じりのコメントでも非常に正確に翻訳してくれます。愛してるぞ!

配信サポート

リスナーさんへの挨拶と、他チャンネルの紹介を行います。

挨拶の際には、ユーザのチャンネル説明文を参照して多少の紹介を行います。
挨拶はその配信中で最初にコメントを行ったときに行われます。

挨拶時には、リスナー各人について過去の来場記録を保存したDBを参照します。
DBへ保存される情報は以下の通りです。
  • 初回訪問日時
  • 最終訪問日時
  • 訪問回数
これら3種及びユーザのプロフィールを参照し、挨拶文を生成しています。
DBの操作にはSQLiteを使っています。たぶんこれが一番簡単だと思います。

プロンプトインジェクションされる可能性についてですが、SQLライブラリのプリペアドステートメント的な手法を使って回避しています。具体的なシステムプロンプトは攻撃を防ぐため開示しません。
基本的には現状のシステムプロンプトで攻撃を回避できているはずですが、グリッチトークンとかを書くとおかしなことになるかもしれません。
ということで、みんなもこちらのページを参照して攻撃してみましょう!

他チャンネル紹介は、まずTwitch側機能のShoutoutを使用し、その後に対象チャンネルの説明文・直近の配信タイトルを参照して紹介文を生成します。基本的には挨拶と同じですが、より長い文章で詳細に紹介を行います。

いずれも使用APIはOpenAIです。使用モデルは翻訳と同じGPT-5.4 Lunaです。
利点としては精度の高さと料金の安さが挙げられます。

プロンプトを工夫しており、「ずんだもん」っぽいしゃべり方をするようにしています。
この辺のプロンプトは2-3年前に配信で作成したものをほぼそのまま使用しています。当時を知る人は一定数いるはず。

※2026-08-03更新
botの口調を『でびるコネクショん』の『クピャドエル』っぽいものに変更しました。

各種コマンド

主に以下のコマンドが搭載されています。
  • 各種効果音再生
  • AIチャットボット的な質問その他
  • AI生成おみくじ
  • じゃんけん
  • BGMとかのリクエスト
  • わたしの衣装の切り替え
いずれも文字列でのコマンド入力(!helloとか)を必要とせず、すべてチャンネルポイント交換で実行する方式にしています。
これはわたしにGUI>CUIの思想があるためです。実際コマンドをチャンネル説明などに書かなくてよいのは良いと思います。
ただし副作用として大量のボタンが生まれて目的のものを探しにくくなっています。どうやって解決すればいいんでしょうね?

AI関連は他と同じでOpenAI APIのGPT-5.6 Lunaを使用しています。(なんで5.4-nanoより安いんですか?)
ログは残らないので、以前の質問などを参照することはできません。

じゃんけんは雑に作りました。
仕様は「本田とじゃんけん」とほぼ同じで、勝ち負けは乱数で決定されます。ちなみにbotの勝率がめちゃくちゃ高いです。勝率9割ぐらいに設定したはず。

BGMリクエストは流してほしい曲を送るためのものです。
ただし著作権に引っ掛かりそうな曲は拒否します。

衣装切り替えはそこそこ力を入れたポイントです。
衣装の概要を入力すると、わたしがその衣装を着ます。
動作の流れは以下の通りです。
  1. 衣装の概要を入力
  2. AIが概要から対応する衣装を判定
  3. 対応する衣装が存在すれば衣装の番号を返す、存在しなければ0を返す
  4. 存在する衣装の番号が返ってきた場合、Warudoにその数字をWebsocket通信で送信
  5. 受け取った数値に対応する衣装にWarudo側で切り替え
  6. 衣装が見つかり、切り替えが完了したら成功時メッセージを、失敗したら失敗時メッセージをチャットに送信
旧仕様ではユーザが自分で番号を入力する方式だったのですが、衣装リストにおける衣装の番号とWarudo側に登録されている番号が対応していなかったので、事実上使い物にならない代物でした。
(一応自己弁護すると、作った当時はちゃんと対応していました。衣装の作成ペースとbotの更新頻度が追い付いていなかった)
現在の仕様では、ざっくりと概要を言えば任意の衣装に変更されます。例えば「ポーランドの服」と打てばMalopolskaになるはずです。
衣装リストはこちらを参照。

実はWarudo側にもチャンネルポイント交換を受け取る機能が搭載されているのですが、間にbotを噛ませた方が良いとの思想があるので使用していません。
実際、2026-02-03現在のWarudoはTwitch側のAPI更新でチャンネルポイント交換による操作ができませんが、わたしは本botを経由してのWebsocket通信によって操作しているので問題なく動作しています。
あと、むやみに色々なサービスに権限を渡したくないです。自前のbotがあるなら、それで一元管理した方がいいと思っています。

2026-07-08加筆 各種更新内容対応

既存の機能の改修に加えて、自サイトhttps://discordine-slack.f5.si/の配信記録ページにデータを送信する機能を追加しています。

送信されるのは配信開始・終了時刻と配信時間、ならびに配信タイトルとカテゴリです。
いずれもTwitchのeventsubを利用して取得していますが、唯一配信開始時刻については、わたしがbotを起動し忘れる(2回に1回ぐらい忘れます)ことを考慮したフールプルーフとして、記録開始タイミングをbot起動時と配信開始時の2回にしています。かしこい!

また新たにYoutube側コメントの取得機能も搭載しています。これは最近になってYoutubeとの同時配信を試験的に行っているためです。
機能面ではTwitch用botに大きく劣っており、Youtube側にコメントが来た際に文字通り「Youtubeにコメントが来た」と音声を鳴らすだけです。翻訳周りのロジックをtwitch側botのmain.pyに入れたために利用できませんでした。こういった責務範囲を考慮しない実装はコードレビューで弾きましょう。

ところで、非常に厄介なことにYoutubeの配信はTwitchと異なりURLが不定です。
現在行われている配信に自動リダイレクトされるurlとして youtube.com/[ユーザ名]/live が存在しているのですが、これをコメント取得用APIに投げても配信のコメントを取得してくれません。
そこでYoutube配信のURLを取得するためだけにyt-dlpを利用しています。yt-dlpに固定URLの方を投げると動画IDだけ取って来ることができます(動画自体は取得しないので回線は占有されません)。これを実行して動画IDだけ取得、それをコメント取得APIに投げてリアルタイムでコメントを取得しています。
「わんコメ」はチャンネルURLを入れると自動でコメントを取得してくれますが、おそらく類似の手法を使っているのだろうと思います。(さすがにyt-dlpは使っていないと思いますが)

おわり

以上、配信で使用している自作botの紹介でした。配信で使うものは自作すると楽しいです。これを読んだ方はやってください。

それではまた次の記事でお会いしましょう。Do viděnja!


コメント

このブログの人気の投稿

【2026-05-16】所有衣装一覧

カクヨムに鬼才を見た

EDFのアイテム回収周りについて言語化したい