关于 read-deleted-pages
用于通过 Wayback Machine、archive.today、Common Crawl 和 CDX API 检索并评估已删除网页的研究技能,帮助调查人员比较存档版本,并记录捕获局限、可信度和证据保存过程。
主要功能
- 01通过 CDX 枚举 URL 并筛选捕获记录
- 02获取原始网页存档响应
- 03比较不同捕获记录的内容变化
- 04跨存档源交叉验证并评定可信度
- 05使用 WARC 和哈希保存证据
适用场景
- 01找回过往员工、定价或联系方式
- 02追踪已删除声明或条款的变更
- 03发现遗忘文件和域名历史内容
- 04为报告保存带时间戳的证据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ useosint/ skills --skill read-deleted-pages安装后在 Claude Code 中输入/read-deleted-pages确认已加载。
附带文件reference/archive-comparison.mdreference/cdx-cookbook.md
详细介绍
读取已删除的页面
档案之所以有用,是因为删除是在内容发布之后才做出的决定。新手常犯的错误,是把 Wayback Machine 当作一个供人浏览的网站:日历界面一次只显示一个页面,而 CDX API 会列出档案在某个主机下见过的每个 URL,包括没人记得的路径。
先查哪个档案
| 情况 | 去哪里 | 原因 |
|---|---|---|
| 现在返回 404 的 URL | Wayback,然后是 archive.today | 覆盖范围不同,删除压力也不同 |
| “这个网站在 X 之前说过什么” | 使用 collapse=digest 的 Wayback CDX | 给出内容变更的日期,而不是每次抓取的记录 |
| JS 较多的页面或社交媒体帖子 | archive.today | 会抓取渲染后的 DOM;Wayback 通常只会重放一个空壳 |
| Wayback 表示该 URL 被排除 | archive.today,然后是 Common Crawl | 两者都不受 Wayback 的排除流程影响 |
| 不知道的路径和子域名 | 使用 matchType=domain 的 CDX | 它是枚举工具,不是查询工具 |
| Wayback 从未抓取过的 URL | Common Crawl | 爬虫独立,种子也不同 |
| 区域性内容或国家顶级域名内容 | Memento 聚合器,然后是国家档案 | 一些国家档案提供全文搜索 |
| 不能丢失的证据 | 自行抓取,然后提交给两个档案 | 没有其他人会替你保存 |
各来源的覆盖范围和删除政策: reference/archive-comparison.md。
CDX API 才是真正的工具
CDX 服务会为每条抓取记录建立索引——每次抓取对应一行——并允许你筛选、合并和枚举记录。它会列出爬虫在某个主机下见过的每个 URL,并去重:
curl -s 'http://web.archive.org/cdx/search/cdx?url=example.com/*&output=json&fl=original&collapse=urlkey' \
| jq -r '.[1:][] | .[0]' | sort -u
使用 output=json,而不是默认的文本格式:它能正确处理包含空格和引号的 URL,而文本格式会把它们弄乱。第一行 JSON 是列名表头,不是抓取记录——因此要用 .[1:]。
四个参数几乎能完成所有工作:
matchType—exact、prefix、host或domain。matchType=domain会返回主机及其所有子域名,经常能发现早已从 DNS 消失的暂存、旧版和内部主机。将它们交给find-hidden-subdomains。filter=<field>:<regex>,可用!反转,也可组合使用。使用statuscode:200筛选返回了内容的抓取记录,或使用!mimetype:text/html找出文档、档案和配置文件。- **
from/to`` 接受任意精度的时间戳前缀——from=2019、from=201903`——因此你可以围绕已知事件圈定时间范围。 collapse会抑制共享某个字段的相邻行。collapse=urlkey是枚举时的常用方式;collapse=digest尤其重要。
digest 会对抓取的内容进行哈希,因此 collapse=digest 会将页面历史缩减为内容实际发生变化的抓取记录。400 条抓取记录会变成 6 行,而这 6 个日期就是整个故事。
curl -s 'http://web.archive.org/cdx/search/cdx?url=example.com/about/team&output=json&collapse=digest&fl=timestamp,digest,statuscode'
完整参数、分页和可直接使用的枚举流程:reference/cdx-cookbook.md。
重放内容不等于抓取内容
web.archive.org/web/<timestamp>/<url> 中的页面是重建出来的。档案会注入工具栏,将链接和资源引用改写回档案中——而最容易误导人的地方是,它会从最接近的抓取记录中拉取每个资源,这些记录可能比你请求的 HTML 早几个月。你截图中的渲染页面可能从未真实存在过。
在时间戳后附加 id_,即可获取未经注入和改写的原始档案响应:
curl -s 'https://web.archive.org/web/20190412093000id_/http://example.com/pricing' > pricing-2019.html
凡是要解析、哈希、比较差异或引用的内容,都应使用 id_。某个页面重放后显示为空白,并不代表它没有被正常抓取,因此在断定档案中什么都没有之前,先获取原始响应——但如果档案中的 JavaScript 在页面显示时调用了 API,背后就不会有数据,因为 API 响应从未被抓取过。这类页面天生就是空壳,并非抓取失败造成的。
实际上能还原什么
从 collapse=digest 列表中提取两个日期的原始抓取内容,并将它们作为文本进行比较。被删除的内容就是证据:某人在两个日期之间从团队页面上消失,说明此人已离职,且可确定一个日期范围;同时,这也是一个失去了继续保持忠诚的理由的 find-anyone 线索。实际可发现的内容包括:
- 员工和团队页面。 现行网站列出当前在职人员;存档则列出曾经在职的所有人,包括职位、简介,以及组织改用联系表单之前常见的直接电子邮件地址。
- 过往定价和条款——当时的收费、承诺内容,以及争议开始当日的退款政策。还包括被删除的帖子和新闻稿:双方不再提及的合作关系、融资或客户。
- 旧联系信息。 后来被表单取代的电话号码、街道地址和具名联系人。可直接用于
whose-number-is-this。 - 删改前的文案。 将完整发布的页面与后续编辑版本进行比对,就能准确看出有人花钱请律师删除了哪些词——这是非常强烈的重要性信号。
- 被遗忘的文件——曾经被索引、却从未清理的文档路径、备份文件名和管理界面。参见
secrets-in-git-history。 - 域名的前任所有者。 如果域名易主,其存档历史会显示另一家企业——这是发现声誉洗白式收购最快的方法。
进一步查看前先保存证据
你发现的任何内容都可能被删除,而调查有时会导致内容被删除。先抓取,再分析。
将在线 URL 提交到 Internet Archive 的 Save Page Now(https://web.archive.org/save/)和 archive.today,让两个独立机构保存一份带时间戳、并非由你创建的副本。然后自行留档:WARC 会保留包括标头在内的完整 HTTP 交互,而截图不会。
wget --warc-file=evidence-001 --page-requisites --no-parent https://example.com/pricing
sha256sum evidence-001.warc.gz | tee evidence-001.sha256
记录抓取时间(UTC)、实际请求的 URL,以及哈希值。单独的截图证明力很弱——很容易伪造,也不含标头。第三方存档 URL 加上你自己计算哈希的 WARC,则具有很强的证明力,因为二者可以相互佐证,且其中一份不受你控制。这正是 write-the-intel-brief 所要求的。
验证抓取内容是否真实
任何人都可以向存档提交内容:Save Page Now 和 archive.today 都接受匿名提交者提供的任意 URL。抓取内容只能证明该 URL 曾在那个时间向该爬虫提供这些内容,不能证明是谁控制了该 URL。现实中可行的伪造途径包括:
- 伪造存档页面截图。 轻而易举。绝不要接受存档页面的截图;应直接查看存档 URL 并重新抓取。
- 通过 URL 注入内容。 反射式查询参数、用户生成内容路径或开放重定向,都能让人把攻击者选择的文本存档到看起来合法的域名上。逐字符检查
original字段:留意?或#之后的任何内容、不熟悉的路径片段,以及仿冒主机名。 - 在域名易主后抓取。 当时域名属于买家,而非原企业。使用
who-owns-this-domain,将过户日期与抓取时间戳进行比对。 - 选择性抓取——某个真实页面仅上线 11 分钟,随后由发布该页面的人将其存档。
按证据强弱排序的交叉验证方法:使用 statuscode 200 和 digest 确认该记录独立存在于 CDX 索引中;查找相邻抓取记录,并确认它们由存档站点自己的爬虫抓取,而非按需提交,因为爬虫抓取更难伪造;检查另一家独立存档机构在相近日期的记录;检查它是否与该网站的其他历史记录一致。没有相邻记录的孤立按需抓取,只是提交者的一面之词。
容易出错之处
- 没有记录不代表没有发生。 没有抓取记录,可能是页面未被链接、被 robots 屏蔽、位于登录后、太隐蔽而难以抓取,或已被移除——并不意味着页面从未存在。写下“没有记录”之前,先检查两个存档。
- 排除容易被误认为不存在。 明确的排除通知意味着有人采取了行动;普通的 404 则毫无意义。这是不同的事实——请注明你遇到的是哪一种。
- 追溯删除。 Wayback 历来会将网站当前的
robots.txt应用于其全部存档历史,因此新的Disallow可能一次性撤下多年的抓取记录——这让购买过期域名再配上限制性robots.txt成为掩盖网站过往的低成本手段。这种做法的适用范围已缩小,但如果某段历史看起来过于干净,请查阅 archive.today 和 Common Crawl。 - 混合时间的页面呈现。 资源日期不一,意味着呈现出来的页面是重建的。请引用 HTML 抓取时间戳,而不是“页面当时的样子”。
- 抓取时间不等于发布时间。 页面 3 月才首次被抓取,可能 1 月就已发布。抓取时间只能确定日期的上限。
- 动态和个性化内容。 爬虫看到的只是一个版本——某个地区、某个 A/B 分组,或未登录状态下的版本。价格和库存尤其如此。
- 稀疏采样会掩盖一切。 页面一年抓取两次,期间可能发生变化又恢复,毫无痕迹;
collapse=digest展示的是观察到的变化,而非所有变化。时间戳采用 UTC,忘记这一点会让时间线错开一天。
可信度分级
- 已确认——由爬虫主动发起的抓取,
statuscode:200,通过id_获取原始内容,URL 已核实属于该主体,并由第二个存档或同一抓取序列中的相邻抓取记录佐证。 - 很可能——单条格式完整的 Wayback 抓取记录,没有第二个来源;或者 archive.today 的抓取内容与网站的其他历史记录一致。
- 未确认——没有相邻记录的按需抓取;带有查询参数或用户生成内容路径的 URL;截图;从重建后的回放而非原始响应中读取的内容。
- 已排除——抓取时该 URL 不受该主体控制,或抓取发生在域名转让后,却被说成是前任所有者的内容。
请引用包含时间戳的完整存档 URL、原始 URL、UTC 抓取时间,以及获取方式。没有时间戳的存档引用不算引用。
示例
某供应商的网站声称获得了行业认证。客户端希望在签约前核实这一说法。
对认证页面使用 collapse=digest,会显示六年间有九次内容变更。最近一次变更前后的原始抓取记录显示,认证机构的名称从一家知名认证机构变成了一家名称相似的实体,期间没有任何公告。
陷入僵局:认证机构自己的名录中也没有在册记录,其存档会员名录回放时则是空壳。使用 id_ 获取这些页面后,原因就明白了——名录是通过 API 调用在客户端渲染的,因此爬虫抓取到的页面没有任何数据。这里没有可恢复的内容。
随后,对 matchType=domain 进行 CDX 枚举,发现一个存有原始证书存档 PDF 的暂存主机。其元数据中的到期日比当前网站声称的覆盖期限早两年,而 secrets-in-file-metadata 从同一文件中提取到了作者姓名。
分级:措辞变更已确认——两条爬虫抓取记录,均读取了原始内容。认证失效很可能——只有一份文件,没有认证机构的确认。
线索转向
| 新线索 | 转到 |
|---|---|
| 前员工的姓名、职位和简介 | find-anyone、pattern-of-life-from-socials |
| 表单前联系人页面中的电子邮件地址 | what-an-email-reveals |
| 电话号码和街道地址 | whose-number-is-this |
| 通过 CDX 枚举找到的子域名和主机 | find-hidden-subdomains、who-owns-this-domain |
| 存档文档和 PDF | secrets-in-file-metadata |
| 存档图片 | find-the-original-image、geolocate-from-pixels |
| 被遗忘的路径和暴露的文件名 | google-like-a-spy、secrets-in-git-history |
| 域名此前的企业身份 | x-ray-a-company、who-really-owns-it |
| 编辑和删除的时间线 | write-the-intel-brief、graph-the-network |
法律与处理注意事项
读取存档属于被动操作;访问的是存档服务器,而非目标。针对实时网站访问恢复出的路径并非被动操作,而且会在目标的日志中留下记录——请谨慎决定要进行哪种操作。
存档中的个人数据仍然是个人数据。因被遗忘权请求而删除的内容可能仍保存在存档中,重新发布这些内容可能会产生原本希望通过删除消除的法律责任。请权衡调查需要与删除原因,并按照 ../../ETHICS.md 尽量减少收集。将大量存档内容转载到已发布的报告中,涉及的是另一项版权问题,与将其用作证据不同。
批量检索会给非营利组织的基础设施带来压力:请对枚举和原始抓取设置速率限制,并且只拉取一次索引,避免重复获取。