Mosimann-adv/tarrafa_scraper

GitHub: Mosimann-adv/tarrafa_scraper

Tarrafa 是一款面向法律取证场景的多源 CLI 工具,用于从公开网络渠道采集、归档和盘点书证材料。

Stars: 3 | Forks: 0

# Tarrafa [![License: PolyForm Noncommercial](https://img.shields.io/badge/License-PolyForm%20Noncommercial-blue.svg)](LICENSE) [![Status: Experimental](https://img.shields.io/badge/status-experimental-orange.svg)](SECURITY.md) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Mosimann-adv/tarrafa_scraper/actions/workflows/ci.yml) [![CodeQL](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/539e9a6bf48ad24469a4363bff3aa68124154549e26592783d3d8577f2acbbfc.svg)](https://github.com/Mosimann-adv/tarrafa_scraper/actions/workflows/codeql.yml) [![Release](https://img.shields.io/github/v/release/Mosimann-adv/tarrafa_scraper?include_prereleases)](https://github.com/Mosimann-adv/tarrafa_scraper/releases) ![撒网。取证。](https://static.pigsec.cn/wp-content/uploads/repos/cas/cb/cbb8bb4f2cfa9f47610b240fbd0ea6fe598074afd0452ba4afbce338858b463e.jpg) 用于**实验性法律用途**的**源码可见**多源 CLI:用于开放式材料和书证(网页、feeds、截图、视频、Instagram、CNPJ、官方公报/DJEN、Datajud 和 PDFs)的盘点整理。 它适用于在法律语境下构建原型并支持材料收集/整理 —— 它**不是** SaaS,**不是**法律服务,也**不能**替代人工分析。 不依赖于任何 IDE、vault 或 AI 助手。 | | | |--|--| | CLI | `tarrafa` | | 版本 | 0.4.0 (实验性) | | Python | ≥ 3.10 | | 状态 | 研究 / 原型 —— **非产品** | | 分发方式 | 在非商业许可证下公开源代码 | | 许可证 | [PolyForm Noncommercial 1.0.0](LICENSE) —— 必须署名 · **禁止商业用途** | ## 30 秒简介 ``` tarrafa page --url https://example.com --out ./out/page.json ``` ``` page: · ok · count=1 · -> out/page.json · text_len=76 ``` 结果是一个 JSON envelope,包含来源、抓取时间、方法、内容、错误和备注。截图和视频还会记录 SHA-256。查看一个[示例 artifact](examples/page_capture.example.json)。 ## 如何使用 典型的案件流程: 1. **安装**(一次)—— 参见下方的[安装说明](#instalação)。 2. **检查环境:** `tarrafa doctor` 3. **(可选)创建案件文件夹:** tarrafa init ./meu-caso --name "Meu caso" 这会创建 `tarrafa.toml` 以及 `raw/`、`shots/`、`html/`、`logs/`、`meta/runs/` 文件夹。 workspace 是**可选的**:你可以将其保存在任何 `--out` / `--out-dir` 中。 4. 使用正确的工具进行**抓取**(务必指定**保存位置**): | 我想要… | 基础命令 | |--------|----------------| | 获取 URL 的文本 + facts | `tarrafa page --url URL --out ./raw/page.json` | | 一次性处理多个 URL | `tarrafa page --urls-file urls.txt --out ./raw/pages/` | | 屏幕截图(视觉证据) | `tarrafa shot --url URL --out-dir ./shots --id DOC01` | | Instagram 帖子的评论 | `tarrafa ig --url POST_URL --out ./raw/ig.json --storage-state ./storage_state.json --headed` | | CNPJ | `tarrafa cnpj --cnpj 00.000.000/0001-91 --out ./raw/cnpj.json` | | 官方公报(律师) | `tarrafa djen --oab 12345 --uf SP --out ./raw/djen.json` | | 官方公报(当事人 / 内容中的姓名) | `tarrafa djen --papel parte --texto "Nome Completo" --out ./raw/djen.json` | | 通过 CNJ 查询案件 | `tarrafa datajud --cnj … --out ./raw/datajud.json` | | 案件 PDF 中的文本提取 | `tarrafa pdf-extract --dir ./pdfs --recursive --out ./raw/pdf.json` | | 用于打印的相册/档案卡 | `tarrafa album …` / `tarrafa dossier …` | 5. **各工具的帮助文档:** `tarrafa --help` · 列表:`tarrafa list` 6. **全局 flags**(在工具名称之前): ``` tarrafa --workspace ./meu-caso -v page --url https://example.com --out raw/page.json tarrafa --no-clobber page --url … --out raw/page.json # recusa sobrescrever tarrafa --force page --url … --out raw/page.json # permite com no_clobber ``` 激活 workspace 后,每次执行都会将历史记录保存在 `meta/runs/.json` 中(经过脱敏的参数、artifacts + sha256、exit code)。 分层配置:flags → env (`TARRAFA_TIMEOUT`, …) → `./tarrafa.toml` → `~/.tarrafa/config.toml`。 ### 各项资源由谁配置 | 资源 | 提供方 | |---------|----------------| | Python 3.10+、依赖项、Chromium | 用户的机器 (`pip` + `playwright install`) | | Instagram 会话 (`storage_state.json`) | **每个用户自身的原生登录**(切勿共享该文件) | | `DATAJUD_API_KEY` | 可选(配额);如果使用,放在本地的 `.env` 中 | | Playwright MCP Token | 可选(真实 Chrome / 扩展) | **不要**在 CLI 中输入密码。**不要**自动化 Facebook OIDC。输出仅发送到你指定的路径。 ## 工具 | 命令 | 功能 | |---------|--------| | `tarrafa init` | 创建可选的 workspace (`tarrafa.toml` + 文件夹) | | `tarrafa ig` | Instagram 评论 → 生成带有 permalink `/c/{id}/` 的 JSON | | `tarrafa page` | 一个公开的 URL → 文本 + facts (meta / JSON-LD) | | `tarrafa site` | 同域名的 BFS 爬虫(限制最大页面数 / 深度) | | `tarrafa feed` | RSS/Atom → 条目 envelope | | `tarrafa shot` | 高质量截图 (PNG + JSON) | | `tarrafa video` | 视频 meta + 帧(+ 可通过 yt-dlp 可选下载) | | `tarrafa album` | 将截图/帧编译为易于打印的 HTML | | `tarrafa dossier` | HTML 档案卡:头像 + 发现结果 + 来源 + 精选截图 | | `tarrafa cnpj` | 通过开放 API CNPJá 查询 CNPJ(无需 API key) | | `tarrafa djen` | DJEN 公告 —— 律师 (`--oab`) 或当事人 (`--papel parte --texto`) | | `tarrafa datajud` | 通过 CNJ 获取 Datajud 的封面/案件进程 | | `tarrafa pdf-extract` | PDF 文件的文本 + identity hints | | `tarrafa doctor` | 检查依赖项、Chromium、ffmpeg、yt-dlp、会话和 env | | `tarrafa list` / `version` | 列出工具 / 版本 | ## 安装说明 ### 使用 从源码安装: ``` git clone https://github.com/Mosimann-adv/tarrafa_scraper.git cd tarrafa_scraper python -m venv .venv # Windows .\.venv\Scripts\Activate.ps1 # macOS / Linux # source .venv/bin/activate python -m pip install . python -m playwright install chromium tarrafa doctor ``` 直接从 release 安装: ``` python -m pip install \ https://github.com/Mosimann-adv/tarrafa_scraper/releases/download/v0.4.0/tarrafa_scraper-0.4.0-py3-none-any.whl python -m playwright install chromium tarrafa doctor ``` 可选附加项: ``` python -m pip install ".[av]" # yt-dlp (download de vídeo) python -m pip install ".[site]" # scrapy (opcional; site usa BFS httpx por padrão) # ffmpeg no PATH → frames a partir do arquivo baixado ``` ### 开发 ``` python -m pip install -e ".[dev]" python -m playwright install chromium ruff check src tests pytest -q -m "not integration" pytest -q -m integration # rede e Chromium ``` ## 示例 ### 网页 ``` tarrafa page --url https://example.com --out ./out/page.json # batch(每行一个 URL;# 注释 ok) tarrafa page --urls-file ./urls.txt --out ./out/pages/ --mode http ``` 除了文章正文,还会收集 **meta/OG**、**JSON-LD** 和内嵌计数器(`structured_facts`,`text_main` = 纯正文)。 ### 截图 + 相册 ``` # 主要内容裁剪 tarrafa shot --url https://example.com --out-dir ./out/shots --id EX01 --clip main --dpr 2 # batch tarrafa shot --urls-file ./urls.txt --out-dir ./out/shots --clip main --dpr 1 # 整页 tarrafa shot --url https://example.com --out-dir ./out/shots --id EX01b --clip page --full-page # CSS selector tarrafa shot --url https://example.com --out-dir ./out/shots --id EX01c --selector "article" tarrafa album --dir ./out/shots --out ./out/shots/album.html \ --title "Álbum de capturas" \ --kicker "Inventário visual" \ --meta "Assunto: …" \ --meta "Data: …" ``` 盘点样式的 HTML(A4 页面,打印/PDF 按钮)。 **默认内嵌**(base64) → 生成单个便携的 `.html`。相对路径模式:`--no-embed`。 ### 档案卡 / 卷宗 基于**已抓取**的 facts 和文件渲染总览(不会去网上抓取)。 ``` tarrafa dossier \ --title "Nome Completo" \ --subtitle "Âncora · cidade" \ --out ./perfil/ficha.html \ --avatar ./perfil/foto.png \ --meta "Nome: …" --meta "Cidade: …" \ --fact "Achado factual (fonte citada)" \ --source "Fonte | https://… | nota" \ --timeline "2022 | Vínculo em …" \ --shot "print1=./shots/print.png::Legenda" \ --gap "O que não foi validado" \ --chip "âncora curta" ``` - **`--fact` / `--source` / `--timeline`**:内容和来源清单;截图为可选且经过精选。 - **`--manifest dossier.json`**:丰富多样的版块(`sections[]`、cards、表格)。 ### CNPJ / DJEN / Datajud / PDF ``` tarrafa cnpj --cnpj 00.000.000/0001-91 --out ./out/cnpj.json # Advogado: 按州 OAB 查询日报 tarrafa djen --oab 12345 --uf SP --max-items 100 --out ./out/djen.json # Parte: 在正文中搜索(姓名和/或 handle) tarrafa djen --papel parte --texto "Nome Completo" --max-items 50 --out ./out/djen_parte.json # Parte + Datajud 链式调用(找到的 CNJs) tarrafa djen --papel parte --texto "Nome Completo" --follow-datajud \ --datajud-out ./out/datajud.json --max-cnj 15 --out ./out/djen.json tarrafa datajud --cnj 0000000-00.0000.0.00.0000 --out ./out/datajud.json # 可选:--tribunal trf4 | env DATAJUD_API_KEY tarrafa pdf-extract --dir ./out/pdfs --recursive --out ./out/pdf_extract.json ``` - **cnpj:** 开放的 CNPJá,无需 API key;不支持按合伙人姓名搜索。 - **djen advogado:** 抽样 + OAB 后置过滤。 - **djen parte:** 在内容中搜索 `--texto`;summary 中包含 `identity_hints`;切勿仅凭短名将同名者合并。 - **datajud:** 典型的索引**不包含**当事人信息 —— 请使用已知的 CNJs。 - **pdf-extract:** 提取内嵌文本(使用 pypdf);纯图像 PDF 需要外部 OCR。 - **个人档案(编排):** `docs/PROFILE_PIPELINE.md` —— djen parte、案件卷宗、IG 截图、同名者/CPF、V1 HTML 与司法附件的对比。 ### 视频 ``` tarrafa video --url https://example.com/video --out-dir ./out/vid --id VID01 --frames 5 tarrafa video --url "URL" --out-dir ./out/vid --id VID01 --download --frames 5 tarrafa album --dir ./out/vid --out ./out/vid/album.html --title "Frames de vídeo" ``` ### 网站 / feed / Instagram ``` tarrafa site --url https://example.com --out ./out/site.json --max-pages 15 --max-depth 2 tarrafa feed --url https://example.com/feed.xml --out ./out/feed.json --max-entries 20 # IG: 原生登录一次(绝不要使用 Facebook OIDC / 自动化密码) tarrafa ig --url https://www.instagram.com/accounts/login/ --headed --max-comments 0 \ --save-storage ./storage_state.json --out ./_login_dummy.json tarrafa ig --url https://www.instagram.com/p/SHORTCODE/ --out ./comments.json \ --storage-state ./storage_state.json --expand-replies --headed ``` ## 通用 envelope 字段:`tool`、`version`、`collected_at`、`source`、`meta`、`count`、`items[]`、`errors[]`、`notes[]`。 Shot/video 会将媒体文件保存在 `--out-dir` 中,并在 JSON 中记录 `sha256`。 ## AI Agents **`AGENTS.md`** 中的契约:优先使用 CLI;不要输入密码;输出至用户指定的目录;仅限材料处理(仅抓取,不作分类)。 ## 结构 ``` tarrafa_scraper/ src/tarrafa/ cli.py core/ # envelope, writers, http, extract, crawl, media, doctor templates/ # HTML album / dossier tools/ # ig, page, site, feed, shot, video, album, … tests/ docs/ ``` ## 配置与安全 - `storage_state.json` 和 `.env` 已包含在 `.gitignore` 中 —— 请勿提交。 - 启动时加载 env(不会覆盖进程中已存在的变量): 1. `~/.tarrafa/.env` (用户全局) 2. `/.env` (项目) - Playwright MCP 扩展的可选 Token: ``` PLAYWRIGHT_MCP_EXTENSION_TOKEN=seu_token_aqui ``` 模板:`.env.example`。使用 `tarrafa doctor` 进行检查(显示掩码状态)。 仅限合法用途与证据保全;请遵守服务条款(ToS)及当地法律。Tarrafa **不**提供法律服务,也**不能**替代人工的法律分析。 另请参阅 **[SECURITY.md](SECURITY.md)**(在 issues 中不应泄露的信息;tokens;漏洞报告)。 ## 许可证 基于 **[PolyForm Noncommercial License 1.0.0](LICENSE)** 分发。 由于该许可证限制了商业用途,因此 Tarrafa 是**源码可见(source-available)**的软件,而不是 OSI 意义上的开源软件。该包的 SPDX 表达式为 `PolyForm-Noncommercial-1.0.0`。 简要说明(不替代完整文本): | | | |--|--| | **允许** | 出于**非商业**目的使用、学习、修改和重新分发,并保留许可证声明 | | **必须** | 保留 **署名** / `Required Notice` 以及随附的许可证 | | **禁止** | **商业**用途(包括未经单独授权的软件付费运营) | | **担保** | 无 —— 软件“现状”(as is),实验性质 | 在经济活动/事务所中将其作为产品或服务使用,在本许可证下通常被视为**商业**用途。如需商业许可证或特定授权,请联系维护者。 这**并不**代表 Tarrafa 变成了受支持的产品:即使获得许可,本代码仍处于实验阶段。 ## 支持项目 如果 Tarrafa 在你的工作流(学习、研究、非商业原型设计)中有所帮助,欢迎通过 **Pix** 进行自愿捐款以支持项目的维护。 | | | |--|--| | Pix Key | `mosimannadv@gmail.com` | | 类型 | 电子邮件 | ![Pix 二维码 — mosimannadv@gmail.com](https://static.pigsec.cn/wp-content/uploads/repos/cas/61/6192941f6424e80fe2a6b16bd60401d4acbdb84414c753d15ea6ca22410304a7.png) 纯属自愿捐款;**不**包含任何法律服务对价。
标签:Python, 命令控制, 安全规则引擎, 数字取证, 数据采集, 无后门, 法律科技, 特征检测, 自动化脚本, 逆向工具