{/* 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. */}

Unbroker

自动从数据经纪商网站移除你的信息。

Skill 元数据

来源可选 — 通过 hermes skills install official/security/unbroker 安装
路径optional-skills/security/unbroker
版本1.0.0
作者SHL0MS (github.com/SHL0MS)
许可证MIT
平台linux, macos, windows
标签privacy, data-broker, opt-out, ccpa, gdpr, security, doxxing
相关 skillgoogle-workspace, agentmail, himalaya, scrapling, osint-investigation

参考:完整 SKILL.md

INFO

以下是 Hermes 在触发此 skill 时加载的完整 skill 定义。这是 skill 激活时 agent 所看到的指令内容。

unbroker

查找一个人的个人信息(姓名、地址、电话、邮箱、亲属)在哪些数据经纪商和人肉搜索网站上被曝光,然后将其移除——能自动的就自动处理;仅在某个网站要求 CAPTCHA、政府证件、电话或传真时,才给出有引导的人工步骤。可独立管理多个人。它不会绕过反机器人系统,不会在无记录同意的情况下对任何人采取行动,也不会移除公共记录(选民/房产/法庭)或该人自己控制的账号。

Python CLI(scripts/pdd.py)持有确定性状态——配置、档案 + 同意、经纪商数据库、分档规划、台账、草稿、报告、邮件发送(SMTP)、验证链接轮询(IMAP)以及自主动作队列(next)。由你(agent)用原生工具做扫描和表单驱动:用 web_extract 和 browser_navigate 做搜索与网页表单,用 cronjob 做周期性重扫。

自主契约

此 skill 设计为无人值守运行。在录入(+ 记录同意)之后,恰好只有两个合法的人工接触点:(1) 录入对话本身;(2) 运行结束时一次汇总的人工任务摘要($PDD tasks)。在二者之间:

  • 绝不请操作者选择配置。 $PDD setup --auto 自行检测能力并选出最自主的有效配置。
  • 在 autonomy=full(默认)下,绝不于单次提交前暂停:录入时记录的同意就是对 T0-T2 退出操作的常设授权。(autonomy=assisted 为谨慎的操作者恢复逐次提交确认——遵守 next 输出中的 confirm_first 标志。)
  • 绝不因仅有人工可做的工作而中断运行。 记录它(record ... human_task_queued --reason "...")然后继续;所有这些最后一次性汇总。
  • 把整轮运行当作对 $PDD next <subject> 的循环来驱动——它返回此刻应按序执行的确切动作(扫描、轮询验证、复查、先退父站、重新入队被阻塞项),外加人工摘要。执行每个动作、记录结果、重跑 next、重复直到 done_for_now。然后呈现摘要、报告,并安排 cron。

自主权永不逾越的硬限制:无记录同意不行动、披露不超出 disclosure_fields、不绕过 CAPTCHA/反机器人、仅在验证性重扫后才标 confirmed_removed。

何时使用

  • “把我的(或我家人的)数据从数据经纪商/人肉搜索网站移除。”
  • “让我退出”、“把我从 Spokeo/Whitepages 等删除”、“人肉搜索后清理一下。”
  • “设置周期性隐私监控”(经纪商会重新收录人)。
  • 检查哪些经纪商仍在曝光某人以及原因。

前置要求

  • python(仅标准库;核心引擎无需额外包)。
  • 可选升级(不装这些 skill 也能零配置工作;setup --auto 会开启它检测到的每一项,从 shell 环境以及 $HERMES_HOME/.env 读取凭据,从而复用 Hermes 已为自身工具加载的密钥,无需重新 export——每一项都把一类人工任务转化为 agent 动作):
    • 云浏览器(推荐默认):BROWSERBASE_API_KEY。 只要密钥存在,setup --auto 就会选它,这是预期基线:一个真实住宅 IP 的云浏览器会在正常操作中清除软/托管型 CAPTCHA(Cloudflare Turnstile、hCaptcha/reCAPTCHA 复选框),于是这些经纪商保持自动化(T1),而不变成人工任务。这不是 CAPTCHA“破解”——没有打码服务、没有指纹伪装;只有浏览器确实过不了的交互式/行为式(“硬”)挑战才回退为人工任务。没有密钥时,使用普通 agent 浏览器,软 CAPTCHA 经纪商降为 T2(人工)。
    • 邮件自动化,两种选项:
      • 浏览器模式(无密码):setup --email-mode browser。 agent 通过操作者已登录的网页邮箱、用 browser_* 工具发送退出/CCPA 邮件并打开验证链接。不存储任何东西。这要求把 Hermes 指向操作者自己已登录的浏览器,而不是云浏览器:无头云浏览器(Browserbase)没有网页邮箱会话,且它自己在网页邮箱和会话绑定的经纪商关卡上(如 PeopleConnect 引导模式)会被 Cloudflare/DataDome 拦截。通过 CDP 驱动操作者真实的 Chrome——启动 chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.hermes/chrome-debug"(一个专用调试 profile,登录一次网页邮箱,不是 Default profile),把浏览器工具连到 127.0.0.1:9222。$PDD cdp 会替你启动它(找到 Chrome/Chromium/Brave/Edge、用专用 profile detached 启动、打印 CDP 端点;--check 测试、--print 输出命令)。见 references/methods.md -> “Browser backends: scan vs execute”。收件箱不可达时回退为邮件草稿。
      • SMTP/IMAP(存储凭据):EMAIL_ADDRESS + EMAIL_PASSWORD(非主流服务商另加 EMAIL_SMTP_HOST / EMAIL_IMAP_HOST;gmail/outlook/yahoo/icloud/fastmail 自动推断)。CLI 通过 send-email 发送、通过 poll-verification 读取验证链接。agentmail skill(逐经纪商别名)也可。
    • Google Sheets 跟踪表:google-workspace skill。
    • scrapling skill 用于隐身/Cloudflare 保护页面。

如何运行

全部通过 terminal 工具运行。在本 skill 目录下:

PDD="python scripts/pdd.py"

引擎把数据存在 $PDD_DATA_DIR(默认 $HERMES_HOME/unbroker),权限 0600。通过 terminal 运行,不要用 execute_code(那个沙箱会清洗环境变量并脱敏输出,导致无法读取档案)。

快速参考

命令用途
$PDD setup --auto自主设置:检测能力,选出最自主的有效配置(不提问)
$PDD doctor就绪检查:配置、经纪商数量、哪些升级已开/可用
$PDD cdp [--check] [--print] [--port N]通过 CDP 启动/检测操作者的 Chrome,用于第二阶段浏览器 + 网页邮箱(专用调试 profile;发送网页邮箱、清除会话绑定关卡的可靠方式)
$PDD intake --full-name "..." [--alias ...] [--email ... --phone ...] [--city --state] [--prior-location "City,ST"] --consent创建一个已同意主体;采集别名 + 多个邮箱/电话 + 曾居地;打印 subject_id
$PDD next <subject>自主循环驱动器:此刻应做的有序 agent 动作 + 人工摘要 + next_wake_at
$PDD brokers [--priority crucial]列出人肉搜索经纪商数据库(精选 + 实时)
$PDD refresh-brokers拉取最新 BADBOOL 人肉搜索列表以及加州数据经纪商注册处(缓存过期时 next 会自动重新入队)
$PDD registry [--search NAME]各州注册处覆盖(CA 已录入约 545 个;VT/OR/TX 门户已列出);走 DROP/邮件通道,不扫描
$PDD drop <subject> [--filed]一次性法律杠杆:一份加州 DROP 请求即可从所有注册经纪商删除;--filed 记录它
$PDD plan <subject> [--priority crucial]逐经纪商的分档 + 方法 + search_vectors + 确切要披露的字段
$PDD plan <subject> --batchReduce 视图:叠加台账状态,按下一动作分组经纪商(未扫描/已找到/间接/受阻/进行中/完成),折叠归属簇,按 found 簇父站优先排序并给出定制 parent_playbook,打印 next_actions
$PDD fanout <subject> [--priority crucial] [--size 5]把经纪商批量分发给并行 delegate_task 子 agent(大规模运行自动分发;每批 5 个——8+ 会超时)
$PDD record <subject> <broker> <state> [--found true] [--evidence JSON] [--disclosed F --channel C] [--reason "..."]更新台账(带校验的状态机);自动盖 next_recheck_at 时间戳
$PDD show <subject> <broker>读回一个案例的记录状态 + 证据 + 披露日志(让父 agent 复核子 agent 的 found,而不必重新推导列表 URL)
$PDD send-email <subject> <broker> --listing <url> [--kind ccpa_indirect ...]渲染 + 记录请求(收件人锁定为该经纪商自己的地址)。browser 模式返回 compose 负载通过网页邮箱发送(无密码);programmatic 模式走 SMTP 发送
$PDD verify-link <subject> <broker> --text '<body>'browser 模式:从你读到的网页邮箱正文中提取经纪商的验证链接(带反钓鱼评分)
$PDD poll-verification <subject> [--broker <id>]programmatic 模式:轮询 IMAP 找验证链接(带反钓鱼评分);自动推进 submitted → verification_pending
$PDD render-email <subject> <broker> --listing <url>仅草稿(未配置邮件模式时的回退)
$PDD due <subject>复查窗口已到的案例(cron 重扫队列)
$PDD tasks <subject>一次汇总的人工任务摘要(在运行结束时呈现)
$PDD status <subject>Markdown 状态报告
$PDD report <subject> --sheets供 Google Sheets 跟踪表使用的行

批量操作(两阶段:先爬全部,再删除)

只要超过两三家经纪商,就按 map → reduce → act 运行,而不是逐家处理:

  • 阶段 1 - DISCOVER(只读、并行、幂等)。 先爬每一家经纪商并为每家记录结论(found / not_found / indirect_exposure / blocked)。扫描无副作用,因此可安全并行和重试。在行动之前拿到完整曝光图,才能解锁下面的簇去重和优先级排序。默认:父 agent 直接驱动 web_extract 探测——大多数人肉搜索网站把姓名/电话/地址结果渲染为静态 HTML,web_extract 几秒即可读完。仅对极少数纯 JS 站点才升级到 browser_*,仅对真正重推理的工作(大规模同名/亲属消歧)才升级到 delegate_task 子 agent。不要把一大串经纪商列表交给一个浏览器工具集子 agent 去爬——实战中它反复超时(600s、每家约 5-6 个、无摘要),因为浏览器导航很重;存活下来的台账写入成本是父 agent web_extract 的 10 倍。blocked(DataDome/Cloudflare/antibot)站点也不是子 agent 的活:记录 blocked 并把它重新入队,等隐身/云浏览器(Browserbase)那一遍来处理。子 agent 报告是自报——父 agent 会重新抓取关键 URL 确认 found 后才采信(双向都有效:它曾抓到一条父 agent 误判为误报的真实列表)。
  • REDUCE - $PDD plan <subject> --batch。 把爬取结果折叠成面向阶段的计划:按下一动作分组,折叠归属簇(一次父站清除即可连带清掉子站,是一个动作而非 N 个——例如一次 Intelius/PeopleConnect 抑制即可覆盖 Truthfinder/Instant Checkmate/US Search/……),并打印 next_actions。只要还有未扫描项,phase 就是 discover,否则为 delete。
  • 阶段 2 - DELETE(顺序执行、不可逆)。 按 reduce 后的组先父后子处理:plan --batch 把 found 组按簇父站优先(覆盖子站最多的先做)排序,并为每个父站给出定制的、带顺序的 parent_playbook——遵循那个顺序和步骤(完整配方见 references/methods.md -> “Ownership clusters - DO PARENTS FIRST”)。先做簇父站(跳过被覆盖的子站),每个父站确认后重扫其子站(它们通常随之消失),再处理独立列表;把 indirect_exposure 案例作为 CCPA/GDPR 删 PII 邮件发出(send-email --kind ccpa_indirect),把 blocked 推迟到隐身浏览器那一遍。退出操作会遇到 CAPTCHA、邮件验证循环和会话绑定——逐个、谨慎处理(这与 fan-out 相反),但在 autonomy=full 下不要每次提交都停下来请求许可;assisted 模式则逐次确认。在经纪商同时提供删除和抑制时,通常优先删除(Spokeo/BeenVerified)——但要遵循记录的 deletion.prefer:PeopleConnect 是例外(prefer: false),删除你的用户数据会移除你的抑制且不能阻止公共记录重新收录,因此应改为抑制并维护。
  • 盲退是默认,不是回退。 在每个有可达移除通道的站点都提交退出/删除,即使尚未先确认到列表——它只把主体自己的标识符披露给该经纪商自己的官方通道,因此不违反最小披露。两个推论:(1) 一个匹配 email+DOB+姓名后说“无结果”的引导流程,是比任何抓取都更强的 not_found——退出流程同时充当了搜索;(2) 当表单对自动化不友好(硬 CAPTCHA、Cloudflare/DataDome、滑动验证),默认走该经纪商列明的权利请求邮箱(仅姓名+州+联系邮箱),而不是记录 blocked。CAPTCHA 政策:绝不破解行为式/令牌式/滑块式挑战;在主体自己的退出操作中,可以读一个静态扭曲文字或纯算术 CAPTCHA,但如果答对后站点仍拒绝整次提交(说明它在做自动化指纹识别),就停下。第三方/间接记录是例外——仍需先确认再行动。逐站点打法 + 元搜索 no-op 跳过表见 references/site-playbooks.md;完整政策见 references/methods.md。
  • PeopleConnect 删除会清空抑制(永久规则)。 PeopleConnect 的删除会清掉抑制,主体会在整个 affiliate 簇里被重新收录。如果出现一封“Your deletion request for PeopleConnect.us is Complete”邮件,说明抑制已没了 -> 重新执行抑制并重新验证 Control 步骤显示为“suppressed”。绝不要把这个簇留在已完成删除状态(见 references/brokers/intelius.json)。

子 agent 报告是自报:父 agent 在记录 found 之前、以及任何删除之前,都会复核关键主张(列表 URL、匹配依据)。

流程(自主循环)

  1. 设置(一次,不提问)。 运行 $PDD setup --auto——它自行检测能力并配置最自主的有效组合(有 EMAIL_* 凭据就用程序化邮件,有 Browserbase 密钥就用它,有 age 二进制就用 age 加密,autonomy=full)。然后 $PDD doctor,把就绪输出展示给操作者仅作告知,不作提问——立即继续。提一句什么能解锁更多自动化(如邮件凭据),但不要等。

  2. 录入 + 同意(唯一一次人工对话)。 带 --consent(和 --consent-method)运行 $PDD intake ...。没有同意,引擎拒绝规划或行动。一趟收集齐全——姓名/别名、现居 + 曾居城市、邮箱、电话——这样你永远不用回头追问。对加州主体,另读 references/legal/drop.md:next 会给出一个 drop_submit 一次性动作,一次从约 545 家注册经纪商删除,这是杠杆最高的单一动作。提交它,然后 drop <subject> --filed。对非加州主体,注册处由定向 CCPA/GDPR 邮件覆盖(registry --search,再 send-email);无论哪种情况,人肉搜索网站都直接处理。

  3. 排空队列。 循环:

    while true:
      q = $PDD next <subject>
      if q.actions is empty: break
      execute EVERY action in order; record each outcome via $PDD record
    

    next 按顺序发出:refresh_brokers(缓存过期)、fanout_scan/scan_inline(阶段 1 爬取——见第 4 步)、poll_verification(进行中的邮件确认)、verify_removal(到期复查)、optout_web_form/optout_email_send(阶段 2,按 playbook 步骤先父后子)、indirect_email_send、stealth_rescan。仅人工可做的工作从不作为动作出现——它累积在 q.human_digest 中。autonomy=full 下不停顿地执行动作;assisted 模式下遵守 confirm_first。

  4. 扫描(当 next 指示时)。 对 fanout_scan:运行 $PDD fanout <subject>,每个 batch 并行派生一个 delegate_task 子 agent,传入该 batch 现成的 brief——不要自己顺序扫全部经纪商。对 scan_inline:自己扫那几家。无论哪种,每家经纪商都按 references/methods.md 的阶梯跑完每一个 search_vectors(web_extract → site: 探测 → browser_navigate → scrapling),404 是不确定(不是 not_found),设了 antibot 且无隐身浏览器时记录 blocked,并在记录前确认主体 vs 同名者/亲属: $PDD record <subject> <broker> <found|not_found|indirect_exposure|blocked> --found <bool> --evidence '{"listing_urls":[...]}'。父 agent 在采信子 agent 的关键 found 主张前会复核。

  5. 退出(当 next 指示时)。 动作已按先父后子排好序,并带各经纪商记录自己 optout.playbook 里的 steps(字段级验证过;PeopleConnect、Whitepages、BeenVerified、Spokeo 等簇父站有精确、实时校验过的配方)。删除通常胜过抑制:当动作带 prefer_deletion 时,完成记录的删除通道,而不只是隐藏列表流程。当它带 prefer_suppression 时(PeopleConnect——删除会移除你的抑制且不能阻止重新收录),走抑制流程并持续维护;仅在 deliberate 数据清理时才用它的 Delete 按钮。按方法分:

    • web_form → 用 browser_navigate/browser_type/browser_click 驱动 optout_url,只提交 disclosure_fields,截图确认页,然后执行该动作的 after 记录命令。playbook 可能以一条删除权 send-email 跟进结尾——照做(彻底擦除,而非仅抑制列表)。
    • email → $PDD send-email <subject> <broker> --kind <ccpa|gdpr|generic> --to <addr> --listing <url> 一步完成记录 + 披露(收件人锁定为经纪商记录声明的地址;next 根据居住地选 kind——绝不为不符合的人冒称 CCPA/GDPR)。browser 模式返回一个收件人锁定的 compose 负载:在操作者网页邮箱里用 browser_* 按 compose.to、compose.subject/compose.body 精确撰写新邮件并发送(无密码);programmatic 模式走 SMTP 发送。next 还会在有人工关卡的表单(电话回拨/政府证件)存在经纪商删除邮箱时把它路由到该邮箱——这是救援通道(已验证的 Whitepages 模式)。仅草稿回退到 render-email + 摘要条目。
    • captcha → 软/托管挑战在默认云浏览器上自动通过(正常继续);只有它确实过不了的硬交互式/行为挑战才记 blocked(重新入队给隐身/操作者浏览器那一遍)。绝不使用打码服务。
    • phone_callback / account / gov_id / fax / mail / voice(T3)且没有删除邮箱 → 绝不是 agent 动作;next 已把它们路由到摘要。记录它们:$PDD record <subject> <broker> human_task_queued --reason "..."。
  6. 验证(当 next 指示时)。 programmatic 模式下 $PDD poll-verification <subject> 通过 IMAP 找到到达的确认链接(带反钓鱼评分,自动推进状态)。browser 模式下,在操作者网页邮箱打开经纪商的确认邮件,运行 $PDD verify-link <subject> <broker> --text '<body>' 给链接评分。无论哪种,都在同一浏览器里打开链接(多家经纪商把验证会话绑定到打开它的浏览器),走完流程,然后记录 awaiting_processing。仅在验证性重扫显示列表已消失后才标 confirmed_removed——绝不凭提交流程自己的确认页就标。

  7. 收尾(每轮一次)。 当 next 无动作返回:若非空则呈现 $PDD tasks <subject>(汇总人工摘要),然后 $PDD status <subject>;若开了 Sheets 跟踪表,通过 google-workspace skill 追加 $PDD report <subject> --sheets 行。

  8. 安排下次唤醒。 next 返回 next_wake_at(最早到期复查)。创建一个 cronjob,为该主体重跑本 skill 的循环(提示类似:“为 <subject_id> 运行 unbroker 循环:$PDD next 并执行所有动作”)。处理窗口、验证轮询、重现清扫都走同一个队列,因此案例无需人工关注即可持续推进。

常见陷阱

  • 绝不披露超过经纪商已显示的内容。 只提交 disclosure_fields。引擎从不主动给 SSN/证件号;你也不能。
  • 无同意,不行动。 引擎强制执行;不要为“研究”第三方而绕过它。
  • send-email 幂等且限速。 它拒绝重发已 submitted 或更后的案例(仅在确需重发时用 --force),SMTP 发送按 email_min_interval_seconds(默认 20s)调速并带重试/退避。不要循环它来“确保”——SMTP 成功递交不等于送达证明;到期队列的重扫才是真正确认。
  • 台账写入加锁。 并发运行(cron + 手动)安全串行;若见到锁超时,说明另一个运行正在写——让它完成,不要手工删 .lock。
  • 自主 ≠ 即兴发挥。 完全自主意味着步骤间不询问;它不放松任何关卡。若某经纪商在流程中途要求超过计划 disclosure_fields 的内容,停下该案例并入队(human_task_queued --reason),而不是独自决定披露额外 PII。
  • 不要用问题打断运行。 配置选择是 setup --auto 的事;仅人工可做的工作进摘要。运行中途唯一正当的提问,是某个阻断扫描的缺失身份事实(如完全没有城市)——而这本应在录入时收集。
  • pdd.py 用 terminal,不用 execute_code(密钥清洗 + 输出脱敏会破坏它)。
  • 档案默认是明文(JSON,HERMES_HOME 下 0600)。静态加密请运行 $PDD setup --encryption age——它生成本地 age 密钥并加密档案 + 台账(审计日志只存字段名,保持明文)。它防范随手/备份/提交暴露,不是完整的 HERMES_HOME 读取防护;要真正的密钥分离,把 PDD_AGE_IDENTITY 指到独立卷。$PDD doctor 显示加密是否真的启用(而不只是装没装 age)。
  • “从免费搜索隐藏”≠ 已删除。 仅在核实记录确实消失后才标 confirmed_removed;在报告中注明付费层保留策略。
  • 软 CAPTCHA 默认通过;不要硬刚硬的。 默认云浏览器把托管/软挑战当正常操作通过(那些经纪商保持 T1)。对它确实过不了的硬交互式挑战,记 blocked 并交给隐身/操作者浏览器那一遍——绝不用第三方打码服务或指纹伪装。
  • 经纪商页面会变。 如果流程坏了,$PDD record ... blocked 并在 references/brokers/ 里标记该经纪商文件待复核,而不是猜。
  • 提交前核实非字段验证的记录。 confidence: auto 记录来自解析 BADBOOL(读 optout.notes/optout.links,确认真正的退出 URL)。confidence: documented 记录(若干人肉搜索站)带有正确的已发布退出 URL,但未经实地验证(它们对数据中心 IP 返回 403),所以首次使用时通过操作者住宅浏览器确认真实流程,再设 last_verified。经实地验证的精选记录(无 confidence,如簇父站)已检查过机制,优先采用。

验证

  • scripts/run_tests.sh tests/skills/test_unbroker_skill.py(封闭环境、无网络),或无依赖运行器 python tests/skills/test_unbroker_skill.py。
  • 干跑:$PDD setup --auto && $PDD doctor && SID=$($PDD intake --full-name "Test Person" --email t@example.com --consent | python -c 'import sys,json;print(json.load(sys.stdin)["subject_id"])') && $PDD next "$SID",确认就绪摘要加上一个有序动作队列。