跳到主要內容

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_AGENTSENATE_LDA_TOKENOPENCORPORATES_API_TOKENCOURTLISTENER_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、密封備案)。
  • 交叉引用公共記錄以識別私人個體可能具有倫理影響。本技能生成的是證據鏈,而非指控。