SKILL.md
readonly只读
name
seo-drift
description
SEO漂移监控:捕获SEO关键元素的基线,检测变化,并随时间追踪回归。SEO的Git:对页面SEO进行基线、差异和变更追踪。当用户提到“SEO漂移”、“基线”、“追踪变化”、“是否出问题”、“SEO回归”、“比较SEO”、“前后对比”、“监控SEO变化”或“部署检查”时使用。
SEO漂移监控(2026年4月)
SEO的Git。捕获基线,检测回归,随时间追踪变化。
命令
| 命令 | 用途 |
|---|---|
/seo drift baseline <url> |
捕获当前SEO状态作为“已知良好”的快照 |
/seo drift compare <url> |
将当前页面状态与存储的基线进行比较 |
/seo drift history <url> |
显示变更历史和过去的比较结果 |
捕获内容
每个基线记录以下SEO关键元素:
| 元素 | 字段 | 来源 |
|---|---|---|
| 标题标签 | title |
parse_html.py |
| 元描述 | meta_description |
parse_html.py |
| 规范URL | canonical |
parse_html.py |
| Robots指令 | meta_robots |
parse_html.py |
| H1标题 | h1(数组) |
parse_html.py |
| H2标题 | h2(数组) |
parse_html.py |
| H3标题 | h3(数组) |
parse_html.py |
| JSON-LD架构 | schema(数组) |
parse_html.py |
| Open Graph标签 | open_graph(字典) |
parse_html.py |
| 核心网页指标 | cwv(字典) |
pagespeed_check.py |
| HTTP状态码 | status_code |
fetch_page.py |
| HTML内容哈希 | html_hash(SHA-256) |
计算所得 |
| 架构内容哈希 | schema_hash(SHA-256) |
计算所得 |
比较工作原理
比较引擎应用3个严重级别的17条规则。加载references/comparison-rules.md获取完整规则集,包括阈值、建议操作和跨技能参考。
严重级别
| 级别 | 含义 | 响应时间 |
|---|---|---|
| 严重 | 破坏SEO的变更,可能导致流量损失 | 立即 |
| 警告 | 潜在影响,需要调查 | 1周内 |
| 信息 | 仅用于知晓,可能是故意的 | 方便时审查 |
存储
所有数据本地存储在SQLite中:
~/.cache/claude-seo/drift/baselines.db
表
- baselines:捕获的快照,包含所有SEO元素
- comparisons:差异结果,包含触发的规则和严重级别
URL规范化确保一致匹配:小写协议/主机,去除默认端口(80/443),排序查询参数,移除UTM参数,去除尾部斜杠。
命令:baseline
捕获页面的当前状态并存储。
步骤:
- 验证URL(通过
google_auth.validate_url()进行SSRF防护) - 通过
scripts/fetch_page.py获取页面 - 通过
scripts/parse_html.py解析HTML - 可选通过
scripts/pagespeed_check.py获取CWV(使用--skip-cwv跳过) - 对HTML正文和架构内容进行哈希(SHA-256)
- 将快照存储到SQLite
执行:
claude-seo run drift_baseline.py <url>
claude-seo run drift_baseline.py <url> --skip-cwv
输出: JSON,包含基线ID、时间戳、URL和捕获元素的摘要。
命令:compare
获取当前页面状态并与最近的基线进行差异比较。
步骤:
- 验证URL
- 从SQLite加载最近的基线(或指定
--baseline-id) - 获取并解析当前页面状态
- 运行所有17条比较规则
- 按严重级别分类发现
- 存储比较结果
- 输出JSON差异报告
执行:
claude-seo run drift_compare.py <url>
claude-seo run drift_compare.py <url> --baseline-id 5
claude-seo run drift_compare.py <url> --skip-cwv
输出: JSON,包含所有触发的规则、旧值/新值、严重级别和操作。
比较后,提供生成HTML报告的选项:
claude-seo run drift_report.py <comparison_json_file> --output drift-report.html
命令:history
显示某个URL的所有基线和比较结果。
执行:
claude-seo run drift_history.py <url>
claude-seo run drift_history.py <url> --limit 10
输出: JSON数组,包含基线(最新的在前),带有时间戳和比较摘要。
跨技能集成
当检测到漂移时,推荐相应的专业技能:
| 发现 | 推荐 |
|---|---|
| 架构被移除或修改 | 运行/seo schema <url>进行完整验证 |
| CWV回归 | 运行/seo technical <url>进行性能审计 |
| 标题或元描述更改 | 运行/seo page <url>进行内容分析 |
| 规范URL更改或移除 | 运行/seo technical <url>进行可索引性检查 |
| 添加了noindex | 运行/seo technical <url>进行可爬性审计 |
| H1/标题结构更改 | 运行/seo content <url>进行E-E-A-T审查 |
| OG标签被移除 | 运行/seo page <url>进行社交分享分析 |
| 状态码变为错误 | 运行/seo technical <url>进行全面诊断 |
错误处理
| 场景 | 操作 |
|---|---|
| URL不可达 | 报告来自fetch_page.py的错误。不要猜测状态。建议用户验证URL。 |
| URL没有基线 | 告知用户并建议先运行baseline。 |
| SSRF被阻止(私有IP) | 报告validate_url()拒绝。绝不绕过。 |
| SQLite数据库缺失 | 首次使用时自动创建。无错误。 |
| CWV获取失败(无API密钥) | 将CWV字段存储为null。比较时跳过CWV规则。 |
| 页面返回4xx/5xx | 仍然作为基线捕获(状态码是跟踪字段)。 |
| 存在多个基线 | 使用最近的,除非指定了--baseline-id。 |
安全
- 所有URL获取都通过
scripts/fetch_page.py进行,该脚本强制执行SSRF防护(阻止私有IP、回环地址、保留范围、GCP元数据端点) - 不使用curl,不进行子进程HTTP调用——仅使用项目验证过的获取管道
- 所有SQLite查询使用参数化占位符(
?),绝不使用字符串插值 - 始终验证TLS——管道中任何地方都没有
verify=False
典型工作流
部署前/后检查
/seo drift baseline https://example.com # 部署前
# ... 部署进行中 ...
/seo drift compare https://example.com # 部署后
持续监控
/seo drift baseline https://example.com # 初始捕获
# ... 数周后 ...
/seo drift compare https://example.com # 检查漂移
/seo drift history https://example.com # 查看所有变更
调查流量下降
/seo drift compare https://example.com # 什么变了?
/seo drift history https://example.com # 何时变的?






