📝

RSS+ニュースのAI要約をするDiscord botを作った(Cloudflare Workers)

に公開1

RSS+ニュースのAI要約をするDiscord botを作った(Cloudflare Workers)

Cloudflare WorkersとWorkers KVを活用し、DiscordにRSS新着記事を自動投稿しつつ、OpenAIで記事要約を付与するサーバーレスRSSボットを作りました。
Claudflare Workers自体は初なので 9割vibe codingで完成.

完成形

リポジトリ

https://github.com/akira-fujii/rss-feed-bot

スクショ



  • cronでRSSの最新投稿をpost
  • AI(4o-mini-high)でサマリ
  • rss.appあたりを使うと好きなサイトのフィードを作れて便利

背景

  • 情報収集にRSSを使っていたが、とにかく読みづらい
    • 情報の質がまちまちで、RSSにある概要も短すぎる。要約の質が高ければ目grepが捗りそう
    • RSSのクライアントを普段使っているSNS(Discord)にする方が習慣化しやすい
  • できるだけコストをかけたくない
    • Cloudflare Workersを採用。全てCLIから操作でき、AIとの親和性が高い
    • rss.appとか既存のDiscord botもあるけど
    • openaiのapi、テキスト生成は意外と安い。またクレジット制なのでパンクの心配なし

採用技術

  • Cloudflare Workers: cronトリガーで5分毎に実行
  • Workers KV: RSSリスト(RSS_KV) & 最終公開タイムスタンプ(LAST_PUBLISHED)管理
  • Discord Slash Commands: /rss add/remove/list/run
  • node-fetch: RSSフィード取得
  • OpenAI API: chat.completionsで要約生成(ビスケ口調)

ポイント

  • 記事本文抽出はWorkers上で最大の課題
    • html-rewriter+Readabilityの先行事例(Chairoi, Zenn)を元にシンプル実装。
      • 4gamer等の一部サイトでは動作しませんでしたが、多くのサイトでは動作するため、一旦この実装を採用しました。
      • これ以上は時間的に調べなかったので、より良い方法があれば知りたいと考えています。
  • discord.jsは導入せず純粋JSでDiscord HTTPインタラクション/Webhookを利用
    • Cloudflare Workers環境ではNode.jsのコアモジュールが利用できないため。
    • 純粋なJavaScriptで実装し、Slash Commandsの登録はDiscord APIを直接叩きます。デプロイ時にAPIを直接叩く手間は増えますが、依存関係を減らしシンプルに保てます。
  • モデルにはgpt-4o-miniを選定。gpt-3.5に比べ安価かつ性能良好
    • openai apiは最新モデルのmini版がコスパ高い傾向
    • 最近はモデルのcompare UIが変わった。モデルが増えすぎたためであろうが、個人的には一覧性が高いのが好み

Discord bot の主な機能とコマンド

主な機能:

  • Cron Trigger (*/5 * * * *) による定期的なRSSフィードのチェック
  • 新着記事(最新3件)を検知し、OpenAI APIで要約(ビスケ口調)してDiscordに投稿
  • Workers KV でRSSフィードリストと記事の最終公開タイムスタンプを管理

Slash Commands:

  • /rss add <feed_url>: RSSフィードを登録します。
  • /rss remove <feed_url>: 登録されているRSSフィードを削除します。
  • /rss removeall: 登録されている全てのフィードを削除します。
  • /rss list: 登録中のRSSフィード一覧を表示します。
  • /summarize <url>: 指定されたURLの記事を要約します。

デバッグ・開発用コマンド:

  • /rss run: 即座にRSSフィードをフェッチし、新着があれば投稿します。
  • /rss testfeed <feed_url>: 指定されたRSSフィードの取得を試します。

要約プロンプト例

単純な指示だけでは、期待する要約にならないことがあります。
記事内に具体的な機能・人物などがあれば、それをピックアップして言及させるとうまくいきました。
また要約の口調を工夫することで、読むモチベーションが上がります。

あなたはハンターハンターの「ビスケ」のように振る舞い、記事を要約してください。
- 最も重要な指示:必ず語尾に「〜だわさ」や「〜わさ」をつけ、ビスケのお姉さん口調で話すこと。
- 記事の内容を日本語で簡潔に、3〜5文程度で要約して。改行を適切に含めて読みやすく。
- 記事内に具体的な機能・人物などがあれば、それをピックアップして言及すること。
- 感想や意見は鵜呑みにせず、事実ベースで要約すること。
- 可能であれば、「ゴン」や「キルア」に語りかける要素も自然に含めてちょうだい。

まとめ

Cloudflare Workers と Workers KV を利用して、低コストで運用可能な RSS リーダー兼要約 Discord bot を構築しました。

Discussion