📬

Youtubeの通知をいいかんじにdiscordで通知するbotつくった話 + 今年の振り返り

に公開

この記事は、みすてむずアドベントカレンダー2025の9日目の記事です。

推しを推すサーバで使うbot作ってた話ですわ!

はじめに

今回作成したbotは、なる箱(ファンコミュニティ)で動画投稿やライブ配信の通知を受け取るために作成されました。

Youtubeの更新を取得するために元々使っていたツールでは、

  • 通知が飛ぶまで5分単位で遅延が発生する
  • 同一の通知が何度も飛ぶ

といった問題が発生していました。
また、ポーリングする形で情報取得していたため、頻繁に通信が発生していました。

このような不満を解決させる&開発の練習のために、「いいかんじにBot作ろうぜ」というノリで作ったのがこのBotです。
今回はPubSubHubbub(略: PubSub)とYoutubeのAPIを利用していいかんじにやっていきます。

Repository

https://github.com/Kazugmx/narubox-bot


本題

何ができるん?(機能)

ざっくりできることをまとめるよ

  • 指定したYoutubeチャンネルの更新を監視
  • 新しい動画 or ライブ配信の開始を検知
  • Discord の Webhook に「いい感じのフォーマット」で通知を投げる
  • Discord 外からも誰でも登録して使える(将来はちゃんとした認証つける予定)

想定してる使い方は、

  • コミュニティサーバで特定のチャンネルの更新通知を流すこと

将来的には、コミュニティの投稿とかも取得できるようにしてみたいですね。

アーキ設計

仕組みは単純で、

  1. PubSubでYoutubeの更新イベントをSubscribe
  2. 通知が飛んできたらYoutube Data APIで詳細を取得
  3. DBに記録しつつ、重複チェック
  4. DiscordのWebhookにメッセージを投げつける

というフローになってるかんじですわ!
とりあえず主機能に着目して書いているので、ユーザ認証周りの話は割愛させていただきます。ごめんね :3c

技術スタック

- Kotlin
- Ktor (Server / Client)
- SQLite
- Cloudflare Tunnel (エンドポイント公開)
  • Ktor: シンプルにHTTPサーバ&クライアント
  • SQLite: 頻繁にI/Oが発生しないサービスなので、とりあえず組み込みDBで簡潔に
  • CF Tunnel: てきとーなホストで手軽に外部公開できる

実装のポイント

1. PubSubでYouTubeの通知を受け取る

実装としては

  • /api/v1/notify/pubsub的なエンドポイントを作り、
  • hubからのhub.challengeに応答してSubscribeを確立
  • 通知が来たらXMLパースしてchannelId,videoIdを取得し、取り出す

あたりを Ktor + XML Serializerで実装してます。

ここでハマったところは、

  1. XMLのシリアライズで必要なアノテーション
  2. 削除通知のハンドリング

などの点ですわ!
シリアライザの問題は、Ktorのドキュメント見たり、ちゃっぴーに聞いたりしながら解決しました。

// 実装例
...
@Serializable
@Suppress("HttpUrlsUsage")
@XmlSerialName("entry", namespace = "http://www.w3.org/2005/Atom")
data class Entry(
    @XmlSerialName("id", namespace = "http://www.w3.org/2005/Atom")
    @XmlElement(true)
    val id: String? = null,

    @XmlSerialName("title", namespace = "http://www.w3.org/2005/Atom")
    @XmlElement(true)
    val title: String? = null,
...

削除通知のハンドリングは今回の場合不要だと判断したので、飛んできた場合は切り捨てて通知しない選択をしました。

2. Youtube Data APIで状態を取りに行く

PubSubだけだと、更新が発生したことしかわからないので、

  • 動画なのかライブ配信なのか
  • タイトル,サムネイル,配信の開始予定など

Youtube Data APIで取りにいってます。

今回は「とりあえずWebhookで飛ばせればOK」というゴールだったので、シンプルにvideos.listで必要最低限だけ取得する方針にしました。

3. DB設計とアプリ構造

DBにはざっくり次のような情報を保持しています。

  • Usersテーブル: Bot管理ユーザの認証情報など
  • Channelsテーブル: 監視対象のチャンネルリスト
  • Botsテーブル: 配送先のWebhookURLと配送先

Botと対応するチャンネルにのみ配信するために、構造化して効率的に対象のBotにのみ送信できる構成にしました。

4. セキュリティまわり

現時点では、Bot登録機能を保護するために簡易的なユーザ登録・ログイン機能が最低限実装されています。
今後は「だれでも利用できるツール」にしていきたいので、

  • メール認証 + TOTPベースのログイン
  • レートリミット・Abuse対策

などを実装予定です。流石に今のままだとザルすぎる...!

今後の展望

今後やりたいことは、大きく分けて3つあります。ほとんど認証周りのことですね :3c

1. IAMの実装・登録時のメール認証追加

現時点では、ユーザの登録とログイン機能のみ実装されています。

一般的なアプリケーションでは、初回登録時にメールを利用した確認工程がありますが、今回作成したBotでは確認せず登録することができます。

さすがに任意のユーザが自由にいくつも登録できるのはまずいので、メールで確認する機構を実装します。

また、管理者がユーザやBotの管理をするための機能が実装されていないので、悪意を持ったユーザが大量にBotを登録した場合スパムできてしまいます。
このあたりの悪用を抑えるための管理機能も必要です。

2. TOTP等の2FAを実装

ログイン機能を固めよう!でとりあえず追加します。
何もしないより断然マシだからね、やるしかないね。

3. WebUIの作成

現状ではcurlなどのツールでリクエストを投げてるので、さらに使いやすくするためにWebUIを作成したいです。
勉強を兼ねて作りたいものがどんどん増えていきますわ!!

ふりかえり・まとめ

今回Botを作ってみて感じたことをざっくりまとめると、

  • PubSubHubbub+Youtube Data APIの組み合わせで、ちゃんと動く形で作れた
  • 「とりあえずWebHookで飛ばす」ところまで作ると、どんな機能を足したいかがはっきりしていいかんじになる
  • 通知の基盤は小規模でも、設計~運用を一通り触れられるのでいい勉強になった

みたいなかんじですわ :3c

同じように「推しの配信通知を自前で取れるようにしたい!」という人の参考になったら嬉しいですわ!!

今回は軽く中身に触れただけなので、また別で細かい実装だったり工夫したところをまとめたいです。
もっと細かいとこまで掘り下げて触れたかった...!

リポジトリも公開してるので、気になったら覗くなり使ってみてくださいな!

ここまで読んでくれてありがとうございました!

https://ktor.io/
https://adventar.org/calendars/11504
https://pubsubhubbub.appspot.com/
https://github.com/Kazugmx/narubox-bot


今年の振り返り

こっからは色々雑に書いていくぜ! 本編とは全然関係ないから、興味ない人は飛ばしておくれ!

今年全体の印象

まあ、いろいろありましたね。技術で遊んだり、果てに自分を追い込んだ。最高の推しに出会って救われたり。
嬉しいことも苦しかったことも多かったけど、面白い一年になったと感じてますわ

前半期

自宅クラウドの構築をしたり、CTF開催に向けて準備したり。
とにかく手を動かして自発的に動けてた時期だった。

Harvesterを触ってHCIに触れて色々遊んだり、
Cloud-init+Ansibleで環境構築の自動化ができるようになったり。
イベントに参加することで多くの知らないことに触れられた。

まだまだ簡単な使い方で止まってるところも多いけど、さらに広く深く知る余地があることを実感した半年だった。

わからないことがいっぱいあるって最高に楽しいね。

後半戦

まあ、激動の半年だったねえ...

技術だけじゃなく、「人と関わること」が増えていろんな人に出会ったり、助けてもらって色々成長できるいい機会になった。
自分のキャパを大幅に超えて潰れかけたりして人を頼る大切さを知ったよ。本当に壊れそうなときって感覚が麻痺するんだなって初めて体感したよ...
無理しまくって潰れるくらいなら人を巻き込んで、どうにか負担を分散させるなり軽減させる方法を取らないと立ち直れなくなる。 こわいね

うまく力を抜く方法を選べるようになったからかなり成長したと思う。

推しとコミュニティ

今年で一番大きい変化は、"推し"という存在ができて、いろいろ楽しめるようになったことかも。

今年(2025/10)にデビューした炉なるって子がいるんですけど、めちゃくちゃ多才でかわいい面白い娘なんですよね。
最高にかわいい、トークも面白い、Live2Dだったりイラストだったりスキルが山盛りのすごい子だね。
語彙が乏しくてうまく表現できないんだけど、すごいいい子です。

炉なるさんの非公式ファンコミュニティである「なる箱」を設立して、色々ファン達の間での交流だったり情報交換が気軽にできるような整備をしていきました。
慣れないことに手を出して色々大変だったけど、いい人たちとも知り合えたいい機会になってとてもよかったですわ!

雑記

今年ものこり3週ぐらい。残りの時間を少しでも多く活かせるように、情報に対する感度を高めて、体も動かしてコンディションをもっとよくしたい! 少しでも健康に楽しく一年を追えたいっすね。

ここまで読んでくれてありがと! 良いお年を :3c

Discussion