mcpField
R
read-deleted-pages

read-deleted-pages

github.com/useosint生产力572.0k 次安装12 周前更新
代码仓库

关于 read-deleted-pages

用于通过 Wayback Machine、archive.today、Common Crawl 和 CDX API 检索并评估已删除网页的研究技能,帮助调查人员比较存档版本,并记录捕获局限、可信度和证据保存过程。

主要功能

  1. 01通过 CDX 枚举 URL 并筛选捕获记录
  2. 02获取原始网页存档响应
  3. 03比较不同捕获记录的内容变化
  4. 04跨存档源交叉验证并评定可信度
  5. 05使用 WARC 和哈希保存证据

适用场景

  1. 01找回过往员工、定价或联系方式
  2. 02追踪已删除声明或条款的变更
  3. 03发现遗忘文件和域名历史内容
  4. 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 的 URLWayback,然后是 archive.today覆盖范围不同,删除压力也不同
“这个网站在 X 之前说过什么”使用 collapse=digest 的 Wayback CDX给出内容变更的日期,而不是每次抓取的记录
JS 较多的页面或社交媒体帖子archive.today会抓取渲染后的 DOM;Wayback 通常只会重放一个空壳
Wayback 表示该 URL 被排除archive.today,然后是 Common Crawl两者都不受 Wayback 的排除流程影响
不知道的路径和子域名使用 matchType=domain 的 CDX它是枚举工具,不是查询工具
Wayback 从未抓取过的 URLCommon 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
存档文档和 PDFsecrets-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 尽量减少收集。将大量存档内容转载到已发布的报告中,涉及的是另一项版权问题,与将其用作证据不同。

批量检索会给非营利组织的基础设施带来压力:请对枚举和原始抓取设置速率限制,并且只拉取一次索引,避免重复获取。

评论

支持 Markdown