# 公众号（微信 wei_xin）接口台账

> 唯一证据来源：`/tmp/aiddit_captures/gzh_search.json`、`gzh_detail.json`、`gzh_account_info.json`（2026-06-11 真实抓包）。
> 全部接口走统一爬虫网关 `host = http://crawler.aiddit.com`，平台名 `wei_xin`。
> 字段表与示例值全部取自 capture 真实响应，未做任何编造。

## 平台级结论（先读）

- **关键词搜索可用**：`/crawler/wei_xin/keyword` `code=0`，一次返回 20 条文章（`gzh_search.json`），item = `{title, time, nick_name, url, cover_url, biz}`。
- **作者血缘缺口**：搜索结果里 **`nick_name` 与 `biz` 字段均为空字符串**，作者标识只能从 `url` 的 `__biz=...` 参数里**正则抽取**。即“作者只有 biz，没有独立 account_id”。
- **详情可用**：`/crawler/wei_xin/detail` `code=0`，用文章 `content_link` 取归一化正文（`gzh_detail.json`）。
- **号主信息走 account_info（可用）**：`/crawler/wei_xin/account_info` `code=0`，同样用 `content_link` 取号主 `account_name / biz_info / wx_gh`（`gzh_account_info.json`）。**这是补齐作者昵称的唯一可达路径。**
- **blogger 接口不可达**：本批 capture 内 **没有** “按 biz/号 拉该公众号全部历史文章” 的 blogger/作品列表接口；`author_to_works` 在公众号走不通，只能逐篇 `content_link` → detail / account_info。
- **无 tag**：公众号 detail `topic_list=null`，**整平台无 hashtag**，`video_to_hashtag` 不可走。

---

## 接口 1：关键词搜索

### ① 身份
- `source_id`: **PLT_WEIXIN_KEYWORD**
- 状态：**verified**（`gzh_search.json` `code=0`，20 条）

### ② 请求标准
- method：`POST`，path：`/crawler/wei_xin/keyword`
- 参数表：

| 参数 | 类型 | 必填 | 含义 | 真实值 |
|---|---|---|---|---|
| `keyword` | string | 是 | 搜索词 | `"彩虹"` |
| `cursor` | string | 否 | 翻页游标，取上次 `next_cursor` | `"0"`（首页） |

### ③ 真实 curl
```bash
curl -X POST 'http://crawler.aiddit.com/crawler/wei_xin/keyword' \
  -H 'Content-Type: application/json' \
  -d '{"keyword":"彩虹","cursor":"0"}'
```

### ④ 响应信封 + 翻页
```json
{ "code": 0, "msg": null,
  "data": { "has_more": true, "next_cursor": "1", "data": [ {...}, ... 20 条 ] } }
```
- 翻页：`data.has_more=true`、`data.next_cursor="1"`（真值，页码字符串），回填到 `cursor`。

### ⑤ 字段台账（raw 名，取自 `gzh_search.json` `data.data[0]`）

| 字段名(raw) | 类型 | 含义 | 提取标注 | 真实示例值 |
|---|---|---|---|---|
| `url` | string | 文章地址（含 `__biz/mid/idx/sn`），既是内容定位也是作者定位 | 直接可用（且需正则抽 biz/内容id） | `"http://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&mid=2247483744&idx=1&sn=eb484d234c5579d567c87d9519351b74&..."` |
| `title` | string | 标题（含 `<em class="highlight">` 高亮） | 需正则抽（剥 `<em>`） | `"<em class=\"highlight\">彩虹</em>股份（600707）深度分析报告"` |
| `cover_url` | string | 封面图 | 直接可用 | `"https://mmbiz.qpic.cn/mmbiz_jpg/fNx5Iic5WA7X9043...jpeg"` |
| `time` | int | 发布时间戳（秒） | 需后处理（×1000） | `1781151948` |
| `nick_name` | string | 作者昵称（**本响应恒为空串，不可用**） | 需二次请求（走 account_info 补） | `""` |
| `biz` | string | 作者标识（**本响应恒为空串，须从 url 抽 `__biz`**） | 需正则抽（从 `url`） | `""`（url 内 `__biz=MzI5NjAxMTgzNg==`） |

> 翻页字段：`data.has_more=true` / `data.next_cursor="1"`（真值）。

### ⑥ 提取与后处理规则
- 内容ID：从 `url` 正则抽 `__biz` + `mid` + `idx` + `sn` 组合，或直接以 `url`（去 chksm/scene 后归一）为内容定位键。
- **作者标识只有 biz，且 search item 的 `biz` 为空**：必须正则 `__biz=([^&]+)` 从 `url` 抽取（示例 `MzI5NjAxMTgzNg==`）。`nick_name` 为空，作者昵称须二次走 account_info。
- `title` 正则剥离 `<em class="highlight">`。

### ⑦ 边界与失败
- 作者血缘弱：search 仅给 biz（还得自抽），昵称需补请求。
- 限流 ≥ 15s。

### ⑧ 落点（canonical + 游走边）
- canonical：`platform_content_id`(从 `url` 抽 `__biz+mid+idx`)、`platform_author_id`(=`biz`，从 `url` 抽)、`title`、`content_url`(=`url`)、`cover_url`、`publish_ts`(=`time`)、`has_more`/`next_cursor`。
- 游走边：`search_page_to_content`；`video_to_author` 仅落 `biz` 标识（昵称需 account_info 补）；**`author_to_works` 走不通（无 blogger 接口）**；**`video_to_hashtag` 不可走（无 tag）**。

---

## 接口 2：文章详情

### ① 身份
- `source_id`: **PLT_WEIXIN_CONTENT_DETAIL**
- 状态：**verified**（`gzh_detail.json` `code=0`）

### ② 请求标准
- method：`POST`，path：`/crawler/wei_xin/detail`
- 参数表：

| 参数 | 类型 | 必填 | 含义 | 真实值 |
|---|---|---|---|---|
| `content_link` | string | 是 | 文章地址（search 的 `url`） | `"http://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&mid=2247483744&idx=1&sn=eb484d...&..."` |

### ③ 真实 curl
```bash
curl -X POST 'http://crawler.aiddit.com/crawler/wei_xin/detail' \
  -H 'Content-Type: application/json' \
  -d '{"content_link":"http://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&mid=2247483744&idx=1&sn=eb484d234c5579d567c87d9519351b74&scene=7#rd"}'
```

### ④ 响应信封 + 翻页
```json
{ "code": 0, "msg": null,
  "data": { "has_more": false, "next_cursor": null, "data": { ...归一化对象... } } }
```
- 单对象，无翻页。

### ⑤ 字段台账（raw 名，取自 `gzh_detail.json` `data.data`）

| 字段名(raw) | 类型 | 含义 | 提取标注 | 真实示例值 |
|---|---|---|---|---|
| `channel_content_id` | string | 内容ID（网关归一化 hash） | 直接可用 | `"d9ac580027959372cc141815a3f906a3"` |
| `content_link` | string | 归一化文章地址 | 直接可用 | `"https://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&idx=1&mid=2247483744&sn=eb484d..."` |
| `title` | string | 标题（无高亮） | 直接可用 | `"彩虹股份（600707）深度分析报告"` |
| `body_text` | string | 正文全文 | 直接可用 | `"报告日期：2026年6月10日 | 当前股价：12.45元 ..."`（长文） |
| `content_type` | string | 类型 | 直接可用 | `"note"` |
| `topic_list` | null | 话题（**公众号恒为 null，无 tag**） | 需后处理（置空数组） | `null` |
| `image_url_list[].image_url` | string | 正文配图 | 直接可用 | `"https://mmbiz.qpic.cn/mmbiz_jpg/fNx5Iic5WA7X140yn...jpeg"` |
| `video_url_list` | null | 视频列表（本文为图文，无视频） | 需后处理 | `null` |
| `channel_account_id` | string | 作者ID（网关归一化号主 hash，**非 biz**） | 直接可用 | `"969a9ad954ec605c67110cdb8c42f301"` |
| `channel_account_name` | null | 作者昵称（**detail 恒为 null，须 account_info 补**） | 需二次请求 | `null` |
| `location` | string | 发布地 | 直接可用 | `"广东"` |
| `view_count` | int | 阅读数 | 直接可用 | `15` |
| `like_count` | int | 点赞数 | 直接可用 | `0` |
| `publish_timestamp` | int | 发布时间戳（毫秒） | 直接可用 | `1781151960000` |

### ⑥ 提取与后处理规则
- detail 的 `channel_account_id`（hash）与 account_info 的 `channel_account_id` 一致（`969a9ad9...`），可作号主主键对齐；但 **`channel_account_name=null`**，昵称必须走 account_info。
- `topic_list=null` → 公众号无 hashtag，统一置空。
- 注意：detail 的 `channel_account_id` 是网关 hash，**与作者血缘里的 `biz` 不是同一标识**，两者需都沉淀（biz 来自 url，hash 来自 detail/account_info）。

### ⑦ 边界与失败
- 昵称缺口：detail 不给昵称，须额外一次 account_info。
- 限流 ≥ 15s。

### ⑧ 落点（canonical + 游走边）
- canonical：`platform_content_id`(=`channel_content_id`)、`platform_author_id`(=`channel_account_id` hash / 另存 `biz`)、`title`、`body_text`、`content_url`(=`content_link`)、`images`(=`image_url_list`)、`stats.view/like`、`publish_ts`、`location`。
- 游走边：`video_to_author`（落号主 hash 标识，昵称待 account_info 补）；`author_to_works` 不可走；`video_to_hashtag` 不可走（tag=null）。

---

## 接口 3：号主信息（account_info）

### ① 身份
- `source_id`: **PLT_WEIXIN_ACCOUNT_INFO**
- 状态：**verified**（`gzh_account_info.json` `code=0`）

### ② 请求标准
- method：`POST`，path：`/crawler/wei_xin/account_info`
- 参数表：

| 参数 | 类型 | 必填 | 含义 | 真实值 |
|---|---|---|---|---|
| `content_link` | string | 是 | 文章地址（用任一该号文章 `url` 反查号主） | `"http://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&mid=2247483744&..."` |

### ③ 真实 curl
```bash
curl -X POST 'http://crawler.aiddit.com/crawler/wei_xin/account_info' \
  -H 'Content-Type: application/json' \
  -d '{"content_link":"http://mp.weixin.qq.com/s?__biz=MzI5NjAxMTgzNg==&mid=2247483744&idx=1&sn=eb484d234c5579d567c87d9519351b74&scene=7#rd"}'
```

### ④ 响应信封 + 翻页
```json
{ "code": 0, "msg": null,
  "data": { "has_more": false, "next_cursor": null, "data": { ...号主对象... } } }
```
- 单对象，无翻页。

### ⑤ 字段台账（raw 名，取自 `gzh_account_info.json` `data.data`）

| 字段名(raw) | 类型 | 含义 | 提取标注 | 真实示例值 |
|---|---|---|---|---|
| `channel_account_id` | string | 号主ID（网关归一化 hash，与 detail 一致） | 直接可用 | `"969a9ad954ec605c67110cdb8c42f301"` |
| `account_name` | string | **号主昵称（补齐 search/detail 缺口的关键字段）** | 直接可用 | `"韭菜看透本质"` |
| `account_link` | string | 号主主页链接 | 直接可用 | `"https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5NjAxMTgzNg==&scene=124#wechat_redirect"` |
| `biz_info` | string | 作者 biz（与 url `__biz` 一致） | 直接可用 | `"MzI5NjAxMTgzNg=="` |
| `wx_gh` | string | 公众号原始ID（gh_ 号） | 直接可用 | `"gh_d6a68990fe9c"` |
| `gender` | string | 性别 | 直接可用 | `"其他"` |
| `follower_count` | null | 粉丝数（本响应为 null，不可用） | 需后处理 | `null` |
| `publish_count` | null | 发文数（null，**无作品列表**） | 需后处理 | `null` |

### ⑥ 提取与后处理规则
- **account_info 是公众号作者血缘的唯一可达补全**：用任一文章 `content_link` 反查，拿到 `account_name`（昵称）+ `biz_info`（=biz）+ `wx_gh`，把 search/detail 缺的昵称补上。
- 三个作者标识对齐：`biz_info`(=url 的 `__biz`) ↔ `channel_account_id`(detail/account_info 同一 hash) ↔ `wx_gh`。
- **仍无作品列表**：`publish_count=null`，account_info **不返回该号历史文章**，`author_to_works` 仍走不通。

### ⑦ 边界与失败
- 互动/粉丝指标（`follower_count`/`publish_count`/`like_count` 等）本响应全为 null，作者画像信息有限。
- 限流 ≥ 15s。

### ⑧ 落点（canonical + 游走边）
- canonical：`platform_author_id`(=`channel_account_id` / 另存 `biz_info`、`wx_gh`)、`author_name`(=`account_name`)、`author_url`(=`account_link`)、`gender`。
- 游走边：`video_to_author` 的昵称补全终点；**`author_to_works` 不可走**（无作品列表数据源）。
