---
name: link-audit
description: >-
ブログ全記事のリンク保守(一括健診)スキル。外部リンク(出典・公式サイト)の404/ドメイン失効/
恒久リダイレクトを HTTP で一括実査し、内部リンクのファイル存在を確認し、広告・計測リンクは
**HTTPアクセスせず静的検査のみ**(自己クリックの規約違反・クリック統計の汚染を防ぐ)でレポートを出す。
「リンク切れチェック」「リンク保守」「404チェック」「リンク監査」「広告リンク生きてる?」等と言われたとき、
また月1回の定期健診・大型リライト前・収益急落の原因調査時に使う。
記事の修正はしない(検出とレポートのみ・修正は blog-writer と公開前レビューへ)。
---
# link-audit(リンク保守・一括健診)
**なぜ**: 広告リンク切れは成果の消失に直結し、出典リンク切れは信頼(E-E-A-T)を損なう。記事が数十本を超えると手作業の点検は続かないので、機械で全数を健診する。
## ⚠️ 最重要の安全ルール
**広告・計測ドメインへ HTTP リクエストを送らない**(HEAD でもクリックとして計測される恐れがある=自己クリックの規約違反リスク+成果統計の汚染)。
- 送らない相手(DENYLIST)は `config.yaml` の `metrics.affiliate_domains` と `--deny` 引数で決まる。`rel="sponsored"` が付いたリンクも同じ扱い。スクリプトが自動でスキップし、件数と配置だけを静的に集計する
- **DENYLIST を空にして実行しない**。空のまま HTTP 実査を始めようとするとスクリプトが止まる。広告を置いていないサイトだけ `--deny none` を明示する
- 実行前に、サイトで使っている広告・計測サービスのドメインが `metrics.affiliate_domains` にすべて入っているかを運営者に確認する
- 広告リンクの生死確認が必要なときは、各広告サービスの管理画面での確認を運営者に依頼する
- JavaScript がブラウザ側で組み立てる広告リンクは href の走査に出ない(それが正常)。DENYLIST は href に直接書かれたリンクの取りこぼし保険
## 実行手順
1. `config.yaml` を Read し、`paths.public`(走査対象)・`site.domain`・`metrics.affiliate_domains`・`paths.reports` を確認する
2. 実行:
```bash
python -X utf8 scripts/link_check.py --config config.yaml --out {paths.reports}/link_audit_YYYYMMDD.md
```
`--root`・`--base-url` を付ければ config の値より優先される。同一ドメインへは1秒に1リクエスト・HEAD→GET フォールバック・タイムアウト12秒。全記事で数分かかる。
動作確認だけなら `--offline`(HTTP なし・内部リンクと静的検査のみ)や `--limit 5`(ファイル数制限)を使う。
3. レポートを読み、下の基準で仕分けて運営者に報告する。公開フォルダは**読むだけ**
## 結果の仕分け基準
| 区分 | 状態 | アクション |
|---|---|---|
| 🔴 dead | 404 / 410 / DNS 失敗 | 修正必須。代替 URL(公式の新 URL・アーカイブ)を調べて `blog-writer` に差し戻す |
| 🔁 moved | 別 URL へ恒久移動 | リンク先への直リンク化を勧める(リダイレクトの連鎖は遅延と将来のリンク切れの元) |
| ⚠️ 要目視 | 403 / 405 / 429 / timeout / SSL | ボット拒否の可能性が高い。**ブラウザで開いて目視**してから判定する(機械判定だけで修正しない) |
| ⏭️ skipped | 広告・計測ドメイン | 静的検査のみ(件数・配置)。リクエストしていないことを報告に明記する |
## 修正フロー(このスキルは検出まで)
- 記事本文の修正は `blog-writer` へ。リンクの差し替えも軽微修正として扱い、公開前に `article-review` の公開前ゲート(法務レビューとビルド検証)を通す
- 一度に大量に直すときはバッチを分け、対象ファイルを突き合わせてからビルドする
- 公開作業は外向きの操作=実行前に運営者へ確認する
- 月1回を目安に再実行する
MIT ライセンスで配布しています。