# 站点适配采集

当开发者没有目标站点账号时，可以由已有账号的用户在本地采集一份经过裁剪和脱敏的搜索页结构，并把采集 ZIP 附加到站点适配 Feature Request。开发者和自动化流程只处理脱敏包，不需要获取用户账号。

## 普通用户一键采集

普通用户只需准备两样东西：目标站点账号，以及已安装的 Chrome、Edge 或 Chromium。无需安装 Python、Git、MoviePilot、Docker，也不需要查看 HTML、复制 Cookie 或填写 User-Agent。

1. 从 MoviePilot 官方 Release 下载与 Windows、macOS 或 Linux 对应的 `moviepilot-site-collector-*` 单文件采集器。
2. 运行采集器，只输入站点首页地址，例如 `https://tracker.example.com`。
3. 程序会打开一个临时浏览器窗口。在这个窗口里正常登录站点，搜索一个能返回至少 3 条结果的常见关键词，并保持搜索结果页打开。
4. 回到采集器按回车。程序会自动识别搜索地址、关键词、Cookie 和 User-Agent，完成本地裁剪与脱敏后生成 ZIP。

临时浏览器使用独立的一次性用户目录，不会读取日常浏览器的历史登录状态。采集完成后程序会关闭临时浏览器并清理这次登录数据。原始页面和 Cookie 只在内存中处理，不会写入采集包。

各系统下载文件和首次运行方式见 [站点适配采集器下载说明](site-adapter-collector-release.md)。

## 开发者源码入口

已经有 MoviePilot 源码和 Python 环境的开发者，也可以在项目目录执行：

```bash
bash scripts/collect-site-adapter.sh
```

源码入口和独立程序使用同一套浏览器采集流程。只有排查兼容问题时才使用 `--manual-cookie` 高级模式；普通用户不需要接触 Cookie。

## 第一版限制

当前采集器会读取浏览器渲染后的页面，因此可由用户在临时窗口中完成验证码、Cloudflare 检查和普通登录。但自动适配协议仍要求搜索结果地址能够表示为 HTTPS GET URL。以下场景第一版不做自动适配：

- 必须 POST 表单才能搜索的站点。
- 搜索完成后地址栏完全没有关键词或可复用搜索参数的站点。
- 需要专用 API、复杂签名或无法从一次搜索结果页观察出 FREE/HR 规则的站点。

遇到这些场景时，请在 Feature Request 中说明失败步骤和终端错误文字，等待人工确认采集方案。不要用原始 HAR、原始 HTML 或包含账号信息的截图替代脱敏 ZIP。

## 脱敏范围

采集器只接受 HTTPS 地址。默认模式从本机临时浏览器只读当前搜索结果页；高级手动模式设置 30 秒超时和 5 MiB 响应上限，并禁止携带 Cookie 跨 origin 重定向。读取页面后会在本机完成以下处理：

- 只保留种子列表、表头和最多 25 条结果相关 DOM，丢弃账号导航、页脚、脚本、样式、隐藏表单和其他页面内容。
- 替换种子标题、用户名、邮箱、IP、时间、大小、统计值和长随机标识，只保留适配所需的标签、class、字段与链接结构。
- URL 转为同源相对路径，查询值统一替换为占位符，凭据语义的字段直接移除。
- Cookie 和浏览器 UA 仅用于本次请求，不写入采集包；写入前还会使用 Cookie 原值执行二次泄露检查。

输出 ZIP 根目录固定包含：

- `manifest.json`：包版本、站点标识、采集时间、结果行数、HTML 摘要和隐私声明。
- `request.json`：仅包含 GET、origin、相对路径和脱敏后的查询参数，搜索值固定为 `{keyword}`。
- `search.html`：本地裁剪并脱敏后的种子列表结构。
- `redaction-report.json`：脱敏状态和各类处理计数。

## 提交 Feature Request

在 GitHub 创建“功能改进” Issue，类型选择“站点适配”，然后把生成的 `moviepilot-site-capture-*.zip` 直接拖入“站点适配采集文件”输入框。

Feature Request 及其附件是公开内容。提交前请先在本地解压 ZIP，确认根目录只有上述四个文件，并逐一预览确认没有站点账号、搜索隐私或其他不希望公开的信息。

站点适配请求必须附加采集器生成并人工复核过的 ZIP。严禁手工上传 Cookie、Authorization、通行密钥、会话字段、原始 HTML、原始 HAR、浏览器网络归档或截图中的账号信息。如果采集失败，请只提交终端错误文字，不要用任何原始数据代替脱敏包。
