コンテンツにスキップ

Bot に RSS 購読を追加

目次

今のツールが使いづらすぎる……ので……

Section titled “今のツールが使いづらすぎる……ので……”

前に作った転送 Bot は、もともとプライベートメッセージを受け取るだけのものだった。広告ブロックが必要になったので LLM 審査を追加し、トークンを少し節約するためにホワイトリストとブラックリストを追加し、誤 BAN 対策で異議申し立ても追加し、暇だったので i18n まで追加した……え、もう 2000 行近いんだけど?ちょうど使ってる RSS ツールもあまり使いやすくないし、ついでに RSS も入れちゃえば?kfb、お前はいずれ機能てんこ盛りの Bot になるんだろうな……

要件はとてもシンプル。友達(友達リンク参照)のブログが更新されたら、Telegram に 1 件メッセージを送ってくれればいい。情報フィードリーダーみたいな大げさなものはいらない(今のリーダーのデザインってどれも微妙だし)。RSS リストの追加・削除・更新・一覧表示と、基本的な送受信ができるコマンドがいくつかあれば十分。というわけで:

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

これは比較的理想的な 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>

しかし、各サイトが生成するものはまちまち。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 に記事全文を突っ込むのはすごく微妙だと思っているので、今はもう直してある


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

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

初めて RSS を追加するときに、過去記事を全部送信するわけにはいかない。これはメッセージ Bot だから。ブログによっては RSS に数十件の記事が入っている(しかも全部読んだ)。購読を追加しただけで通知が画面を埋め尽くしたら困る。なので、初回購読時には一度だけ feed を取得し、既存の記事をすべて既読として記録するが、送信はしない。その後の定期リフレッシュで新しい item を検出したときだけ通知を送る:

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

Worker は常駐サービスではないので、定期リフレッシュには wrangler.toml にこんなのを書く必要がある:

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

30 分ごとにチェック。テストしやすいように手動コマンドも追加した:

/rss_refresh

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

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

せっかく Gemini を導入してるのに、通知にリンクだけ載せるわけにはいかない!というわけで、記事の要約もしてもらうことにした。前に設定したコンテンツ審査のタイムアウトはわずか 4 秒。審査は SAFEUNSAFE を出力するだけでいいから。一方、要約は色々考えないといけない。なので要約には別途 20 秒のタイムアウトを設定。失敗しても、せいぜい:

Summary: AI summary unavailable.

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


光速で Vibe コーディングを終えたあとで思った。OpenClaw や Hermes みたいなものに手伝わせてもよかったのでは?(kfb、立ち上がれ……ロブスターを超える日も近い……)