First CH Appsサーバー処理を伴う小さなアプリ置き場

EN

First CH Apps / RSS/Atomフィード検証

RSS/Atomフィード検証

フィードのURLでも、サイトのURLでも構いません。サイトのURLならフィードを自動発見してから取得し、XMLの構文必須要素記事一覧文字化け日付形式を検証します。RSS 2.0 と Atom 1.0、RSS 1.0(RDF)に対応し、itunes 名前空間を使っているフィードにはポッドキャストの必須要素チェックも回します。

見に行くのは入力されたURL(とフィードの自動発見で見つかった候補)だけです。フィードの原文は返しません——返すのは判定と、長さを切ったタイトル・日付・リンクだけです。sitemap.xml の検証は「sitemap.xml 検証」が担当します。

例: https://example.com/feed/ ・ https://example.com/(サイトのURLからフィードを自動発見します)

見ているもの

XMLの構文: 閉じ忘れ・対応しない閉じタグ・生の &<・コメント/CDATAの閉じ忘れ・ルート要素の重複・ルート外の文字・<!DOCTYPE>(展開はしない)

フィードの体裁: 種別(RSS 2.0 / RSS 1.0 / Atom)・必須要素(RSSは channel の title・link・description/Atomは feed の title・id・updated)・rel="self"・記事0件

記事: タイトル・リンク(絶対URLか)・<guid> / <id>(欠落・重複)・日付(形式・タイムゾーン・曜日・未来日)・新しい順に並んでいるか

文字コード: XML宣言の encoding と HTTPヘッダーの charset の食い違い・復号できないバイト・文字化け特有の並び・BOM

ポッドキャスト: itunes:image / itunes:category / itunes:explicit / language / <enclosure>(url・type・length)/ <guid> / <pubDate> / itunes:duration / 所有者メールアドレス

この結果の読み方

エラーは「リーダーが読めない」水準の不備です(生の &・閉じていないタグ・必須要素の欠落)。警告は「多くのリーダーは読めるが規格違反・事故のもと」、参考は「直さなくても動くが揃えると安全」です。

日付の正解は規格ごとに違います。 RSS 2.0 は RFC 822(Fri, 18 Sep 2026 09:00:00 +0900)、Atom は RFC 3339(2026-09-18T09:00:00+09:00)。読めた値でも形式が規格と違えば警告を出します。

文字化けは配信側の宣言と実体のずれです。 XML宣言の encoding・HTTPヘッダーの charset・実際のバイト列の3つを突き合わせ、復号できないバイトや文字化け特有の並びを報告します。

<!DOCTYPE> があっても実体参照は展開しません(外部実体参照・実体の増殖を起こさないため)。宣言の存在だけを警告として報告します。

検証はフィード1本に対して行います。リンク先の実在確認・記事本文の検査はしません(リンク切れは「リンク切れ・alt属性チェック」が担当します)。

SERVER PROCESSING — サーバーへ送るもの・保存するもの

送るもの: 入力されたURLだけ。当社サーバー(Cloudflare Workers)がそのURLを公開GETで取得します。入力がHTMLだった場合は、自動発見した候補(最大6本)の先頭数KBだけを追加で取得し、フィードだと確認できた1本を改めて取得します。Cookieも認証情報も送りません。

保存するもの: ありません。検証はリクエストの中だけで完結し、URL・結果ともデータベース(KV/D1)へ書き込みません。処理が終わった時点でメモリから消えます。

返すもの: 判定と、長さを切ったタイトル・要約・日付・リンクだけです。取得したフィードの原文は再配信しません(このアプリは他サイトの中継として使えません)。記事本文のHTMLはタグを外し、200字までに切ってから表示します。

取得の上限: リダイレクト5回・タイムアウト10秒・読み込み上限はフィード本体512KB/候補の確認4KB。これを超えた分は読みません。

注意: 取得は公開GETのみで、社内ネットワーク・localhost・プライベートIP宛のURLは受け付けません。

APIとして使う

POST /feed-check/api/check に JSON({"url": "https://example.com/feed/"})またはフォームを送ると、同じ検証結果が JSON で返ります。