最近の RSS Forwarder の更新は、購読元を増やすことよりも、日々の読書まとめと通常 RSS のメディア送信を予測しやすくすることに重心があります。実際の運用では、項目を取得できるかよりも、テキストと画像を安定して送れるか、対象ごとに表示形式を変えられるか、部分的な失敗後に同じ内容を繰り返さないかが重要になります。
プロジェクト概要
このプラグインは RhoninSeiei/astrbot_plugin_rss_forwarder で公開されています。設定は feeds、targets、jobs、daily_digests に分かれています。feed は RSS、Atom、Twitter/Nitter の項目を提供し、target は送信先の会話を表し、job は複数の feed と target を組み合わせ、daily digest は一定時間の内容をまとめます。
コード構成も同じ役割分担に沿っています。fetcher.py は取得と proxy、parser.py は項目の正規化、scheduler.py は周期実行、dispatcher.py は重複判定、翻訳、送信を担当します。daily_digest_image.py は日次カードをローカルで描画します。assets/daily_digest/ には軽量なカード素材とフォントがあり、テストは設定移行、解析、スケジューリング、送信、カード生成を確認します。
ローカル日次カード
以前の日次画像は外部の画像描画能力に依存していたため、サービス可用性、遠隔描画の待ち時間、フォント差、メッセージチェーン化など、失敗点が多くありました。新しい render_mode=image は Pillow を使ってローカルでカードを描画し、同梱された RSS マーク、角のアクセント、署名素材、ローカルフォントを使います。
この方式では出力が再現しやすく、配置時に遠隔画像サービスを待つ必要がありません。静的な日次カードでは、複雑な視覚効果よりも、タイトル、出典、要約、時間範囲の読みやすさが重要です。ローカル描画により、画像生成に失敗した場合はテキストまとめへ戻す動作も明確になります。
遠隔メディアのキャッシュと確認
通常 RSS 項目に含まれる遠隔画像も整理しました。テキストモードでは、遠隔 RSS 画像をローカル JPEG として保存してからプラットフォームアダプタへ渡す形を優先します。proxy が必要な source では、feeds[].proxy_url を原文画像のキャッシュ要求にも渡し、直リンク制限、形式差、遠隔転送失敗によるエラーを減らします。
送信確認も実際の利用に合わせて調整しました。ある版では本文とメディアを分け、本文の重複確認を先に済ませてから画像と動画を送ることで、リッチメディアのアップロード失敗が本文の再送につながる問題を抑えました。その後、テキストモードでは画像をローカルキャッシュで整えたうえで、本文と画像を同じメッセージチェーンに戻しました。重要なのは、内容の同一性を先に確定し、そのうえで可能な範囲で図文のまとまりを保つことです。
維持管理メモ
RSS ツールは定期取得と転送だけに見えますが、維持している形は小さな公開システムに近くなります。source、target、job、重複判定、意味的な統合、翻訳、日次カード、メディアキャッシュ、送信確認は、それぞれ役割を分けておく必要があります。
今回の整理後、プロジェクト構造は長期保守に向いた形になりました。日次カードはオフラインで生成でき、遠隔メディアは先にローカルキャッシュへ入り、多 target の job では target ごとの確認で重複送信を避けられます。source、job、target ごとに表示方法を調整できることは、個人の読書記録や趣味チャンネルでは、購読元を単に増やすこと以上に意味があります。