tools/site-consistency-auditor/README.md
Workspace snapshot · 09/04 13:33
Site Consistency Auditor
ページ単体では正しいのに、サイト全体で見ると矛盾している箇所を洗い出すCLIです。
既存の ogp_check.py が出したJSONを読むだけで、ネットワークへは一切出ません。
なぜ別のツールなのか
ogp_check.py は1ページずつ見て「titleが無い」「og:imageが無い」を判定します。
それは必要ですが、各ページが単体で満点でも起きる事故があります。
/company/ title: 会社概要 canonical: /company/
/about/ title: 会社概要 canonical: /company/
/profile/ title: 会社概要 canonical: /about/ ← canonicalの連鎖
3ページとも単体では「title有り・canonical有り」で合格です。
しかし全体で見ると、同じtitleが3つあり、canonicalが数珠つなぎになっています。
/profile/ は「代表ページは /about/ だ」と言い、その /about/ は「代表ページは /company/ だ」と言う。
サイト自身の宣言が食い違っている状態です。
このツールが見るのは、この「ページ同士の関係」だけです。
使い方
# 1. 既存のチェッカーでページのメタ情報を集める
python ../ogp-bulk-checker/ogp_check.py --file urls.txt --format json --output meta.json
# 2. ページ間の矛盾を見る(ここはネットワーク不要)
python site_consistency.py meta.json
python site_consistency.py meta.json --format markdown --output consistency.md
終了コードは ERRORが1件でもあれば 1、それ以外は 0。
判定項目
| code | 重大度 | 内容 |
|---|---|---|
canonical_chain | ERROR | canonical先がさらに別へcanonicalしている。サイト自身の宣言が矛盾している |
canonical_to_noindex | ERROR | canonical先が noindex。代表ページに指定した先を自分で検索から締め出している |
duplicate_title | WARN | 複数ページが同じtitle |
duplicate_description | WARN | 複数ページが同じdescription |
canonical_cluster | WARN | 複数ページが同じURLへcanonical。そのURLしかインデックスされない |
noindex_page | WARN | meta robots に noindex がある(公開後の消し忘れが多い) |
og_url_canonical_mismatch | WARN | og:url と canonical が食い違う。共有先と検索先が別URLになる |
canonical_target_not_checked | INFO | canonical先が今回の対象URLに含まれておらず、確認できなかった |
URLの比較は、末尾スラッシュ・大文字小文字・フラグメントを無視して行います (クエリは意味を持つことがあるので残します)。
判定の根拠と、根拠が無いこと
Google検索セントラルの重複URLの統合で確認できたのは次の2点です。
- 自己参照canonicalは推奨("Do include a
rel="canonical"link on the canonical page itself")。 必須とは書かれていません。 - canonical目的でのnoindexは非推奨("We don't recommend using noindex to prevent selection of a canonical page within a single site, because it will completely block the page from Search.")。
一方、canonicalが連鎖したときにGoogleが実際どう扱うかは、公式に記載が見つかりませんでした。 上記ページにもcanonicalization troubleshootingにも書かれていません。
そのため canonical_chain を「検索エンジンが辿らない」とは書きません。
言えるのは「サイト自身の宣言が食い違っている」ということだけで、その結果どう扱われるかは
こちらでは分かりません。意図した代表ページが選ばれる保証がない、という理由でERRORにしています。
見ないもの
- 各ページ単体の不足(titleが無い、og:imageが無い等)→
ogp_check.pyの担当 - robots.txt と sitemap の整合 →
robots-sitemap-checkerの担当 - リンク切れ・混在コンテンツ →
link-asset-checkerの担当 - ページの取得。このツールは1リクエストも送りません。
重複を避けるため、各ツールは「片方がやらない」と書いた所だけを持ちます。
必要な環境
Python 3.10以上。外部パッケージ不要(標準ライブラリのみ)。
テスト
python -m unittest discover -s tests
audit() は取得済みの行を引数で受け取る純粋関数で、ネットワークを開かないことをテストで固定しています。
検証状況
- 判定ロジックのオフラインテスト: 同梱済み。ただしこのworkspaceでは実行していません (実行環境にシェルが無いため)。実行結果を伴わない「テスト済み」表示はしません。
- 実サイトのメタ情報を使ったスモークテスト: 未実施
License
MIT. 自分が所有または管理を委任されたサイトにのみ使用してください。
Part of PENGIN Tools — Web制作の面倒な作業を、小さな道具でなくす。