Osint Investigation
公共记录 OSINT(开源情报)调查框架 — SEC EDGAR 申报文件、USAspending 合同、参议院游说记录、OFAC 制裁名单、ICIJ 离岸泄露数据、纽约市房产记录 (ACRIS)、OpenCorporates 注册信息、CourtListener 法院记录、Wayback Machine 存档、Wikipedia + Wikidata、GDELT 新闻监控。跨来源实体解析、交叉链接分析、时间相关性分析、证据链构建。仅使用 Python 标准库。
技能元数据
| 来源 | 可选 — 使用 hermes skills install official/research/osint-investigation 安装 |
| 路径 | optional-skills/research/osint-investigation |
| 版本 | 0.1.0 |
| 作者 | Hermes Agent(改编自 ShinMegamiBoson/OpenPlanter,MIT 许可证) |
| 平台 | linux, macos, windows |
| 标签 | osint, investigation, public-records, sec, sanctions, corporate-registry, property, courts, due-diligence, journalism |
| 相关技能 | domain-intel, arxiv |
参考:完整 SKILL.md
以下是 Hermes 在触发此技能时加载的完整技能定义。这是技能激活时代理看到的指令。
OSINT Investigation — 公共记录交叉引用
用于公共记录 OSINT 的调查框架:政府合同、企业申报文件、游说活动、制裁名单、离岸泄露数据、房产记录、法院记录、网络存档、知识库以及全球新闻。跨异构来源解析实体,建立具有明确置信度的交叉链接,运行统计时间测试,并生成结构化证据链。
仅使用 Python 标准库。 零安装。适用于 Linux、macOS、Windows。大多数来源无需 API 密钥即可工作(OpenCorporates 提供可选的免费令牌以提高速率限制)。
改编自采用 MIT 许可证的 ShinMegamiBoson/OpenPlanter 项目;扩展涵盖了原项目未涉及的身份/房产/诉讼/存档/新闻来源。
何时使用此技能
当用户询问以下内容时使用:
- “追踪资金流向” — 政府合同、游说 → 立法、制裁
- 企业尽职调查 — 谁控制公司 X,他们在哪里注册,谁在其董事会任职,他们提交了哪些申报文件
- 制裁筛查 — 实体 X 是否在 OFAC SDN 名单或 ICIJ 离岸泄露数据中
- 权钱交易调查 — 具有离岸联系的承包商、赢得奖项的游说客户
- 房产所有权 — 按姓名或地址查找已记录的契据/抵押文件(纽约市;对于其他县,引导用户查看相关的记录员办公室)
- 诉讼历史 — 查找联邦和州法院判决书以及 PACER 案件登记表
- 多来源实体解析,其中命名方式各异(LLC 后缀、缩写)
- 构建具有明确置信度级别的证据链
- “关于 X 有什么说法” — 国际新闻 (GDELT) + Wikipedia 叙述 + Wayback Machine 以恢复失效 URL
不要将此技能用于:
- 通用网络研究 →
web_search/web_extract - 域名/基础设施 OSINT →
domain-intel技能 - 学术文献 →
arxiv技能 - 社交媒体档案发现 →
sherlock技能(可选) - 美国联邦竞选财务 — FEC 故意未在此涵盖(其 API 在免费 DEMO_KEY 层级上针对临时贡献者姓名查询不可靠)。对于联邦捐款,请直接引导用户访问 https://www.fec.gov/data/ 。
工作流程
代理通过 terminal 工具运行脚本。SKILL_DIR 是存放此 SKILL.md 的目录。
1. 确定适用的来源
阅读数据来源 wiki 条目以规划调查:
ls SKILL_DIR/references/sources/
# Federal financial / regulatory
cat SKILL_DIR/references/sources/sec-edgar.md # corporate filings
cat SKILL_DIR/references/sources/usaspending.md # federal contracts
cat SKILL_DIR/references/sources/senate-ld.md # lobbying
cat SKILL_DIR/references/sources/ofac-sdn.md # sanctions
cat SKILL_DIR/references/sources/icij-offshore.md # offshore leaks
# Identity / property / litigation / archives / news
cat SKILL_DIR/references/sources/nyc-acris.md # NYC property records
cat SKILL_DIR/references/sources/opencorporates.md # global corporate registry
cat SKILL_DIR/references/sources/courtlistener.md # court records (federal + state)
cat SKILL_DIR/references/sources/wayback.md # Wayback Machine archives
cat SKILL_DIR/references/sources/wikipedia.md # Wikipedia + Wikidata
cat SKILL_DIR/references/sources/gdelt.md # global news monitoring
每个条目遵循一个 9 部分模板:摘要、访问方式、模式、覆盖范围、交叉引用键、数据质量、获取方式、法律事项、参考文献。
交叉引用潜力部分映射了来源之间的连接键 — 首先阅读这些内容以选择正确的配对。
2. 获取数据
每个来源在 SKILL_DIR/scripts/ 中都有一个仅使用标准库的获取脚本:
联邦金融/监管
# SEC EDGAR filings (corporate disclosures)
python3 SKILL_DIR/scripts/fetch_sec_edgar.py --cik 0000320193 \
--types 10-K,10-Q --out data/edgar_filings.csv
# USAspending federal contracts
python3 SKILL_DIR/scripts/fetch_usaspending.py --recipient "EXAMPLE CORP" \
--fy 2024 --out data/contracts.csv
# Senate LD-1 / LD-2 lobbying disclosures
python3 SKILL_DIR/scripts/fetch_senate_ld.py --client "EXAMPLE CORP" \
--year 2024 --out data/lobbying.csv
# OFAC SDN sanctions list (full snapshot)
python3 SKILL_DIR/scripts/fetch_ofac_sdn.py --out data/ofac_sdn.csv
# ICIJ Offshore Leaks — downloads ~70 MB bulk CSV on first use,
# then searches it locally. Cached for 30 days under
# $HERMES_OSINT_CACHE/icij/ (default: ~/.cache/hermes-osint/icij/).
python3 SKILL_DIR/scripts/fetch_icij_offshore.py --entity "EXAMPLE CORP" \
--out data/icij.csv
身份/房产/诉讼/存档/新闻
# NYC property records (deeds, mortgages, liens) — ACRIS via Socrata
python3 SKILL_DIR/scripts/fetch_nyc_acris.py --name "SMITH, JOHN" \
--out data/acris.csv
python3 SKILL_DIR/scripts/fetch_nyc_acris.py --address "571 HUDSON" \
--out data/acris_addr.csv
# OpenCorporates — 130+ jurisdiction corporate registry
# (free token required; set OPENCORPORATES_API_TOKEN or pass --token)
python3 SKILL_DIR/scripts/fetch_opencorporates.py --query "Example Corp" \
--jurisdiction us_ny --out data/opencorporates.csv
# CourtListener — federal + state court opinions, PACER dockets
python3 SKILL_DIR/scripts/fetch_courtlistener.py --query "Smith v. Example Corp" \
--type opinions --out data/courts.csv
# Wayback Machine — historical web captures
python3 SKILL_DIR/scripts/fetch_wayback.py --url "example.com" \
--match host --collapse digest --out data/wayback.csv
# Wikipedia + Wikidata — narrative bio + structured facts
# Set HERMES_OSINT_UA=your-app/1.0 (your@email) to identify yourself
python3 SKILL_DIR/scripts/fetch_wikipedia.py --query "Bill Gates" \
--out data/wp.csv
# GDELT — global news in 100+ languages, ~2015→present
python3 SKILL_DIR/scripts/fetch_gdelt.py --query '"Example Corp"' \
--timespan 1y --out data/gdelt.csv
所有输出均为带有标题行的标准化 CSV。可幂等地重新运行脚本。
当私人个体不会出现在某个来源中时(例如,非上市公司人员的 SEC EDGAR 数据、非联邦承包商的 USAspending 数据、非游说客户的参议院 LDA 数据),脚本会返回 0 行并给出明确警告,而不是静默写入空 CSV。EDGAR 特别标记公司名称解析器匹配的是个人 Form 3/4/5 申报人而非公司注册人的情况。
速率限制说明位于每个数据源的 Wiki 条目中。默认抓取器在分页请求之间会礼貌地休眠。API 密钥可提高支持该功能的数据源的速率限制(SEC_USER_AGENT、SENATE_LDA_TOKEN、OPENCORPORATES_API_TOKEN、COURTLISTENER_TOKEN)。所有脚本都会立即向上游传递 429 响应及其配额消息,以便用户知晓需要降低请求频率或提供 API 密钥。
3. 跨数据源解析实体
标准化名称并在两个 CSV 文件之间查找匹配项:
# Match lobbying clients (Senate LDA) against contract recipients (USAspending)
python3 SKILL_DIR/scripts/entity_resolution.py \
--left data/lobbying.csv --left-name-col client_name \
--right data/contracts.csv --right-name-col recipient_name \
--out data/cross_links.csv
三个具有明确置信度的匹配层级:
| 层级 | 方法 | 置信度 |
|---|---|---|
exact | 去除后缀和标点符号后,标准化字符串相等 | 高 |
fuzzy | 排序令牌相等性(词袋匹配) | 中 |
token_overlap | ≥60% 令牌重叠,≥2 个共享令牌,令牌长度 ≥4 个字符 | 低 |
输出 cross_links.csv 的列:match_type, confidence, left_name, right_name, left_normalized, right_normalized, left_row, right_row。
4. 统计时间相关性分析(可选)
使用置换检验测试两个时间序列是否在可疑地紧密聚集——例如,游说备案与合同授予时间接近:
python3 SKILL_DIR/scripts/timing_analysis.py \
--donations data/lobbying.csv --donation-date-col filing_date \
--donation-amount-col income --donation-donor-col client_name \
--donation-recipient-col registrant_name \
--contracts data/contracts.csv --contract-date-col award_date \
--contract-vendor-col recipient_name \
--cross-links data/cross_links.csv \
--permutations 1000 \
--out data/timing.json
该脚本的列标志故意保持通用——原始工具是为捐款与奖项编写的,但它适用于通过交叉链接连接的任何(事件,收款人)时间序列。零假设:事件时间与奖项日期相互独立。单尾 p 值 = 平均最近奖项距离 ≤ 观测值的置换比例。每个(付款人,供应商)对至少需要 3 个事件才能运行测试。
5. 构建发现结果 JSON(证据链)
python3 SKILL_DIR/scripts/build_findings.py \
--cross-links data/cross_links.csv \
--timing data/timing.json \
--out data/findings.json
每个发现结果包含 id, title, severity, confidence, summary, evidence[], sources[]。每个证据项都指向源 CSV 中的特定行。用户(或后续代理)可以根据其源验证每个主张。
置信度与证据规范
这是本技能的核心规则。告知用户:
- 每个主张必须追溯到一条记录。禁止无依据的断言。
- 置信度层级随主张一起传递。
match_type=fuzzy表示“可能”,而非“已确认”。 - 实体解析产生的是候选项,而非结论。“ACME LLC”与“Acme Holdings Group”之间的
fuzzy匹配是一条线索,而非事实。 - 统计显著性 ≠ 不当行为。p < 0.05 意味着在零假设下,这种时间模式出现的可能性很低。它并不确立腐败行为。
- 此处所有数据源均为公共记录。它们仍可能包含不准确信息、过时信息或被删节内容(GDPR、密封记录)。
添加新数据源
使用模板:
cp SKILL_DIR/templates/source-template.md \
SKILL_DIR/references/sources/<your-source>.md
填写全部 9 个部分。在 scripts/ 中编写一个 fetch_<source>.py 脚本,仅使用标准库并写入标准化的 CSV。更新上述“何时使用”部分中的数据源列表。
工具及其局限性
entity_resolution.py不使用外部模糊匹配库(无 rapidfuzz,无 jellyfish)。令牌袋匹配是此处的上限。如果需要 Levenshtein 距离、音译或语音匹配,请单独通过 pip 安装。timing_analysis.py使用 Python 的random模块进行置换。为了可复现性,请传递--seed N。fetch_*.py脚本使用urllib.request并尊重Retry-After头。大量批量使用仍可能违反服务条款(ToS)——请先阅读每个数据源的法律部分。
法律声明
所有第一阶段数据源均为公共记录。根据其各自的访问条款(FOIA、公共记录法、ICIJ 明确发布、OFAC 公共数据),允许批量获取。但是:
- 某些数据源会积极实施速率限制。请尊重其响应头。
- 某些数据源会删节注册人信息(WHOIS 上的 GDPR、密封备案)。
- 交叉引用公共记录以识别私人个体可能具有伦理影响。本技能生成的是证据链,而非指控。