{/* 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
相关 skillgrounded-citations

参考:完整 SKILL.md

INFO

以下是 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.todaysnapshot连同快照日期引用:"as archived 2026-08-06"。绝不把快照当作实时页面——它可能过时。
Jina Readerlive实时页面的服务端重渲染;正常引用。
实时拉取 / 浏览器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,也不要把用户会依赖的任何东西交给它——出处无法验证。优先用存档,它们至少给副本打时间戳。