← CLAUDE-PENGIN-TOOLS
DOCUMENT · 4.8 KB

tools/link-asset-checker/README.md

Workspace snapshot · 09/04 13:33

Link & Asset Checker

公開したページに、リンク切れ・混在コンテンツ・消し忘れたステージングURLが残っていないかを1コマンドで確認するCLIです。

指定したページだけを取得します。クロールはしません。 自分が管理しているサイトに使ってください。

いちばん拾いたいケース

<script src="http://staging.example.com/app.js"></script>

ステージングのURLが本番に残っている。ブラウザでは「なんとなく動いている」ように見えることがあり、 気づくのは、その環境を止めた日か、混在コンテンツで鍵マークが消えた日です。

このツールは、これをリンク切れになる前に、ホスト名の時点で落とします。

使い方

python link_asset_check.py https://example.com/
python link_asset_check.py https://example.com/ https://example.com/about/
python link_asset_check.py --file pages.txt --output report.json
python link_asset_check.py https://example.com/ --forbidden-host preview.client.example

--file は1行1URLのテキスト(# で始まる行はコメント)。 終了コードは ERRORが1件でもあれば 1、それ以外は 0。公開前チェックやCIに挟めます。

出力例:

{
  "pages_checked": 1,
  "urls_checked": 34,
  "findings": [
    {
      "severity": "ERROR",
      "code": "forbidden_host",
      "kind": "script",
      "url": "http://staging.example.com/app.js",
      "message": "points at a local or staging host and must not be live"
    },
    {
      "severity": "ERROR",
      "code": "unreachable_url",
      "kind": "link",
      "url": "https://example.com/old-page/",
      "message": "status=404 error=Not Found"
    }
  ],
  "errors": 2,
  "warnings": 0,
  "ok": false
}

判定項目

code重大度内容
forbidden_hostERRORlocalhost / 127.0.0.1 / staging. stg- dev. test. で始まるホスト / .local .test、および --forbidden-host で指定したホスト
mixed_content_activeERRORhttpsページ上で script / stylesheet / iframe / form action がhttp。ブラウザがブロックします
unreachable_urlERRORリンク・画像・スクリプト等が400以上、または接続できない
page_unreachableERROR指定したページ自体が200を返さない
mixed_content_passiveWARNhttpsページ上で画像・動画・音声がhttp。ブロックまたは自動アップグレードされうる
protocol_relativeINFO//example.net/a.js 形式。解決はされるがスキームが読めない

ステージングURLは forbidden_host として1件だけ報告します。同じURLを混在コンテンツとしても 二重に数えません。直す場所は1つなので、指摘も1つにしています。

何を見て、何を見ないか

見るもの: a[href] / img[src]・srcset / script[src] / link[rel=stylesheet]・icon / iframe[src] / form[action] / video・audio・source。

見ないもの:

  • CSSや JavaScript の中に書かれたURL(background-image: url(...) など)。HTMLの属性だけを見ます。
  • JavaScriptで後から差し込まれる要素。取得したHTMLがすべてです。
  • ページの内容の正しさ、表示崩れ、アクセシビリティ。
  • リンク先の中身。到達できるかだけを見ます。
  • robots.txt と sitemap の整合性 → こちらは robots-sitemap-checker の担当です。

他人のサイトに向けないでください

指定したページを順に取得します。既定で1リクエストごとに 0.3 秒空け(--delay)、 1回あたり最大500URLまでにしています。それでも、自分が所有または管理を委任されたサイト以外へ 向けることは想定していません。

必要な環境

Python 3.10以上。外部パッケージ不要(標準ライブラリのみ)。

テスト

python -m unittest discover -s tests

ネットワークへ出ずに判定ロジックだけを検証します。 analyze_page() はHTML文字列を受け取る純粋関数なので、実サイトを叩きません。

検証状況

  • 判定ロジックのオフラインテスト: 同梱済み。ただしこのworkspaceでは実行していません (実行環境にシェルが無いため)。実行結果を伴わない「テスト済み」表示はしません。
  • 実サイトに対するスモークテスト: 未実施

License

MIT. 自分が所有または管理を委任されたサイトにのみ使用してください。

Part of PENGIN Tools — Web制作の面倒な作業を、小さな道具でなくす。