コンテンツにスキップ

Bot に RSS 購読を追加

前に作った転送 Bot は、もともとプライベートメッセージの転送だけのつもりだった。そこに LLM 審査を追加し、ホワイトリスト・ブラックリストを追加し、異議申し立て機能を追加し、i18n を追加し……気づいたらもう 1500 行超えてた。で、また手が出てしまった。ちょうど使ってる RSS ツールがイマイチだったので、「ついでに RSS も入れちゃおうか」と。kfb よ、お前はいずれ機能てんこ盛りのスーパーボットになってしまうのか……。

要件はシンプル:友達のブログが更新されたり、特定のサイトに新着記事が出たりしたら、Telegram で通知が来ればいい。情報フィードリーダーみたいな大げさなものはいらないし、管理画面も不要。RSS リストを追加・削除・更新するためのコマンドがいくつかあれば十分。というわけで:

/rss_add # 追加
/rss_list # 一覧
/rss_remove # 削除
/rss_refresh # 更新
/rss_title # 名前変更
RSS Bot コマンド一覧
RSS Bot コマンド一覧

もちろん既製の RSS Bot を使ってもいい。でも、チャット欄に Bot を何個も並べる「Bot 大王」にはなりたくない。この Bot にはもともと:

  • Telegram へのメッセージ送信
  • Gemini による要約

が備わっている。こうなると、「入れちゃえば?」ってなるよね(違う

理想的な item はこんな感じ:

<item>
<title>記事タイトル</title>
<link>https://example.com/post</link>
<guid>https://example.com/post</guid>
<description>記事の概要</description>
<pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
</item>

しかし、各サイトが生成する RSS はバラバラ。content:encoded がなかったり(冬夜のブログとか)、guid がリンクだったり謎 ID だったり。

例えば自分の RSS はこう:

<item>
<title>test-2</title>
<link>https://kokosa.icu/zh-cn/blog/test-2/</link>
<guid isPermaLink="true">https://kokosa.icu/zh-cn/blog/test-2/</guid>
<description>これはテスト用の記事です</description>
<pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate>
<content:encoded>
<p>省略114514文字……</p>
</content:encoded>
<category>Test</category>
</item>

RSS に記事丸ごと入れるのってすごくダサいと思ってる……

処理方法は:

  • 優先的に guid を使う
  • guid がなければ link を使う
  • それもなければ title + pubDate を使う
  • content:encoded があれば AI 要約に流す

過去記事を全送信、タイムラインを埋め尽くす快感()

Section titled “過去記事を全送信、タイムラインを埋め尽くす快感()”

初めて RSS を追加するときに、過去記事を全部送信するわけにはいかない。これはソフトウェアじゃなくてメッセージ Bot だから。

ブログによっては RSS に数十件の記事が入っている。購読を追加しただけで通知が流れまくったら大迷惑だ。なので、初回購読時には一度だけフィードを取得し、既存の記事をすべて「既読」として記録する(送信はしない)。

その後の定期リフレッシュで新しい item を検出したときだけ通知を送る:

[RSS] Kokosa's Blog
Bot に RSS 購読を追加
https://kokosa.icu/zh-cn/blog/2-tgbot-rss.md
Summary: 転送 Bot に RSS 購読通知を追加、定期リフレッシュ・重複排除・AI 要約に対応。

Worker は常駐サービスではないので、定期リフレッシュには wrangler.toml に cron を設定する:

[triggers]
crons = ["*/30 * * * *"]

30 分ごとにチェックする。テスト用に手動コマンドも用意した:

/rss_refresh

ただ、手動リフレッシュがちょうど Cron の実行と重なる可能性がある。そこで KV ロックが必要になる。さもないと、2 つのリフレッシュタスクが同時に「この記事はまだ未送信だ」と判断して、同じ通知が 2 回送られてしまう。

RSS 手動リフレッシュ後の通知
RSS 手動リフレッシュ後の通知

せっかく Gemini を導入済みなのに、通知にリンクだけ載せるのはもったいない!というわけで、記事の要約もしてもらうことにした。

前に実装したコンテンツ審査のタイムアウトは 4 秒。審査は SAFEUNSAFE を出力するだけだから問題なかったけど、要約は話が別だ(違う)。タイトルと本文を読み込んで、さらに要約文を生成するには 4 秒だと厳しい。そこで要約専用に 20 秒のタイムアウトを設定。失敗しても大した問題じゃない。せいぜい:

Summary: AI summary unavailable.

で済む。リンクは変わらず送られるので。

  • プライベートメッセージ転送
  • スパムメッセージ審査
  • RSS 購読通知
  • 続く…

最初の構想(広告をブロックできるだけの数百行の転送 Bot)からは少し膨らんだけど、そこまで大きくはなっていない。

光速で Vibe コーディングを終えたあとで思ったこと:OpenClaw みたいなツールに任せてもよかったのでは?(kfb、立ち上がれ…いつかロブスターを超えるのだ…)

Bot 自体はまだひっそりしてるけど、自分が何か投稿するたびに Bot が教えてくれるようになった:「また水増し記事を書きましたね」(でも次はいつ書くんだろう…)