この記事は、
Twitch公式やIFTTTなどのツールにBlueskyが対応されないことに
面倒くささを感じた私が、なら投稿ツール作ればいいじゃんと
作ったアプリの記事です。
Twitch Stream notify on Bluesky
- 目標と成果物
目標: Twitch配信開始時にBlueskyへ自動で告知投稿を行うBotの構築
(TwitchのAPIをWebhook経由で叩いて放送開始したら
BlueskyのAPIで投稿する)
ベータ版をGitHubにおいてるので確認してくれる人募集。
GitHubのリンク
成果物(2025/05/16時点):
-
main.py
(Flaskサーバーの起動・ルーティング・主要な機能の呼び出し) -
eventsub.py
(Twitch EventSub関連の機能を担当) -
bluesky.py
(Blueskyへの投稿処理を担当) -
logging_config.py
(ログ設定、Discord通知設定を担当) -
tunnel.py
(Cloudflareトンネルの起動終了の管理) -
utils.py
(汎用的な処理をまとめたユーティリティ) -
settings.env
(認証情報・設定ファイル)
配布時はsettings.env.exampleが入っているので、
コピーして書き換えて使ってください。 -
logs/
(ログディレクトリ) 投稿履歴、エラーログ、監査ログなどは、
全部このフォルダに入ります。 -
templates/
(Bluesky投稿内容のテンプレートディレクトリ)
Blueskyに投稿する内容をテンプレートにしてここに入れたあと、
設定ファイルで指定するとその内容で投稿されます。 -
images/
(Blueskyに投稿時、画像を付けたいときに使う)
投稿する時に画像を添付したいときは、
このフォルダにいれて設定ファイルで指定すると、
画像付きで投稿されます。(1枚だけ添付できます。) -
test/
(動作テスト用テストコードディレクトリ)
pytestによる自動テストが可能です。
すでに完了している内容(2025/05/16時点)
Cloudflare Tunnelのセットアップ・動作確認
※TwitchAPIにアプリでつなぐにはHTTPS必須らしい。
そもそもIPv6のIPoE(v6プラス)だとポート数に限りがあるので、
とりあえずネットにさえつながってればドメイン経由でアクセスできるこれを選択。
- トンネル作成・DNSルーティング・サービス化
Tunnel経由でスプリクトのエンドポイントへの外部からの疎通確認。
動作確認用でブラウザからのGETリクエストだと200を出力し、
「Webhook endpoint is working! POST requests only.」で応答する)
アプリの実装
面倒事考えたくなかったので超最低限の機能でシンプルなFlaskで開発
Twitch関係
- Twitch EventSub WebhookとBluesky投稿処理を実装
- GET/POST両対応のエンドポイントを実装
- 署名検証、Webhook検証(challenge応答)に対応
- EventSubサブスクリプションの自動作成機能も実装
- 不要なTwitch EventSubサブスクリプションの自動クリーンアップ
Bluesky関係
- BlueskyのOAuthは使ってないのでアプリパスワードが必要
- Bluesky投稿内容は(templatesフォルダ)にファイルをいれると編集可能。
- 画像付きで投稿する場合は(imagesフォルダ)に入れて、
設定ファイルで指定する(添付しない場合は設定不要) - テンプレートを切り替えることで投稿内容の変更も可能
ログ・エラー時の対応
- ログはコンソール、ログファイルがメイン。
- Discordサーバーにエラー通知を送信可能(通知レベルの設定や機能オフも可)
- APIエラー時は自動リトライ(回数等は設定で管理)
- 監査ログ機能を実装
管理・テスト・セキュリティ
- test/ディレクトリでpytestによる自動テストが可能
- WEBHOOK_SECRETは自動生成(初回起動時)・30日ごとに自動ローテーション
- Webhook署名はタイムスタンプ検証
- 主要な操作はlogs/audit.log(監査ログ)に記録
エラー通知やログについて
-
エラー表示はコンソールとエラーログに出力されます。
-
ログファイルは設定ファイルで指定した日数保管し古いものから消去します。
-
ログレベル(コンソール表示含む)は、設定ファイルから調整できます。
-
Discordを使っていてDiscordサーバーを運営している人は、
Webhook作成後、設定ファイルにWebhookのURLを設定すれば、
任意の通知レベルでDiscordサーバーに通知することも可能です。 -
Discordへの通知を必要としない場合は、
上記の設定をしなければDiscord通知機能だけオフになります。 -
投稿履歴のCSV記録機能
logs/post_history.csvにBlueskyへ投稿した記録が、
投稿成功・失敗にかかわらず残ります。
Twitch CLIによるWebhook検証・テスト
TwitchCLI(公式のコマンドラインツール)で以下の検証を実施済み。
- Webhook検証コマンド・テストイベント送信を実施し正常な応答を確認
- challenge応答の正常性を確認
Bluesky自動投稿の動作確認
アプリが上記のTwitchCLIで発行した通知を読み取り、
内容をBlueskyに投稿するという一連の動作を確認。
なお、タイトル、カテゴリ、放送URLはテスト用なので空欄かダミーデータである)
残りのタスク(2025/05/16時点)
まだ開発中の箇所やバグの確認・検証は終わっていないので、
正式版ではないが、GitHubのリポジトリで公開を始めたので
Twitch配信者で、独自ドメインをもっていて、
ドメインのDNS管理をCloudflareにしてもいいひとは試してみてほしい。
本番配信による最終検証
実際のTwitch配信開始イベント(ガチの配信開始通知)で
Bluesky投稿が行われるかは、
配信環境が整い次第テストが必要である。\
ベータ版をGitHubにおいてるので確認してくれる人募集。
GitHubのリンク
本番運用向けチューニング
- マニュアル等の整備
今後の課題とか
・Youtubeとかニコ生の配信とかにも対応できると
いいのかなーとかおもったり(できるのかは知らない)
・アプリパスワード面倒だからOAuth実装したほうがいいよね
とかおもったり
・そもそも現状使うためには、
2つのアプリ動かなないといけないから面倒だし
一個で動くようにできればいいよねとかおもったり。してます
あーあと、もう少しちゃんと動くようになったら、
Beta版として公開するのでその時は皆さんよろしくしておきます。