# collect-app-msg.py 使用说明

用于抓取微信“小程序话题”下的公众号文章（贴图），并以 JSON 结构输出。

## 环境要求

- Python 3.10+（已在 Windows + Python 3.13 环境验证）
- 网络可访问 `mp.weixin.qq.com` ，不能在常见云服务商静态IP环境下运行，会触发验证码验证，
请在自己电脑上登陆过自己微信的情况下运行。

## 安装依赖

```bash
pwsh -NoProfile -Command "python -m pip install -U requests playwright; python -m playwright install chromium"
```

## 运行

```bash
pwsh -NoProfile -Command "python ./collect-app-msg.py --topic '#乡源文化挖掘' --out data.json"
```

常用参数：

- `--topic`：**必填**。话题名称，例如 `#乡源文化挖掘`
- `--out`：输出文件名，默认 `data.json`
- `--max-pages`：最多抓取页数，默认 `10`（`<=0` 表示不限制）
- `--sleep`：每条之间延迟秒数，默认 `0.3`

示例（只抓 1 页）：

```bash
pwsh -NoProfile -Command "python ./collect-app-msg.py --topic '#乡源文化挖掘' --max-pages 1 "
```

## 输出格式

输出文件：默认为 data.json 在同名目录下，是一个 JSON 数组，每条为文章结构：

```json
[
  {
    "outlinkId": 2247483702,
    "userId": 0,
    "url": "https://mp.weixin.qq.com/s?...",
    "title": "标题",
    "images": ["https://.../0?wx_fmt=jpeg"],
    "content": "<a class=\"wx_topic_link\" ...>...</a>\n"
  }
]
```

字段说明：

- `outlinkId`：微信官方文章的 `msgid`（用于去重）
- `userId`：从乡源小程序传入的用户ID，如果不是从小程序发出来的则为 `0`
- `images`：图片
- `content`：详情数据

## 增量抓取与去重规则

脚本会在抓取前读取 `--out` 指定的 JSON：

- **判重键**：优先使用 `outlinkId`；缺失时使用 `url`
- **跳过详情页请求**：若 `getTopicList` 返回的某条文章已存在于历史 JSON 中，则不会再打开详情页
- **终止翻页**：如果某一页 `getTopicList` 的所有条目都已存在（本页没有任何新条目），则停止请求下一页
- **保存顺序**：写回 JSON 时，**本次新抓到的条目会放在最上面**
- **合并去重**：写回时仍会去重，且 **新数据优先**（同一 `outlinkId/url` 时保留新条目）
