{/* 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 |
| 相关 skill | google-workspace, agentmail, himalaya, scrapling, osint-investigation |
参考:完整 SKILL.md
以下是 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读取验证链接。agentmailskill(逐经纪商别名)也可。
- 浏览器模式(无密码):
- Google Sheets 跟踪表:
google-workspaceskill。 scraplingskill 用于隐身/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> --batch | Reduce 视图:叠加台账状态,按下一动作分组经纪商(未扫描/已找到/间接/受阻/进行中/完成),折叠归属簇,按 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 个、无摘要),因为浏览器导航很重;存活下来的台账写入成本是父 agentweb_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、匹配依据)。
流程(自主循环)
-
设置(一次,不提问)。 运行
$PDD setup --auto——它自行检测能力并配置最自主的有效组合(有EMAIL_*凭据就用程序化邮件,有 Browserbase 密钥就用它,有age二进制就用age加密,autonomy=full)。然后$PDD doctor,把就绪输出展示给操作者仅作告知,不作提问——立即继续。提一句什么能解锁更多自动化(如邮件凭据),但不要等。 -
录入 + 同意(唯一一次人工对话)。 带
--consent(和--consent-method)运行$PDD intake ...。没有同意,引擎拒绝规划或行动。一趟收集齐全——姓名/别名、现居 + 曾居城市、邮箱、电话——这样你永远不用回头追问。对加州主体,另读references/legal/drop.md:next会给出一个drop_submit一次性动作,一次从约 545 家注册经纪商删除,这是杠杆最高的单一动作。提交它,然后drop <subject> --filed。对非加州主体,注册处由定向 CCPA/GDPR 邮件覆盖(registry --search,再send-email);无论哪种情况,人肉搜索网站都直接处理。 -
排空队列。 循环:
while true: q = $PDD next <subject> if q.actions is empty: break execute EVERY action in order; record each outcome via $PDD recordnext按顺序发出: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。 -
扫描(当
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主张前会复核。 -
退出(当
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 "..."。
- web_form → 用
-
验证(当
next指示时)。 programmatic 模式下$PDD poll-verification <subject>通过 IMAP 找到到达的确认链接(带反钓鱼评分,自动推进状态)。browser 模式下,在操作者网页邮箱打开经纪商的确认邮件,运行$PDD verify-link <subject> <broker> --text '<body>'给链接评分。无论哪种,都在同一浏览器里打开链接(多家经纪商把验证会话绑定到打开它的浏览器),走完流程,然后记录awaiting_processing。仅在验证性重扫显示列表已消失后才标confirmed_removed——绝不凭提交流程自己的确认页就标。 -
收尾(每轮一次)。 当
next无动作返回:若非空则呈现$PDD tasks <subject>(汇总人工摘要),然后$PDD status <subject>;若开了 Sheets 跟踪表,通过google-workspaceskill 追加$PDD report <subject> --sheets行。 -
安排下次唤醒。
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",确认就绪摘要加上一个有序动作队列。