{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
Blocked Page Recovery
拉取失败时使用:403/429、付费墙、WAF、反爬墙。
Skill 元数据
| 来源 | 内置(默认安装) |
| 路径 | skills/web/blocked-page-recovery |
| 版本 | 1.0.0 |
| 作者 | Hermes Agent |
| 许可证 | MIT |
| 平台 | linux, macos, windows |
| 标签 | Research, Archives, Wayback, Paywall, WAF, Fallback |
| 相关 skill | grounded-citations |
参考:完整 SKILL.md
以下是 Hermes 在触发该 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。
被拦页面恢复
当页面拉不到——403/429、Cloudflare "Just a moment..."、付费墙或反爬中间页——不要放弃,也不要在同一 URL 上空转。第三方服务常持有页面的副本。沿此阶梯向下,从最便宜的开始。
阶梯
1. Wayback Machine — archive.org "available" API(快照 + 时间戳)
2. archive.today — 域名轮换:archive.ph → .md → .li → .is
3. Jina Reader — 仅当设置了 JINA_API_KEY(实时服务端渲染)
4. API-first pivot — 在同一主机找 /api/、/graphql、.json 或 RSS
5. 真实浏览器 — browser 工具,作为最后、最贵的手段
用随附脚本一次跑完:
python3 scripts/recover_page.py "https://example.com/blocked-article" --json
脚本按顺序尝试每条路线,验证每个正文(见下文"假成功"),打印第一个真正命中及其出处。
出处纪律(不可协商)
每个恢复的副本都带出处,引用时你必须保留:
| 路线 | 出处 | 如何引用 |
|---|---|---|
| Wayback / archive.today | snapshot | 连同快照日期引用:"as archived 2026-08-06"。绝不把快照当作实时页面——它可能过时。 |
| Jina Reader | live | 实时页面的服务端重渲染;正常引用。 |
| 实时拉取 / 浏览器 | live | 正常引用。 |
若用户需要当前数据(价格、库存、突发新闻),快照是上下文而非答案——明确说明并注明其年代。
手动路线
1. Wayback Machine(出处最佳,先试)
# 发现:返回最近快照 URL + 时间戳为 JSON
curl -sL "https://archive.org/wayback/available?url={URL}"
# 然后取 archived_snapshots.closest.url
要枚举多个快照(或恢复已删页面),用 CDX 索引:
curl -sL "https://web.archive.org/cdx/search/cdx?url={URL}&output=json&limit=10"
CDX 在负载下间歇性返回 503——若如此,回退到 available API;不要重试猛打它。
适用于:任何公开爬取的 URL。不适用于:robots 封锁站点、从未爬取的 URL、纯 JS SPA(快照不渲染)。
2. archive.today(付费墙、已删内容)
用户提交的存档——常有 Wayback 没有的付费墙新闻。它限流激进(429)并轮换域名,因此迭代:
for d in archive.ph archive.md archive.li archive.is; do
curl -sL --max-time 20 "https://$d/newest/{URL}" -o ~/.hermes/cache/scratch/page.html \
-w "%{http_code}" && break
done
验证正文,而非状态码——429 仍会吐出几 KB 限流 HTML,单凭大小检查看似成功。
3. Jina Reader(需 JINA_API_KEY)
r.jina.ai 在真实浏览器中服务端重渲染实时页面,返回 markdown。匿名访问已死(401 → Turnstile);需要密钥:
curl -s -H "Authorization: Bearer $JINA_API_KEY" "https://r.jina.ai/{URL}"
处理存档无法处理的 JS SPA。环境变量未设时整条路线跳过。
4. API-first pivot
WAF 对 HTML 表面的保护远比对其后数据端点激进。在一个站点被拦 2-3 次后,停止跟 HTML 较劲,转而找:
- 页面 URL 的
/api/...、/graphql或.json变体 - RSS/Atom feed(
/feed、/rss,或你恢复到的任何副本中的<link rel="alternate">) - 一个
sitemap.xml,暴露可能未被门控的规范 URL
假成功——会撒谎的路线
这些返回 HTTP 200 和看似合理、却不是该页面的正文。脚本自动拒绝;你也手动拒绝:
- Google Cache 已死(2024 年中起)。
webcache.googleusercontent.com返回 200 + 数十 KB,但它是带 JS 重定向的 Google Search 中间页,不是缓存。绝不要用。 - AMP 缓存(
*.cdn.ampproject.org)大多返回约 300 字节的<title>Redirecting</title>meta-refresh 桩,指回原始(被拦)URL。把它当成功会造成拉取循环。 - 限流正文:archive.today 429 页是多 KB HTML。检查目标实际内容(标题词、预期字符串),而非只看大小。
脚本应用的检测启发式:正文低于逐路线字节下限;目标是原主机的 meta-refresh/JS-重定向桩;中间页标题("Just a moment"、"Redirecting"、"Google Search"、"Attention Required")。
代理中继:不要用
通用"web proxy"中继构造上就是中间人。绝不要经它发送 cookie 或 Authorization header,也不要把用户会依赖的任何东西交给它——出处无法验证。优先用存档,它们至少给副本打时间戳。