> ## Documentation Index
> Fetch the complete documentation index at: https://docs.socialvision.tisyk.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 微信公众号与视频号接口

> 微信公众号图文文章搜索、阅读与视频号动态、博主数据端点

## 接口列表概览

覆盖微信公众号（WeChat Media Platform）与微信视频号（Channels）的数据检索与详情提取。调用成功每次扣除 0.10 Credits。

### 获取视频号账号信息/Get WeChat Channels Account Info

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_channel_info`

# \[中文]

### 用途:

* 获取指定视频号账号的「更多信息」：基础信息分区（IP 归属地 / 资料所在地 / **视频号 ID**=sph 公开号）+ 认证信息分区（服务单位 / 主体类型 / 互联网新闻信息服务许可证编号 / 服务类别 / 认证时间）。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* username: 视频号 finder username（`v2_…@finder` 格式），示例 `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder`（人民日报）。
  * 怎么拿到它：
    * `fetch_video_detail`、`fetch_user_videos` 响应里每个视频对象的 `username` 字段（最常用）
    * `fetch_channel_id_to_username`：把视频号 ID（`sph…` 短号，如 `sphi9BjV8GK0Zsl`）转成 username
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 视频号账号的基础信息与认证信息

### 响应结构与 JSON Path:

#### `raw=false`（精简）:

* 账号 username: `$.data.finder_username`
* 视频号 ID（sph 短号）: `$.data.channel_id`
* 分区列表（原样保留分区结构）: `$.data.sections[N].title`、`$.data.sections[N].items[M].title` / `.content`
* 扁平化后的「标题→内容」字典（最常用）: `$.data.info`，例如 `$.data.info['视频号ID']`、`$.data.info['IP归属地']`、`$.data.info['服务单位']`、`$.data.info['主体类型']`、`$.data.info['互联网新闻信息服务许可证编号']`、`$.data.info['服务类别']`、`$.data.info['认证时间']`

#### `raw=true`（原始）:

* 状态码: `$.data.baseResponse.ret`（0=成功）
* 分区数组（camelCase）: `$.data.sections[N].title`、`$.data.sections[N].items[M].title` / `.content` / `.type` / `.jumpInfo`
* 对应关系: raw=false 的 `info`/`channel_id` 对应 raw=true 的 `sections[].items[]`（按 title 扁平化、并剥离富文本图片标记）；raw=true **不含** `info` 扁平字典与 `channel_id`，需自行从 sections 提取。

# \[English]

### Purpose:

* Get the "More Info" of a WeChat Channels account: basic info section (IP location / profile location / **Channel ID** = public sph ID) + verification section (service unit / entity type / internet news service license number / service category / verification time).
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* username: WeChat Channels finder username (`v2_…@finder` format), e.g. `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder` (People's Daily).
  * How to get it:
    * The `username` field of each video object in `fetch_video_detail` / `fetch_user_videos` responses (most common)
    * `fetch_channel_id_to_username`: convert a Channel ID (`sph…` short ID, e.g. `sphi9BjV8GK0Zsl`) into a finder username
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Basic info and verification info of the WeChat Channels account

### Response structure & JSON Path:

#### `raw=false` (simplified):

* Account username: `$.data.finder_username`
* Channel ID (sph short ID): `$.data.channel_id`
* Section list (original section structure preserved): `$.data.sections[N].title`, `$.data.sections[N].items[M].title` / `.content`
* Flattened "title→content" dict (most useful): `$.data.info`, e.g. `$.data.info['视频号ID']`, `$.data.info['IP归属地']`, `$.data.info['服务单位']`, `$.data.info['主体类型']`, `$.data.info['互联网新闻信息服务许可证编号']`, `$.data.info['服务类别']`, `$.data.info['认证时间']`

#### `raw=true` (raw):

* Status code: `$.data.baseResponse.ret` (0=success)
* Section array (camelCase): `$.data.sections[N].title`, `$.data.sections[N].items[M].title` / `.content` / `.type` / `.jumpInfo`
* Mapping: `info`/`channel_id` of raw=false correspond to `sections[].items[]` of raw=true (flattened by title with rich-text image markers stripped); raw=true does **not** contain the flattened `info` dict or `channel_id`, extract them from sections yourself.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_channel_info",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_channel_info",
  "input": {}
}
)
print(res.json())
```

***

### 视频号ID转finder username/Convert Channel ID to Finder Username

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_channel_id_to_username`

# \[中文]

### 用途:

* 把对外可见的视频号 ID（`sph…` 短号）解析成 finder username（`v2_…@finder`）。
* 拿到 username 后即可调用 `fetch_user_videos`、`fetch_channel_info`、`fetch_user_profile` 等接口。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* channel\_id: 视频号 ID（`sph…` 短号），示例 `sphi9BjV8GK0Zsl`（人民日报）。要求为 `sph` 开头的短号。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 解析出的 finder username 及账号昵称、简介

### 响应结构与 JSON Path:

#### `raw=false`（精简）:

* 入参回显: `$.data.channel_id`
* 解析出的 finder username（可直接喂下游接口）: `$.data.username`
* 账号昵称（已剥离搜索高亮标记）: `$.data.nickname`
* 账号简介: `$.data.desc`（可能为 null）
* 未命中时: `$.data.username` 为 null，且带 `$.data.error` 说明

#### `raw=true`（原始）:

* 结果分组: `$.data.data[N]`（每组 `type` + `items[]` / `subBoxes[].items[]`）
* 账号项里的 finder username: `$.data.data[N].items[M].jumpInfo.userName` 或 `$.data.data[N].items[M].noticeParam.finderUsername`
* 标题 / 简介: `$.data.data[N].items[M].title` / `.desc`
* 其它: `$.data.query`（回显查询）、`$.data.continueFlag`、`$.data.offset`
* 对应关系: raw=false 的 `username` / `nickname` / `desc` 即从 raw=true 的 `data[].items[]`（或 `subBoxes[].items[]`）中首个 `@finder` 账号项提取。

# \[English]

### Purpose:

* Resolve a publicly visible Channel ID (`sph…` short ID) into a finder username (`v2_…@finder`).
* With the username you can then call `fetch_user_videos`, `fetch_channel_info`, `fetch_user_profile`, etc.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* channel\_id: Channel ID (`sph…` short ID), e.g. `sphi9BjV8GK0Zsl` (People's Daily). Must start with `sph`.
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Resolved finder username plus account nickname and description

### Response structure & JSON Path:

#### `raw=false` (simplified):

* Input echo: `$.data.channel_id`
* Resolved finder username (feed directly into downstream endpoints): `$.data.username`
* Account nickname (search highlight markers stripped): `$.data.nickname`
* Account description: `$.data.desc` (may be null)
* On miss: `$.data.username` is null with an explanation at `$.data.error`

#### `raw=true` (raw):

* Result groups: `$.data.data[N]` (each group has `type` + `items[]` / `subBoxes[].items[]`)
* Finder username inside account items: `$.data.data[N].items[M].jumpInfo.userName` or `$.data.data[N].items[M].noticeParam.finderUsername`
* Title / description: `$.data.data[N].items[M].title` / `.desc`
* Others: `$.data.query` (query echo), `$.data.continueFlag`, `$.data.offset`
* Mapping: `username` / `nickname` / `desc` of raw=false are extracted from the first `@finder` account item in `data[].items[]` (or `subBoxes[].items[]`) of raw=true.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_channel_id_to_username",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_channel_id_to_username",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号用户作品列表/Get WeChat Channels User Videos

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_user_videos`

# \[中文]

### 用途:

* 获取指定视频号账号主页的作品列表。
* 每个视频带媒体地址 `media`（含 `url` / `url_token` / `full_url` / `decode_key`），可直接下载并解密。
* 支持翻页获取更多作品。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `id` / `object_nonce_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* username: 视频号 finder username（`v2_…@finder` 格式），示例 `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder`（人民日报）。来源见 `fetch_channel_info` / `fetch_video_detail` / `fetch_channel_id_to_username` 文档。
* last\_buffer: 可选，翻页游标（base64）。**首页留空**；当响应 `up_continue` 为真时，传上一页响应的 `last_buffer` 取下一页。（base64 含 `+//=` 等字符，故走 body 而非 query。）
* raw: 可选，默认 True。True=原始响应；False=精简解析结构（推荐做媒体下载）。

### 返回:

* 用户作品列表及翻页游标

### 响应结构与 JSON Path:

#### `raw=false`（精简，推荐）:

* 顶层: `$.data.username` / `$.data.nickname` / `$.data.count`（本页视频数）/ `$.data.up_continue`（是否有下一页）/ `$.data.last_buffer`（翻页游标）
* 每个视频 `$.data.videos[N]`（N 为下标）:
  * `id`（作品 objectId，喂 `fetch_video_detail` / `fetch_video_comments`）: `$.data.videos[N].id`
  * `object_nonce_id`: `$.data.videos[N].object_nonce_id`
  * `username` / `nickname` / `title`: `$.data.videos[N].username` 等
  * 互动计数: `$.data.videos[N].read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * 发布时间: `$.data.videos[N].create_time`
  * 位置: `$.data.videos[N].location`

#### `raw=true`（原始）:

* 状态码: `$.data.baseResponse.ret`
* 视频数组（注意是 **`object`** 单数，camelCase）: `$.data.object[N]`
* 翻页: `$.data.upContinueFlag`、`$.data.lastBuffer`（另附别名 `$.data.last_buffer`）
* 账号资料: `$.data.contact`（昵称/签名/认证 `authInfo` 等）、`$.data.finderUserInfo`
* 对应关系: raw=false 的 `videos[]` 对应 raw=true 的 `object[]`；`nickname` 取自 `finderUserInfo` / `contact.nickname`。

### 重要提示（视频下载与解密）:

* 直接访问响应里的 `url` 可能打不开视频页面 —— 微信视频号做了**防盗链**。把 `url` 和 `url_token` 拼成完整 URL 再用任意 HTTP 客户端下载（能打开 = HTTP 200，**不代表能播放**，文件是加密的）。
* ⚠️ **视频文件加密说明**: 下载的 MP4 若无法播放即为加密文件。请使用接口返回的 `decode_key` 字段和加密视频文件进行解密。
* ⚠️ **重要**: 微信**每次请求都返回新的加密链接和 `decode_key`**（即使同一视频）。务必保证 `decode_key` 与下载的加密文件来自**同一次 API 响应**，否则解密失败。
* JSON Path（逐个视频取 —— N 为下标）:
  * `raw=false`（**推荐做媒体下载**）—— `$.data.videos[N].media` 是单个对象:
    * 视频 CDN 链接（不带 Token）: `$.data.videos[N].media.url`
    * 视频 CDN 链接的 Token: `$.data.videos[N].media.url_token`
    * 拼接好的完整 CDN URL（= url + url\_token，可直接用）: `$.data.videos[N].media.full_url`
    * 视频解密密钥（每次请求都不一样）: `$.data.videos[N].media.decode_key`
  * `raw=true` —— media 嵌在 `$.data.object[N].objectDesc.media[0]`（camelCase: `url` / `urlToken` / `decodeKey`，完整 URL = `url` + `urlToken`）。做媒体下载建议直接用 `raw=false`，路径更干净。
* 在线解密工具: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* 可自行部署的解密 API（Docker 一键部署）: [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

# \[English]

### Purpose:

* Get the video list from a WeChat Channels account's homepage.
* Each video carries a `media` object (`url` / `url_token` / `full_url` / `decode_key`) ready for download and decryption.
* Supports pagination for more videos.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `id` / `object_nonce_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* username: WeChat Channels finder username (`v2_…@finder` format), e.g. `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder` (People's Daily). See `fetch_channel_info` / `fetch_video_detail` / `fetch_channel_id_to_username` docs for how to obtain it.
* last\_buffer: Optional pagination cursor (base64). **Leave empty for the first page**; when `up_continue` in the response is truthy, pass the previous page's `last_buffer` to get the next page. (base64 contains `+//=` characters, hence body instead of query.)
* raw: Optional, default True. True=raw response; False=simplified parsed structure (recommended for media download).

### Return:

* User video list with pagination cursor

### Response structure & JSON Path:

#### `raw=false` (simplified, recommended):

* Top level: `$.data.username` / `$.data.nickname` / `$.data.count` (videos on this page) / `$.data.up_continue` (has next page) / `$.data.last_buffer` (pagination cursor)
* Each video `$.data.videos[N]` (N is the index):
  * `id` (video objectId, feed into `fetch_video_detail` / `fetch_video_comments`): `$.data.videos[N].id`
  * `object_nonce_id`: `$.data.videos[N].object_nonce_id`
  * `username` / `nickname` / `title`: `$.data.videos[N].username` etc.
  * Interaction counts: `$.data.videos[N].read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * Publish time: `$.data.videos[N].create_time`
  * Location: `$.data.videos[N].location`

#### `raw=true` (raw):

* Status code: `$.data.baseResponse.ret`
* Video array (note: singular **`object`**, camelCase): `$.data.object[N]`
* Pagination: `$.data.upContinueFlag`, `$.data.lastBuffer` (alias `$.data.last_buffer` also provided)
* Account profile: `$.data.contact` (nickname/signature/`authInfo` etc.), `$.data.finderUserInfo`
* Mapping: `videos[]` of raw=false corresponds to `object[]` of raw=true; `nickname` comes from `finderUserInfo` / `contact.nickname`.

### Important Note (video download & decryption):

* Accessing the `url` field directly may fail to open the video page — WeChat Channels uses **anti-hotlinking**. Concatenate `url` and `url_token` into a full URL and download via any HTTP client (opening = HTTP 200, **does not mean playable**, the file is encrypted).
* ⚠️ **Video Encryption Notice**: If the downloaded MP4 cannot be played, it is encrypted. Use the `decode_key` field from the response together with the encrypted file to decrypt it.
* ⚠️ **Important**: WeChat returns a **new encrypted link and `decode_key` on every request** (even for the same video). Make sure the `decode_key` and the downloaded encrypted file come from the **same API response**, otherwise decryption will fail.
* JSON Path (per video — N is the index):
  * `raw=false` (**recommended for media download**) — `$.data.videos[N].media` is a single object:
    * Video CDN link (without Token): `$.data.videos[N].media.url`
    * Token of the video CDN link: `$.data.videos[N].media.url_token`
    * Pre-concatenated full CDN URL (= url + url\_token, ready to use): `$.data.videos[N].media.full_url`
    * Video decryption key (different on every request): `$.data.videos[N].media.decode_key`
  * `raw=true` — media is nested at `$.data.object[N].objectDesc.media[0]` (camelCase: `url` / `urlToken` / `decodeKey`, full URL = `url` + `urlToken`). For media download, prefer `raw=false` for cleaner paths.
* Online decryption tool: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* Self-deployable decryption API (one-click Docker deployment): [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_videos",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_videos",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号作品详情/Get WeChat Channels Video Detail

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_video_detail`

# \[中文]

### 用途:

* 获取视频号作品详情，返回作品完整详情（媒体地址 `media` + `decode_key`）。
* 支持三种入参，**三选一、优先级 object\_id > export\_id > share\_url**。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* object\_id: 最优先，可选。作品 objectId（纯数字），示例 `14941130915890399732`。可从 `fetch_user_videos` / `fetch_collection_videos` 的视频 `id` 获取。
* export\_id: 其次，可选。搜索结果里的 `exportId`（须以 `export/` 开头）。搜索返回的视频项往往只有 `exportId`、没有明文 object\_id —— 此时直接传 export\_id（会过期，需尽快用）。
* object\_nonce\_id: 可选。搜索结果里的 `feedNonceId`（纯数字），搭配上面两者提升命中率。
* share\_url: 最后，可选。视频号分享短链（`https://weixin.qq.com/sph/…`），示例 `https://weixin.qq.com/sph/AH3sCoIPhH`。仅在 object\_id 与 export\_id 都为空时使用。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构（推荐做媒体下载）。
* 三者须至少传一个；`share_url` 需为视频号分享短链（`https://weixin.qq.com/sph/…`）。

### 返回:

* 作品完整详情（含媒体下载地址与解密密钥）

### 典型链路（从作品到账号 / 更多作品）:

1. 本接口 `fetch_video_detail` → 响应含明文 `id`（objectId）、`username`（`v2_…@finder`）、`media`（`url` / `url_token` / `decode_key`）
2. 拿到的 `username` 再喂 → `fetch_channel_info`（账号资料 / 认证）、`fetch_user_videos`（该号更多作品）、`fetch_user_profile`（主页统计）、`fetch_video_comments`（本视频评论，用第 1 步的 `id`）

### 响应结构与 JSON Path:

#### `raw=false`（精简，推荐）:

* `data` 即单个视频对象:
  * `id`（作品 objectId）: `$.data.id`
  * `username`（`v2_…@finder`）/ `nickname` / `title`: `$.data.username` 等
  * 互动计数: `$.data.read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * 发布时间 / 类型 / 位置: `$.data.create_time` / `$.data.object_type` / `$.data.location`
  * 媒体对象: `$.data.media`（见下方下载/解密）

#### `raw=true`（原始）:

* 状态码: `$.data.baseResponse.ret`
* 命中回执: `$.data.objectResponses[0].objectId` / `.exportId`
* 视频对象（**注意是 `objects` 复数**，camelCase）: `$.data.objects[0]`
* 对应关系: raw=false 的扁平字段对应 raw=true 的 `objects[0]`。

### 重要提示（视频下载与解密）:

* 直接访问响应返回的 `url` 字段可能无法正确打开视频页面 —— 微信对视频号页面做了**防盗链**处理。把 `url` 和 `url_token` 拼成一个完整 URL 再在浏览器 / HTTP 客户端打开。（注：能打开 = HTTP 200，**不代表视频能正常播放**，因为视频文件是加密的。）
* ⚠️ **视频文件加密说明**: MP4 无法播放即为加密。请使用接口返回的 `decode_key` 字段和加密视频文件进行解密。
* ⚠️ **重要**: 微信接口**每次请求都会返回新的加密文件链接和 `decode_key`**，即使是同一个视频。请确保用于解密的 `decode_key` 与下载的加密视频文件来自**同一次 API 响应**，否则解密会失败。
* JSON Path（区分 raw）:
  * `raw=false`（推荐做媒体下载）—— `$.data.media` 是单个对象:
    * 视频 CDN 链接（不带 Token）: `$.data.media.url`
    * 视频 CDN 链接的 Token: `$.data.media.url_token`
    * 拼接好的完整 CDN URL（= `url` + `url_token`，可直接用）: `$.data.media.full_url`
    * 视频解密密钥（每次请求都不一样）: `$.data.media.decode_key`
  * `raw=true` —— `$.data.objects[0].objectDesc.media[0]`:
    * 视频 CDN 链接（不带 Token）: `$.data.objects[0].objectDesc.media[0].url`
    * Token: `$.data.objects[0].objectDesc.media[0].urlToken`
    * 完整 URL = `url` + `urlToken`（拼接）
    * 视频解密密钥: `$.data.objects[0].objectDesc.media[0].decodeKey`
* 在线解密工具: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* 可自行部署的解密 API（Docker 一键部署）: [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

# \[English]

### Purpose:

* Get the full detail of a WeChat Channels video (media address `media` + `decode_key`).
* Three input options, **choose one, priority object\_id > export\_id > share\_url**.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* object\_id: Highest priority, optional. Video objectId (numeric), e.g. `14941130915890399732`. Obtainable from the video `id` of `fetch_user_videos` / `fetch_collection_videos`.
* export\_id: Second priority, optional. `exportId` from search results (must start with `export/`). Search results often only carry `exportId` without a plain object\_id — pass export\_id directly in that case (it expires, use it soon).
* object\_nonce\_id: Optional. `feedNonceId` (numeric) from search results, pairs with the above to improve hit rate.
* share\_url: Last, optional. Channels share URL (`https://weixin.qq.com/sph/…`), e.g. `https://weixin.qq.com/sph/AH3sCoIPhH`. Used only when both object\_id and export\_id are empty.
* raw: Optional, default True. True=raw response; False=simplified parsed structure (recommended for media download).
* At least one of the three must be provided; `share_url` must be a Channels share URL (`https://weixin.qq.com/sph/…`).

### Return:

* Full video detail (including media download address and decryption key)

### Typical chain (from a video to the account / more videos):

1. This endpoint `fetch_video_detail` → response contains plain `id` (objectId), `username` (`v2_…@finder`), `media` (`url` / `url_token` / `decode_key`)
2. Feed the obtained `username` into → `fetch_channel_info` (account info / verification), `fetch_user_videos` (more videos of the account), `fetch_user_profile` (homepage stats), `fetch_video_comments` (comments of this video, using `id` from step 1)

### Response structure & JSON Path:

#### `raw=false` (simplified, recommended):

* `data` is a single video object:
  * `id` (video objectId): `$.data.id`
  * `username` (`v2_…@finder`) / `nickname` / `title`: `$.data.username` etc.
  * Interaction counts: `$.data.read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * Publish time / type / location: `$.data.create_time` / `$.data.object_type` / `$.data.location`
  * Media object: `$.data.media` (see download/decryption below)

#### `raw=true` (raw):

* Status code: `$.data.baseResponse.ret`
* Hit receipt: `$.data.objectResponses[0].objectId` / `.exportId`
* Video object (**note: plural `objects`**, camelCase): `$.data.objects[0]`
* Mapping: flat fields of raw=false correspond to `objects[0]` of raw=true.

### Important Note (video download & decryption):

* Accessing the `url` field directly may fail to open the video page — WeChat applies **anti-hotlinking** to Channels pages. Concatenate `url` and `url_token` into a complete URL, then open it in a browser / HTTP client. (Note: opening = HTTP 200, **does not mean playable**, the video file is encrypted.)
* ⚠️ **Video Encryption Notice**: If the MP4 cannot be played, it is encrypted. Use the `decode_key` field from the response together with the encrypted video file to decrypt it.
* ⚠️ **Important**: The WeChat API returns a **new encrypted file link and `decode_key` on every request**, even for the same video. Make sure the `decode_key` used for decryption and the downloaded encrypted file come from the **same API response**, otherwise decryption will fail.
* JSON Path (by raw):
  * `raw=false` (recommended for media download) — `$.data.media` is a single object:
    * Video CDN link (without Token): `$.data.media.url`
    * Token of the video CDN link: `$.data.media.url_token`
    * Pre-concatenated full CDN URL (= `url` + `url_token`, ready to use): `$.data.media.full_url`
    * Video decryption key (different on every request): `$.data.media.decode_key`
  * `raw=true` — `$.data.objects[0].objectDesc.media[0]`:
    * Video CDN link (without Token): `$.data.objects[0].objectDesc.media[0].url`
    * Token: `$.data.objects[0].objectDesc.media[0].urlToken`
    * Full URL = `url` + `urlToken` (concatenate)
    * Video decryption key: `$.data.objects[0].objectDesc.media[0].decodeKey`
* Online decryption tool: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* Self-deployable decryption API (one-click Docker deployment): [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_detail",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_detail",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号作品评论/Get WeChat Channels Video Comments

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_video_comments`

# \[中文]

### 用途:

* 获取作品的一级评论（含 IP 属地 / 点赞数）；传 `comment_id` 则返回该评论下的二级回复。
* 支持翻页获取更多评论。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `comment_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* object\_id: 作品 objectId（纯数字），示例 `14941130915890399732`。来自 `fetch_user_videos` / `fetch_video_detail` 的视频 `id`。
* last\_buffer: 可选，翻页游标（base64）。**首页留空**；当响应 `down_continue` 为真时传上一页的 `last_buffer`。
* comment\_id: 可选。展开某条评论的二级回复时传该评论的 `comment_id`（纯数字）；首页留空。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 评论列表及翻页游标

### 响应结构与 JSON Path:

#### `raw=false`（精简）:

* 顶层: `$.data.object_id`（回显）/ `$.data.comment_id`（展开回复时回显，否则 null）/ `$.data.count`（本页评论数）/ `$.data.down_continue`（是否有下一页）/ `$.data.last_buffer`（翻页游标）
* 每条评论 `$.data.comments[N]`:
  * 评论 ID（展开其二级回复时回传）: `$.data.comments[N].comment_id`
  * 评论人: `$.data.comments[N].nickname` / `.username` / `.head_url`
  * 正文: `$.data.comments[N].content`
  * 点赞 / 回复数: `$.data.comments[N].like_count` / `.reply_count`
  * 时间 / IP 属地: `$.data.comments[N].create_time` / `.ip_region`

#### `raw=true`（原始）:

* 状态码: `$.data.baseResponse.ret`
* 评论数组（camelCase）: `$.data.commentInfo[N]`，关键字段 `commentId` / `nickname` / `username` / `content` / `likeCount` / `createtime` / `headUrl` / `ipRegionInfo.regionText`
* 翻页: `$.data.downContinueFlag`、`$.data.lastBuffer`（另附别名 `$.data.last_buffer`）
* 全局计数: `$.data.monotonicData.commentCount.commentCount`、`$.data.countInfo`（likeCount/favCount/forwardCount 等）
* 对应关系: raw=false 的 `comments[]` 对应 raw=true 的 `commentInfo[]`。

# \[English]

### Purpose:

* Get first-level comments of a video (with IP region / like count); pass `comment_id` to get second-level replies under that comment.
* Supports pagination for more comments.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `comment_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* object\_id: Video objectId (numeric), e.g. `14941130915890399732`. From the video `id` of `fetch_user_videos` / `fetch_video_detail`.
* last\_buffer: Optional pagination cursor (base64). **Leave empty for the first page**; when `down_continue` is truthy, pass the previous page's `last_buffer`.
* comment\_id: Optional. To expand the replies of a comment, pass its `comment_id` (numeric); leave empty for the first-level page.
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Comment list with pagination cursor

### Response structure & JSON Path:

#### `raw=false` (simplified):

* Top level: `$.data.object_id` (echo) / `$.data.comment_id` (echo when expanding replies, otherwise null) / `$.data.count` (comments on this page) / `$.data.down_continue` (has next page) / `$.data.last_buffer` (pagination cursor)
* Each comment `$.data.comments[N]`:
  * Comment ID (pass it back to expand its replies): `$.data.comments[N].comment_id`
  * Commenter: `$.data.comments[N].nickname` / `.username` / `.head_url`
  * Content: `$.data.comments[N].content`
  * Like / reply counts: `$.data.comments[N].like_count` / `.reply_count`
  * Time / IP region: `$.data.comments[N].create_time` / `.ip_region`

#### `raw=true` (raw):

* Status code: `$.data.baseResponse.ret`
* Comment array (camelCase): `$.data.commentInfo[N]`, key fields `commentId` / `nickname` / `username` / `content` / `likeCount` / `createtime` / `headUrl` / `ipRegionInfo.regionText`
* Pagination: `$.data.downContinueFlag`, `$.data.lastBuffer` (alias `$.data.last_buffer` also provided)
* Global counts: `$.data.monotonicData.commentCount.commentCount`, `$.data.countInfo` (likeCount/favCount/forwardCount etc.)
* Mapping: `comments[]` of raw=false corresponds to `commentInfo[]` of raw=true.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_comments",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_comments",
  "input": {}
}
)
print(res.json())
```

***

### 生成视频号作品分享链接/Generate WeChat Channels Video Share URL

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_video_share_url`

# \[中文]

### 用途:

* 给定作品 `object_id`，返回一条可对外分享的 `weixin.qq.com/sph/…` 短链（与 `fetch_video_detail` 的 `share_url` 入参互为反向）。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* object\_id: 作品 objectId（纯数字），示例 `14941130915890399732`。来自 `fetch_user_videos` / `fetch_video_detail` 的视频 `id`。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 作品分享短链

### 响应结构与 JSON Path:

#### `raw=false`（精简）:

* 入参回显: `$.data.object_id`
* 生成的分享短链（可直接喂 `fetch_video_detail` 的 `share_url`）: `$.data.share_url`

#### `raw=true`（原始）:

* 状态码: `$.data.baseResponse.ret`
* 分享短链: `$.data.feedH5Url`
* 列表形式（批量时逐项）: `$.data.urlList[N].feedH5Url` / `$.data.urlList[N].objectId`
* 对应关系: raw=false 的 `share_url` 取自 raw=true 的 `feedH5Url`（或 `urlList[0].feedH5Url`），`object_id` 即入参回显。

# \[English]

### Purpose:

* Given a video `object_id`, return a shareable `weixin.qq.com/sph/…` short link (the inverse of the `share_url` input of `fetch_video_detail`).
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* object\_id: Video objectId (numeric), e.g. `14941130915890399732`. From the video `id` of `fetch_user_videos` / `fetch_video_detail`.
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Video share short link

### Response structure & JSON Path:

#### `raw=false` (simplified):

* Input echo: `$.data.object_id`
* Generated share link (feed directly into `share_url` of `fetch_video_detail`): `$.data.share_url`

#### `raw=true` (raw):

* Status code: `$.data.baseResponse.ret`
* Share link: `$.data.feedH5Url`
* List form (per item when batched): `$.data.urlList[N].feedH5Url` / `$.data.urlList[N].objectId`
* Mapping: `share_url` of raw=false comes from `feedH5Url` (or `urlList[0].feedH5Url`) of raw=true; `object_id` is the input echo.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_share_url",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_video_share_url",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号账号主页资料+统计/Get WeChat Channels User Profile & Stats

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_user_profile`

# \[中文]

### 用途:

* 获取创作者的主页资料与互动统计。与 `fetch_channel_info`（认证主体 / 许可证）**互补**：本接口给昵称 / 签名 / 头像、粉丝 / 作品 / 获赞 / 收藏 / 转发数、直播时长、IP 属地、合集数、关联公众号等。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* username: 视频号 finder username（`v2_…@finder` 格式）。来源：`fetch_video_detail`、`fetch_user_videos` 响应里视频对象的 `username`；或 `fetch_channel_id_to_username` 把 `sph…` 短号转成 username。示例 `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder`（人民日报）。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 账号主页资料与互动统计

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case 拍平）:

* `$.data.username` —— finder username
* `$.data.nickname` / `$.data.signature` / `$.data.head_url`（头像）/ `$.data.region`（IP 属地，如「北京」）
* `$.data.fans_count` —— 粉丝数。**注意：部分账号（如人民日报）返回 0**
* `$.data.feeds_count` —— 作品数（示例 10555）
* `$.data.like_count` / `$.data.fav_count` / `$.data.forward_count` —— 获赞 / 收藏 / 转发数（部分账号为 0）
* `$.data.friend_follow_count` —— 好友关注数
* `$.data.live_duration_hours` —— 累计直播时长（小时）
* `$.data.original_flag` —— 原创标记
* `$.data.collection_count` —— 合集数（示例 6；明细走 `fetch_user_collections`）
* `$.data.verify_desc` —— 认证说明（可能为 null）
* `$.data.linked_accounts[]` —— 关联公众号 `[{nickname, type}]`（如 `{"nickname":"人民日报","type":"公众号"}`）

#### `raw=true`（完整原始响应，camelCase 嵌套）:

* `$.data.contact.nickname` / `.signature` / `.headUrl` → `nickname` / `signature` / `head_url`
* `$.data.contact.username` → `username`；`$.data.contact.originalFlag` → `original_flag`
* `$.data.contact.authInfo`（`authProfession` / `authIconType` …）—— 认证信息
* `$.data.ipRegionInfo.regionText` → `region`
* `$.data.fansCount` → `fans_count`（同样部分账号为 0）；`$.data.feedsCount` → `feeds_count`
* `$.data.feedsLikeCount` / `.feedsFavCount` / `.feedsForwardCount` → `like_count` / `fav_count` / `forward_count`
* `$.data.liveDurationHours` → `live_duration_hours`；`$.data.collectionListInfo.collectionCount` → `collection_count`
* `$.data.bizInfo.info[]`（`bizNickname` / `serviceTypeName`）→ `linked_accounts[]`
* 另含 `$.data.object[]`（首屏作品列表）、`$.data.anchorStatInfo`（直播场次统计）、`$.data.lastBuffer` / `$.data.continueFlag`（首屏作品翻页用，本接口只取资料故一般不用）等几十个字段。

# \[English]

### Purpose:

* Get a creator's homepage profile and interaction stats. **Complementary** to `fetch_channel_info` (verification entity / license): this endpoint provides nickname / signature / avatar, follower / video / like / favorite / forward counts, live duration, IP region, collection count, linked official accounts, etc.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* username: WeChat Channels finder username (`v2_…@finder` format). Source: the `username` field of video objects in `fetch_video_detail` / `fetch_user_videos` responses; or convert a `sph…` short ID via `fetch_channel_id_to_username`. E.g. `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder` (People's Daily).
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Account homepage profile and interaction stats

### Response structure & JSON Path:

#### `raw=false` (simplified, flattened snake\_case):

* `$.data.username` — finder username
* `$.data.nickname` / `$.data.signature` / `$.data.head_url` (avatar) / `$.data.region` (IP region, e.g. "北京")
* `$.data.fans_count` — follower count. **Note: some accounts (e.g. People's Daily) return 0**
* `$.data.feeds_count` — video count (e.g. 10555)
* `$.data.like_count` / `$.data.fav_count` / `$.data.forward_count` — like / favorite / forward counts (0 for some accounts)
* `$.data.friend_follow_count` — friend-follow count
* `$.data.live_duration_hours` — accumulated live streaming hours
* `$.data.original_flag` — original-content flag
* `$.data.collection_count` — collection count (e.g. 6; details via `fetch_user_collections`)
* `$.data.verify_desc` — verification description (may be null)
* `$.data.linked_accounts[]` — linked official accounts `[{nickname, type}]` (e.g. `{"nickname":"人民日报","type":"公众号"}`)

#### `raw=true` (full raw response, nested camelCase):

* `$.data.contact.nickname` / `.signature` / `.headUrl` → `nickname` / `signature` / `head_url`
* `$.data.contact.username` → `username`; `$.data.contact.originalFlag` → `original_flag`
* `$.data.contact.authInfo` (`authProfession` / `authIconType` …) — verification info
* `$.data.ipRegionInfo.regionText` → `region`
* `$.data.fansCount` → `fans_count` (also 0 for some accounts); `$.data.feedsCount` → `feeds_count`
* `$.data.feedsLikeCount` / `.feedsFavCount` / `.feedsForwardCount` → `like_count` / `fav_count` / `forward_count`
* `$.data.liveDurationHours` → `live_duration_hours`; `$.data.collectionListInfo.collectionCount` → `collection_count`
* `$.data.bizInfo.info[]` (`bizNickname` / `serviceTypeName`) → `linked_accounts[]`
* Also contains dozens of raw fields like `$.data.object[]` (first-screen video list), `$.data.anchorStatInfo` (live session stats), `$.data.lastBuffer` / `$.data.continueFlag` (pagination of the first-screen videos; generally unused here since this endpoint is for profile data).

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_profile",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_profile",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号合集列表/Get WeChat Channels User Collections

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_user_collections`

# \[中文]

### 用途:

* 获取创作者主页的「合集」列表。每个合集的 `topic_id` 可传 `fetch_collection_videos` 取该合集内的视频。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `topic_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* username: 视频号 finder username（`v2_…@finder` 格式）。示例 `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder`（人民日报）。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 合集列表

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case）:

* `$.data.username` —— finder username
* `$.data.count` —— 合集总数（示例 6）
* `$.data.collections[]` —— 合集数组，逐个（N 为下标）:
  * `$.data.collections[N].topic_id` —— 合集 ID（纯数字，传 `fetch_collection_videos`，示例 `14616794565351966924`）
  * `$.data.collections[N].name` —— 合集名（如「早安中国」）
  * `$.data.collections[N].desc` —— 合集简介（可能为空串）
  * `$.data.collections[N].cover_url` —— 合集封面
  * `$.data.collections[N].feed_count` —— 合集内视频数
  * `$.data.collections[N].topic_type` —— 合集类型（示例 16，与 `fetch_collection_videos` 的 `topic_type` 对应）

#### `raw=true`（完整原始响应，camelCase）:

* `$.data.collectionCount` → `count`
* `$.data.collectionInfo[]` → `collections[]`，逐个:
  * `$.data.collectionInfo[N].collectionTopicId` → `topic_id`（数字；另有 `collectionTopicIdStr` 字符串别名）
  * `$.data.collectionInfo[N].collectionName` → `name`
  * `$.data.collectionInfo[N].collectionDesc` → `desc`
  * `$.data.collectionInfo[N].coverImgUrl` → `cover_url`
  * `$.data.collectionInfo[N].feedCount` → `feed_count`
  * `$.data.collectionInfo[N].collectionTopicType` → `topic_type`
  * 另含 `lastUpdateTime` / `readCount` / `categoryId` 等原始字段
* `$.data.lastBuffer` —— 合集列表翻页游标（通常为空，合集数少不需翻页）

# \[English]

### Purpose:

* Get the "Collections" list on a creator's homepage. Pass each collection's `topic_id` to `fetch_collection_videos` to get its videos.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `topic_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* username: WeChat Channels finder username (`v2_…@finder` format). E.g. `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder` (People's Daily).
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Collection list

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* `$.data.username` — finder username
* `$.data.count` — total collections (e.g. 6)
* `$.data.collections[]` — collection array, per item (N is the index):
  * `$.data.collections[N].topic_id` — collection ID (numeric, pass to `fetch_collection_videos`, e.g. `14616794565351966924`)
  * `$.data.collections[N].name` — collection name (e.g. "早安中国")
  * `$.data.collections[N].desc` — collection description (may be empty string)
  * `$.data.collections[N].cover_url` — collection cover
  * `$.data.collections[N].feed_count` — number of videos in the collection
  * `$.data.collections[N].topic_type` — collection type (e.g. 16, matches `topic_type` of `fetch_collection_videos`)

#### `raw=true` (full raw response, camelCase):

* `$.data.collectionCount` → `count`
* `$.data.collectionInfo[]` → `collections[]`, per item:
  * `$.data.collectionInfo[N].collectionTopicId` → `topic_id` (number; `collectionTopicIdStr` provides a string alias)
  * `$.data.collectionInfo[N].collectionName` → `name`
  * `$.data.collectionInfo[N].collectionDesc` → `desc`
  * `$.data.collectionInfo[N].coverImgUrl` → `cover_url`
  * `$.data.collectionInfo[N].feedCount` → `feed_count`
  * `$.data.collectionInfo[N].collectionTopicType` → `topic_type`
  * Also raw fields like `lastUpdateTime` / `readCount` / `categoryId`
* `$.data.lastBuffer` — pagination cursor of the collection list (usually empty; few collections, no pagination needed)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_collections",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_user_collections",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号合集内视频/Get WeChat Channels Collection Videos

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_collection_videos`

# \[中文]

### 用途:

* 给定合集 `topic_id`（来自 `fetch_user_collections`），返回该合集内的视频列表。
* 每个视频带媒体地址 `media`（含 `url` / `url_token` / `decode_key`），可直接下载解密。
* 支持翻页获取更多视频。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `id` / `topic_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* topic\_id: 合集 ID（纯数字，来自 `fetch_user_collections` 的 `topic_id`）。示例 `14616794565351966924`（人民日报「早安中国」合集）。
* topic: 可选，合集名，提高命中。示例 `早安中国`。
* username: 可选，创作者 finder username（`v2_…@finder` 格式），提高命中。
* last\_buffer: 可选，翻页游标（base64），**首页留空**；当响应 `down_continue` 为真时，传上一页响应的 `last_buffer` 取下一页。
* topic\_type: 可选，合集类型，默认 16（与 `fetch_user_collections` 里该合集的 `topic_type` 对齐）。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构（推荐做媒体下载）。

### 返回:

* 合集内视频列表及翻页游标

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case，**推荐做媒体下载**）:

* `$.data.topic_id` / `$.data.title`（合集名）
* `$.data.total_count` —— 合集总视频数；`$.data.count` —— 本页条数（示例 20）
* `$.data.videos[]` —— 视频数组，逐个（N 为下标）:
  * `$.data.videos[N].id` —— 作品 objectId（可喂 `fetch_video_detail` / `fetch_video_comments`）
  * `$.data.videos[N].username` / `.nickname` / `.title`（可能为 null）/ `.create_time`
  * `$.data.videos[N].read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * `$.data.videos[N].media` —— 媒体对象（单个），下载 + 解密:
    * `$.data.videos[N].media.url` —— 视频 CDN 链接（不带 Token）
    * `$.data.videos[N].media.url_token` —— CDN 链接 Token（防盗链）
    * `$.data.videos[N].media.full_url` —— 已拼好的完整 CDN URL（= `url` + `url_token`，可直接下载）
    * `$.data.videos[N].media.decode_key` —— 视频解密密钥（**每次请求都不同**）
    * 另含 `cover_url` / `duration` / `width` / `height` / `media_type` 等
* `$.data.down_continue` —— 是否有下一页（1=有）
* `$.data.last_buffer` —— 翻页游标（传回本接口取下一页）

#### `raw=true`（完整原始响应，camelCase）:

* `$.data.totalCount` → `total_count`
* `$.data.object[]` → `videos[]`（完整视频对象），逐个:
  * `$.data.object[N].id` → `id`；`$.data.object[N].username` → `username`
  * 媒体在 `$.data.object[N].objectDesc.media[0]`: `.url` → `url`、`.urlToken` → `url_token`、`.decodeKey` → `decode_key`（`full_url` 为精简层拼接产物，raw 需自行 `url` + `urlToken` 拼接）
* `$.data.downContinueFlag` → `down_continue`（注意 raw 顶层另有 `continueFlag`，合集翻页以 `downContinueFlag` 为准）
* `$.data.lastBuffer`（别名 `$.data.last_buffer`）→ `last_buffer`

### 重要提示（视频下载与解密）:

* 同 `fetch_video_detail`：直接访问 `url` 可能因防盗链打不开，需用 `full_url`（已拼 Token）下载；MP4 不能播即为加密文件，用**同一次响应**的 `decode_key` 解密（每次请求 `decode_key` 都变）。
* 在线解密工具: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* 可自行部署的解密 API（Docker 一键部署）: [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

# \[English]

### Purpose:

* Given a collection `topic_id` (from `fetch_user_collections`), return the video list inside that collection.
* Each video carries a `media` object (`url` / `url_token` / `decode_key`) ready for download and decryption.
* Supports pagination for more videos.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `id` / `topic_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* topic\_id: Collection ID (numeric, from `topic_id` of `fetch_user_collections`). E.g. `14616794565351966924` (People's Daily "早安中国" collection).
* topic: Optional, collection name, improves hit rate. E.g. `早安中国`.
* username: Optional, creator finder username (`v2_…@finder` format), improves hit rate.
* last\_buffer: Optional pagination cursor (base64), **leave empty for the first page**; when `down_continue` is truthy, pass the previous page's `last_buffer`.
* topic\_type: Optional, collection type, default 16 (align with the collection's `topic_type` from `fetch_user_collections`).
* raw: Optional, default True. True=raw response; False=simplified parsed structure (recommended for media download).

### Return:

* Video list of the collection with pagination cursor

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case, **recommended for media download**):

* `$.data.topic_id` / `$.data.title` (collection name)
* `$.data.total_count` — total videos in the collection; `$.data.count` — items on this page (e.g. 20)
* `$.data.videos[]` — video array, per item (N is the index):
  * `$.data.videos[N].id` — video objectId (feed into `fetch_video_detail` / `fetch_video_comments`)
  * `$.data.videos[N].username` / `.nickname` / `.title` (may be null) / `.create_time`
  * `$.data.videos[N].read_count` / `.like_count` / `.fav_count` / `.forward_count` / `.comment_count`
  * `$.data.videos[N].media` — media object (single), download + decrypt:
    * `$.data.videos[N].media.url` — video CDN link (without Token)
    * `$.data.videos[N].media.url_token` — Token of the CDN link (anti-hotlinking)
    * `$.data.videos[N].media.full_url` — pre-concatenated full CDN URL (= `url` + `url_token`, ready to download)
    * `$.data.videos[N].media.decode_key` — video decryption key (**different on every request**)
    * Also `cover_url` / `duration` / `width` / `height` / `media_type` etc.
* `$.data.down_continue` — has next page (1=yes)
* `$.data.last_buffer` — pagination cursor (pass back to this endpoint for the next page)

#### `raw=true` (full raw response, camelCase):

* `$.data.totalCount` → `total_count`
* `$.data.object[]` → `videos[]` (full video objects), per item:
  * `$.data.object[N].id` → `id`; `$.data.object[N].username` → `username`
  * Media at `$.data.object[N].objectDesc.media[0]`: `.url` → `url`, `.urlToken` → `url_token`, `.decodeKey` → `decode_key` (`full_url` is produced by the simplified layer; for raw, concatenate `url` + `urlToken` yourself)
* `$.data.downContinueFlag` → `down_continue` (note: raw top level also has `continueFlag`; for collection pagination use `downContinueFlag`)
* `$.data.lastBuffer` (alias `$.data.last_buffer`) → `last_buffer`

### Important Note (video download & decryption):

* Same as `fetch_video_detail`: accessing `url` directly may fail due to anti-hotlinking, download via `full_url` (Token already appended); if the MP4 cannot be played it is encrypted, decrypt with the `decode_key` from the **same response** (the `decode_key` changes on every request).
* Online decryption tool: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* Self-deployable decryption API (one-click Docker deployment): [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_collection_videos",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_collection_videos",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号直播回放列表/Get WeChat Channels Live History

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_live_history`

# \[中文]

### 用途:

* 获取创作者的直播回放列表。回放本身就是视频对象，每条带媒体地址 `media`（含 `url` / `url_token` / `decode_key`），可直接下载解密。
* 支持翻页获取更多回放。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* username: 视频号 finder username（`v2_…@finder` 格式）。示例（有直播回放的号）`v2_060000231003b20faec8cae1811ac4d5c702ea32b0771737aa785454f7f8177114cc4d248d66@finder`（虎嗅）。
* last\_buffer: 可选，翻页游标（base64），**首页留空**；当响应 `continue_flag` 为真时，传上一页响应的 `last_buffer` 取下一页。
* flag: 可选，拉取标志，默认 12。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构（推荐做媒体下载）。

### 返回:

* 直播回放列表及翻页游标

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case，**推荐做媒体下载**）:

* `$.data.username`
* `$.data.count` —— 本页条数；`$.data.total_count` —— 回放总数（**无回放时为 0**）
* `$.data.lives[]` —— 回放数组，每条是一个视频对象（结构同 `fetch_collection_videos` 的 video），逐个（N 为下标）:
  * `$.data.lives[N].id` —— 回放作品 objectId
  * `$.data.lives[N].username` / `.nickname` / `.title` / `.create_time`
  * `$.data.lives[N].like_count` / `.fav_count` / `.forward_count` / `.comment_count` 等计数
  * `$.data.lives[N].media` —— 媒体对象（单个），下载 + 解密:
    * `$.data.lives[N].media.url` —— 视频 CDN 链接（不带 Token）
    * `$.data.lives[N].media.url_token` —— CDN 链接 Token（防盗链）
    * `$.data.lives[N].media.full_url` —— 已拼好的完整 CDN URL（= `url` + `url_token`，可直接下载）
    * `$.data.lives[N].media.decode_key` —— 视频解密密钥（**每次请求都不同**）
* `$.data.continue_flag` —— 是否有下一页（1=有）
* `$.data.last_buffer` —— 翻页游标（传回本接口取下一页）

#### `raw=true`（完整原始响应，camelCase）:

* `$.data.totalCount` → `total_count`
* `$.data.object[]` → `lives[]`（完整视频对象），逐个媒体在 `$.data.object[N].objectDesc.media[0]`: `.url` → `url`、`.urlToken` → `url_token`、`.decodeKey` → `decode_key`（`full_url` 为精简层拼接产物，raw 需自行 `url` + `urlToken` 拼接）
* `$.data.continueFlag` → `continue_flag`
* `$.data.lastBuffer`（别名 `$.data.last_buffer`）→ `last_buffer`

### 重要提示（视频下载与解密）:

* 同 `fetch_video_detail`：用 `full_url`（已拼 Token）下载，MP4 不能播即加密，用**同一次响应**的 `decode_key` 解密。
* 某条回放的 `live_id`（直播间维度）可进一步喂 `fetch_live_detail`。
* 在线解密工具: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* 可自行部署的解密 API（Docker 一键部署）: [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

# \[English]

### Purpose:

* Get a creator's live replay list. Each replay is itself a video object with a `media` object (`url` / `url_token` / `decode_key`) ready for download and decryption.
* Supports pagination for more replays.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* username: WeChat Channels finder username (`v2_…@finder` format). Example (an account with live replays): `v2_060000231003b20faec8cae1811ac4d5c702ea32b0771737aa785454f7f8177114cc4d248d66@finder` (Huxiu).
* last\_buffer: Optional pagination cursor (base64), **leave empty for the first page**; when `continue_flag` is truthy, pass the previous page's `last_buffer`.
* flag: Optional fetch flag, default 12.
* raw: Optional, default True. True=raw response; False=simplified parsed structure (recommended for media download).

### Return:

* Live replay list with pagination cursor

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case, **recommended for media download**):

* `$.data.username`
* `$.data.count` — items on this page; `$.data.total_count` — total replays (**0 when none**)
* `$.data.lives[]` — replay array, each item is a video object (same shape as videos of `fetch_collection_videos`), per item (N is the index):
  * `$.data.lives[N].id` — replay video objectId
  * `$.data.lives[N].username` / `.nickname` / `.title` / `.create_time`
  * `$.data.lives[N].like_count` / `.fav_count` / `.forward_count` / `.comment_count` etc.
  * `$.data.lives[N].media` — media object (single), download + decrypt:
    * `$.data.lives[N].media.url` — video CDN link (without Token)
    * `$.data.lives[N].media.url_token` — Token of the CDN link (anti-hotlinking)
    * `$.data.lives[N].media.full_url` — pre-concatenated full CDN URL (= `url` + `url_token`, ready to download)
    * `$.data.lives[N].media.decode_key` — video decryption key (**different on every request**)
* `$.data.continue_flag` — has next page (1=yes)
* `$.data.last_buffer` — pagination cursor (pass back to this endpoint for the next page)

#### `raw=true` (full raw response, camelCase):

* `$.data.totalCount` → `total_count`
* `$.data.object[]` → `lives[]` (full video objects), media per item at `$.data.object[N].objectDesc.media[0]`: `.url` → `url`, `.urlToken` → `url_token`, `.decodeKey` → `decode_key` (`full_url` is produced by the simplified layer; for raw, concatenate `url` + `urlToken` yourself)
* `$.data.continueFlag` → `continue_flag`
* `$.data.lastBuffer` (alias `$.data.last_buffer`) → `last_buffer`

### Important Note (video download & decryption):

* Same as `fetch_video_detail`: download via `full_url` (Token already appended); if the MP4 cannot be played it is encrypted, decrypt with the `decode_key` from the **same response**.
* The `live_id` of a replay (live-room dimension) can be fed into `fetch_live_detail`.
* Online decryption tool: [https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/](https://evil0ctal.github.io/WeChat-Channels-Video-File-Decryption/)
* Self-deployable decryption API (one-click Docker deployment): [https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption](https://github.com/Evil0ctal/WeChat-Channels-Video-File-Decryption)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_live_history",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_live_history",
  "input": {}
}
)
print(res.json())
```

***

### 获取视频号直播间详情/Get WeChat Channels Live Detail

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_live_detail`

# \[中文]

### 用途:

* 传直播 `live_id` 返回直播间详情：主播信息、直播状态、在线人数、回放信息等。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `live_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* live\_id: 直播 ID（纯数字）。来源：`fetch_live_history` 的回放条目、直播入口或直播分享。示例 `2078950291205875194`。
* scene: 可选，进入场景，默认 5。
* finder\_username: 可选，主播 finder username（`v2_…@finder` 格式），提高命中。示例 `v2_060000231003b20faec8cae1811ac4d5c702ea32b0771737aa785454f7f8177114cc4d248d66@finder`（虎嗅）。
* raw: 可选，默认 True。True=原始响应；False=精简解析结构。

### 返回:

* 直播间详情

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case）:

* `$.data.live_id` —— 直播 ID；`$.data.object_id` —— 关联作品 objectId（可能为空串）
* `$.data.anchor_nickname` / `$.data.anchor_username` / `$.data.anchor_head_url` —— 主播昵称 / username / 头像
* `$.data.live_cover_url` —— 直播封面
* `$.data.live_status` —— 直播状态（1=直播中 / 2=已结束 …）；`$.data.status_desc` —— 状态文案（可能为空）
* `$.data.online_count` / `$.data.max_online_count` —— 当前 / 峰值在线人数（已结束的直播一般为 0）
* `$.data.replay_status` —— 回放状态；`$.data.replay_url` —— 回放地址（可能为空）；`$.data.replay_watch_uv` —— 回放观看人数

#### `raw=true`（完整原始响应，camelCase）:

* `$.data.liveInfo.liveId` → `live_id`；`$.data.liveInfo.objectId` → `object_id`
* `$.data.liveInfo.liveStatus` → `live_status`；`$.data.liveInfo.statusDesc` → `status_desc`
* `$.data.liveInfo.onlineCnt` → `online_count`；`$.data.liveInfo.maxOnlineCount` → `max_online_count`
* `$.data.liveInfo.replayStatus` → `replay_status`；`$.data.liveInfo.replayUrl` → `replay_url`
* `$.data.liveInfo.replayInfo.watchUv` → `replay_watch_uv`
* `$.data.anchorContact`（`nickname` / `username` / `headUrl` / `coverImgUrl` / `liveCoverImgUrl`）→ 主播相关字段
* 另含 `$.data.liveCover`、`$.data.anchorInfo`、`$.data.replaySubscribedCount` 等几十个原始字段

# \[English]

### Purpose:

* Pass a live `live_id` to get live-room detail: anchor info, live status, online count, replay info, etc.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `live_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* live\_id: Live ID (numeric). Source: replay items of `fetch_live_history`, live entry, or live share. E.g. `2078950291205875194`.
* scene: Optional, entry scene, default 5.
* finder\_username: Optional, anchor finder username (`v2_…@finder` format), improves hit rate. E.g. `v2_060000231003b20faec8cae1811ac4d5c702ea32b0771737aa785454f7f8177114cc4d248d66@finder` (Huxiu).
* raw: Optional, default True. True=raw response; False=simplified parsed structure.

### Return:

* Live room detail

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* `$.data.live_id` — live ID; `$.data.object_id` — associated video objectId (may be empty string)
* `$.data.anchor_nickname` / `$.data.anchor_username` / `$.data.anchor_head_url` — anchor nickname / username / avatar
* `$.data.live_cover_url` — live cover
* `$.data.live_status` — live status (1=live / 2=ended …); `$.data.status_desc` — status text (may be empty)
* `$.data.online_count` / `$.data.max_online_count` — current / peak online count (usually 0 for ended lives)
* `$.data.replay_status` — replay status; `$.data.replay_url` — replay address (may be empty); `$.data.replay_watch_uv` — replay viewer count

#### `raw=true` (full raw response, camelCase):

* `$.data.liveInfo.liveId` → `live_id`; `$.data.liveInfo.objectId` → `object_id`
* `$.data.liveInfo.liveStatus` → `live_status`; `$.data.liveInfo.statusDesc` → `status_desc`
* `$.data.liveInfo.onlineCnt` → `online_count`; `$.data.liveInfo.maxOnlineCount` → `max_online_count`
* `$.data.liveInfo.replayStatus` → `replay_status`; `$.data.liveInfo.replayUrl` → `replay_url`
* `$.data.liveInfo.replayInfo.watchUv` → `replay_watch_uv`
* `$.data.anchorContact` (`nickname` / `username` / `headUrl` / `coverImgUrl` / `liveCoverImgUrl`) → anchor-related fields
* Also dozens of raw fields like `$.data.liveCover`, `$.data.anchorInfo`, `$.data.replaySubscribedCount`

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_live_detail",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_live_detail",
  "input": {}
}
)
print(res.json())
```

***

### 视频号号内搜索/Search Videos Within a WeChat Channel

`0.10 Credits / 次`

`/api/v1/wechat_channels/v2/fetch_search_channel_videos`

# \[中文]

### 用途:

* 号内搜：在指定创作者的视频号内，按关键词搜索其发布的视频（只在**该号内部**检索）。
* 本接口仅做**首页检索**（请求侧不暴露 cursor 参数，单页返回），但响应仍带 `next_cursor` / `continue_flag`，供需要时自行接续翻页参考。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `doc_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* username: 创作者 finder username（`v2_…@finder` 格式）。示例 `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder`（人民日报）。
* keyword: 在该号内搜索的关键词（去空白后 1-100 字）。示例 `新闻`。
* raw: 可选，默认 True。True=原始搜索响应；False=精简解析结构。

### 返回:

* 号内搜索命中列表

### 响应结构与 JSON Path:

#### `raw=false`（精简，snake\_case）:

* `$.data.username` / `$.data.keyword` —— 回显入参
* `$.data.count` —— 本页命中数（示例 20）
* `$.data.items[]` —— 命中数组，逐个（N 为下标）:
  * `$.data.items[N].type` —— 结果类型（如 `video`）
  * `$.data.items[N].doc_id` —— 文档 id
  * `$.data.items[N].title` —— 标题（已去搜索高亮标记）
  * `$.data.items[N].desc` / `.thumb_url` / `.username` / `.nickname` —— 简介 / 缩略图 / 作者（**部分项可能为 null**）
* `$.data.continue_flag` —— 是否还有更多（1=有）
* `$.data.next_cursor` —— 翻页游标对象（携带检索上下文与 `offset` 等；本路由首页检索不消费它）

#### `raw=true`（完整原始响应，camelCase）:

* `$.data.query` → `keyword`；`$.data.offset` —— 下一页偏移（示例 20）
* `$.data.data[]` —— 结果分组数组；命中项嵌在 `$.data.data[N].subBoxes[M].items[]`（亦可能在 `$.data.data[N].items[]`），由精简层拍平成 `items[]`
* `$.data.continueFlag` → `continue_flag`
* `$.data.searchID` —— 翻页所需上下文，精简层归并进 `next_cursor`（顶层另注入 `$.data.next_cursor`）

### 提示:

* 命中视频要拿媒体（下载地址 / decode\_key）：本接口不直接给 `media`，请用命中项走 `fetch_video_detail` 取 `media`（`url` / `url_token` / `decode_key`），链路与解密说明见 `fetch_video_detail` 文档。

# \[English]

### Purpose:

* In-channel search: search a creator's published videos by keyword **within that channel only**.
* This endpoint performs **first-page retrieval only** (no cursor parameter exposed, single-page result), but the response still carries `next_cursor` / `continue_flag` for reference.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `doc_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* username: Creator finder username (`v2_…@finder` format). E.g. `v2_060000231003b20faec8c6e4811dc1d4c602ee30b0771bbcf220c67926bb76ab7702ac335a53@finder` (People's Daily).
* keyword: Keyword to search within the channel (1-100 chars after trimming). E.g. `新闻`.
* raw: Optional, default True. True=raw search response; False=simplified parsed structure.

### Return:

* In-channel search hit list

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* `$.data.username` / `$.data.keyword` — input echo
* `$.data.count` — hits on this page (e.g. 20)
* `$.data.items[]` — hit array, per item (N is the index):
  * `$.data.items[N].type` — result type (e.g. `video`)
  * `$.data.items[N].doc_id` — document id
  * `$.data.items[N].title` — title (search highlight markers stripped)
  * `$.data.items[N].desc` / `.thumb_url` / `.username` / `.nickname` — description / thumbnail / author (**may be null for some items**)
* `$.data.continue_flag` — has more (1=yes)
* `$.data.next_cursor` — pagination cursor object (carries search context and `offset` etc.; not consumed by this first-page-only route)

#### `raw=true` (full raw response, camelCase):

* `$.data.query` → `keyword`; `$.data.offset` — next page offset (e.g. 20)
* `$.data.data[]` — result group array; hit items are nested at `$.data.data[N].subBoxes[M].items[]` (or possibly `$.data.data[N].items[]`), flattened into `items[]` by the simplified layer
* `$.data.continueFlag` → `continue_flag`
* `$.data.searchID` — context required for pagination, merged into `next_cursor` by the simplified layer (`$.data.next_cursor` is also injected at top level)

### Tip:

* To get media (download address / decode\_key) of a hit video: this endpoint does not return `media` directly; feed the hit into `fetch_video_detail` to get `media` (`url` / `url_token` / `decode_key`). See `fetch_video_detail` docs for the chain and decryption notes.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_search_channel_videos",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_channels/v2/fetch_search_channel_videos",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号文章详情/Get WeChat MP Article Detail

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_article_detail`

# \[中文]

### 用途:

* 传文章 URL，返回文章正文 / 标题 / 作者 / 封面 / 发布时间 / 合集信息等。
* 无论 `raw` 取值，嵌套的 `content` JSON 串都会被解析成对象（结构归一化），`raw` 只控制外层字段的投影范围。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `comment_id` / `msgId` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* url: 公众号文章链接（`https://mp.weixin.qq.com/s/…` 或带 `__biz` 的长链）。示例 `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* raw: 可选，默认 True。True=原始响应；False=精简投影。

### 返回:

* 文章详情（正文 / 标题 / 作者 / 封面 / 发布时间 / 合集信息）

### 响应结构与 JSON Path:

#### `raw=false`（精简投影）:

* `data` 顶层仅 4 个字段，文章正文聚合在 `content`:
  * `$.data.url`: 文章 URL
  * `$.data.bizUin`: 公众号 bizUin（int）
  * `$.data.itemIdx`: 图文位置序号
  * `$.data.content`: 已解析的正文对象，常用路径:
    * `$.data.content.title`: 标题
    * `$.data.content.nick_name` / `$.data.content.user_name`: 公众号名 / gh\_username
    * `$.data.content.author`: 作者
    * `$.data.content.desc`: 摘要
    * `$.data.content.create_time`: 发布时间（`"2025-03-05 12:22"` 文本）
    * `$.data.content.ori_create_time`: 发布时间戳（int 秒）
    * `$.data.content.cdn_url`: 封面图
    * `$.data.content.comment_id`: 评论 id（喂评论接口的内部 id）
    * `$.data.content.appmsgalbuminfo`: 所属合集（`album_id` / `title` / 上下篇链接）
    * `$.data.content.content_text`: 正文 HTML 转出的纯文字

#### `raw=true`（原始）:

* `data` 为完整 item（含 `raw=false` 的全部字段，外加模板 / 缓存 / 时间等元信息）:
  * `$.data.url` / `$.data.bizUin` / `$.data.itemIdx`: 同精简模式
  * `$.data.msgId`: 图文消息 id
  * `$.data.lastModifyTime`: 最后修改时间戳
  * `$.data.tmplVersion` / `$.data.tmplVersions[]`: H5 模板版本
  * `$.data.clientCacheTime`: 客户端缓存秒数
  * `$.data.content.*`: 与 `raw=false` 的 `content` 同结构（同样含 `content_text`）

# \[English]

### Purpose:

* Pass an article URL to get the article body / title / author / cover / publish time / album info.
* Regardless of `raw`, the nested `content` JSON string is always parsed into an object (structure normalized); `raw` only controls the projection scope of outer fields.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `comment_id` / `msgId` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* url: WeChat MP article URL (`https://mp.weixin.qq.com/s/…` or long URL with `__biz`). E.g. `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* raw: Optional, default True. True=raw response; False=simplified projection.

### Return:

* Article detail (body / title / author / cover / publish time / album info)

### Response structure & JSON Path:

#### `raw=false` (simplified projection):

* `data` has only 4 top-level fields; the article body is aggregated in `content`:
  * `$.data.url`: article URL
  * `$.data.bizUin`: official account bizUin (int)
  * `$.data.itemIdx`: article position index
  * `$.data.content`: parsed body object, common paths:
    * `$.data.content.title`: title
    * `$.data.content.nick_name` / `$.data.content.user_name`: account name / gh\_username
    * `$.data.content.author`: author
    * `$.data.content.desc`: digest
    * `$.data.content.create_time`: publish time (text like `"2025-03-05 12:22"`)
    * `$.data.content.ori_create_time`: publish timestamp (int seconds)
    * `$.data.content.cdn_url`: cover image
    * `$.data.content.comment_id`: comment id (internal id fed into comment endpoints)
    * `$.data.content.appmsgalbuminfo`: album info (`album_id` / `title` / prev & next links)
    * `$.data.content.content_text`: plain text extracted from the body HTML

#### `raw=true` (raw):

* `data` is the full item (all fields of `raw=false`, plus template / cache / time metadata):
  * `$.data.url` / `$.data.bizUin` / `$.data.itemIdx`: same as simplified mode
  * `$.data.msgId`: message id
  * `$.data.lastModifyTime`: last modified timestamp
  * `$.data.tmplVersion` / `$.data.tmplVersions[]`: H5 template versions
  * `$.data.clientCacheTime`: client cache seconds
  * `$.data.content.*`: same structure as `content` of `raw=false` (also includes `content_text`)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_detail",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_detail",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号文章互动数据/Get WeChat MP Article Stats

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_article_stats`

# \[中文]

### 用途:

* 传文章 URL，返回文章的互动指标（阅读量 / 点赞 / 在看 / 分享 / 收藏 / 评论数）。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* url: 公众号文章链接（`https://mp.weixin.qq.com/s/…`）。示例 `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* raw: 可选，默认 True。True=完整原始统计对象（含 `show_*` 显隐标志位）；False=仅精简计数。

### 返回:

* 文章互动数据

### 响应结构与 JSON Path:

#### `raw=false`（精简计数）:

* `data` 为 7 个计数字段:
  * `$.data.read_num`: 阅读量
  * `$.data.like_count`: 点赞数
  * `$.data.old_like_count`: 在看数（旧「在看」）
  * `$.data.share_count`: 分享数
  * `$.data.collect_count`: 收藏数
  * `$.data.comment_count`: 评论数
  * `$.data.star_num`: 星标 / 喜欢数

#### `raw=true`（原始）:

* `data` 为完整原始统计对象：含 `raw=false` 的全部计数（同名同义），外加显隐 / 状态标志位:
  * 计数: `$.data.read_num` / `$.data.like_count` / `$.data.old_like_count` / `$.data.share_count` / `$.data.collect_count` / `$.data.comment_count` / `$.data.star_num`
  * 显隐标志: `$.data.show_like` / `$.data.show_old_like` / `$.data.show_share` / `$.data.show_collect` / `$.data.show_read` / `$.data.show_star`（及对应 `*_gray` 置灰位）
  * 状态: `$.data.comment_enabled`（评论开关）/ `$.data.get_data_succ`（取数成功）/ `$.data.is_subscribed` / `$.data.verify_status` / `$.data.can_use_star`

# \[English]

### Purpose:

* Pass an article URL to get its interaction metrics (reads / likes / "wow" / shares / favorites / comments).
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* url: WeChat MP article URL (`https://mp.weixin.qq.com/s/…`). E.g. `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* raw: Optional, default True. True=full raw stats object (with `show_*` visibility flags); False=simplified counts only.

### Return:

* Article interaction stats

### Response structure & JSON Path:

#### `raw=false` (simplified counts):

* `data` contains 7 count fields:
  * `$.data.read_num`: read count
  * `$.data.like_count`: like count
  * `$.data.old_like_count`: "wow" count (old "Looking")
  * `$.data.share_count`: share count
  * `$.data.collect_count`: favorite count
  * `$.data.comment_count`: comment count
  * `$.data.star_num`: star / like count

#### `raw=true` (raw):

* `data` is the full raw stats object: all counts of `raw=false` (same names and meanings), plus visibility / status flags:
  * Counts: `$.data.read_num` / `$.data.like_count` / `$.data.old_like_count` / `$.data.share_count` / `$.data.collect_count` / `$.data.comment_count` / `$.data.star_num`
  * Visibility flags: `$.data.show_like` / `$.data.show_old_like` / `$.data.show_share` / `$.data.show_collect` / `$.data.show_read` / `$.data.show_star` (and corresponding `*_gray` flags)
  * Status: `$.data.comment_enabled` (comment switch) / `$.data.get_data_succ` (fetch success) / `$.data.is_subscribed` / `$.data.verify_status` / `$.data.can_use_star`

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_stats",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_stats",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号文章评论/Get WeChat MP Article Comments

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_article_comments`

# \[中文]

### 用途:

* 获取公众号文章评论（单页，`buffer` 游标翻页），返回文章的一页精选评论。
* **翻页**：首页 `buffer` 留空 → 取响应的 `buffer` → 下次请求传回 `buffer` 取下一页；`has_more` 为 false 即到末页。
* 逐条评论的二级回复请用 `fetch_comment_replies`（传评论的 `content_id`）。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `content_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* url: 公众号文章链接（`https://mp.weixin.qq.com/s/…`）。示例 `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* buffer: 可选，默认空。翻页游标，首页留空；翻页传上一页响应的 `buffer`。
* raw: 可选，默认 True。True=完整原始评论对象；False=精简评论视图。

### 返回:

* 单页评论列表及翻页游标

### 响应结构与 JSON Path:

#### `raw=false`（精简视图）:

* `data` 外层为本页汇总，`comments[]` 为精简评论:
  * `$.data.appmsgid`: 图文消息 id
  * `$.data.elected_total`: 精选评论总数
  * `$.data.total_count`: 评论总数
  * `$.data.buffer`: 下一页游标（翻页回传 `buffer`；末页为空串）
  * `$.data.has_more`: 是否还有下一页
  * `$.data.comment_id`: 文章评论标识（内部用）
  * `$.data.comments[N].content_id`: 评论 id（**喂 `fetch_comment_replies` 的 `content_id`**）
  * `$.data.comments[N].nick_name`: 评论者昵称
  * `$.data.comments[N].content`: 评论内容
  * `$.data.comments[N].like_num`: 点赞数
  * `$.data.comments[N].create_time`: 评论时间戳
  * `$.data.comments[N].ip_wording`: IP 归属地（`province_name` / `city_name` 等）
  * `$.data.comments[N].is_elected` / `is_top`: 是否精选 / 置顶
  * `$.data.comments[N].reply_total`: 二级回复总数
  * `$.data.comments[N].replies[]`: 二级回复预览（精简，见 `fetch_comment_replies`）

#### `raw=true`（原始）:

* `data` 外层同上（`appmsgid` / `elected_total` / `total_count` / `buffer` / `has_more` / `comment_id`），`comments[]` 为完整原始评论对象，字段更全（snake\_case）:
  * `$.data.comments[N].content_id`: 评论 id（同精简模式，仍是喂 `fetch_comment_replies` 的值）
  * `$.data.comments[N].content` / `nick_name` / `like_num` / `create_time` / `ip_wording` / `is_elected` / `is_top`: 与 `raw=false` 同名同义
  * 原始模式额外字段: `$.data.comments[N].id`（楼层序号）/ `openid` / `identity_type` / `logo_url`（头像）/ `like_status` / `is_from_me` / `$.data.comments[N].reply_new`（含 `reply_total_cnt` / `reply_list`，对应精简模式的 `reply_total` / `replies`）

# \[English]

### Purpose:

* Get WeChat MP article comments (single page, `buffer` cursor pagination); returns one page of featured comments.
* **Pagination**: leave `buffer` empty for the first page → take `buffer` from the response → pass it back in the next request; `has_more` false means the last page.
* For second-level replies of a specific comment, use `fetch_comment_replies` (pass the comment's `content_id`).
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `content_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* url: WeChat MP article URL (`https://mp.weixin.qq.com/s/…`). E.g. `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`
* buffer: Optional, default empty. Pagination cursor; leave empty for the first page, pass `buffer` from the previous response for the next page.
* raw: Optional, default True. True=full raw comment objects; False=simplified comment view.

### Return:

* One page of comments with pagination cursor

### Response structure & JSON Path:

#### `raw=false` (simplified view):

* `data` outer level is the page summary; `comments[]` are simplified comments:
  * `$.data.appmsgid`: message id
  * `$.data.elected_total`: total featured comments
  * `$.data.total_count`: total comments
  * `$.data.buffer`: next-page cursor (pass back as `buffer`; empty string at the last page)
  * `$.data.has_more`: whether there is a next page
  * `$.data.comment_id`: article comment identifier (internal)
  * `$.data.comments[N].content_id`: comment id (**feed into `content_id` of `fetch_comment_replies`**)
  * `$.data.comments[N].nick_name`: commenter nickname
  * `$.data.comments[N].content`: comment content
  * `$.data.comments[N].like_num`: like count
  * `$.data.comments[N].create_time`: comment timestamp
  * `$.data.comments[N].ip_wording`: IP region (`province_name` / `city_name` etc.)
  * `$.data.comments[N].is_elected` / `is_top`: featured / pinned flags
  * `$.data.comments[N].reply_total`: total second-level replies
  * `$.data.comments[N].replies[]`: reply preview (simplified, see `fetch_comment_replies`)

#### `raw=true` (raw):

* `data` outer level same as above (`appmsgid` / `elected_total` / `total_count` / `buffer` / `has_more` / `comment_id`); `comments[]` are full raw comment objects with more fields (snake\_case):
  * `$.data.comments[N].content_id`: comment id (same as simplified mode, still the value fed into `fetch_comment_replies`)
  * `$.data.comments[N].content` / `nick_name` / `like_num` / `create_time` / `ip_wording` / `is_elected` / `is_top`: same names and meanings as `raw=false`
  * Raw-only extra fields: `$.data.comments[N].id` (floor number) / `openid` / `identity_type` / `logo_url` (avatar) / `like_status` / `is_from_me` / `$.data.comments[N].reply_new` (with `reply_total_cnt` / `reply_list`, corresponding to `reply_total` / `replies` of the simplified mode)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_comments",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_comments",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号评论的二级回复/Get WeChat MP Comment Replies

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_comment_replies`

# \[中文]

### 用途:

* 返回某条一级评论下的二级回复。
* 链路：先调 `fetch_article_comments` 取到每条评论的 `content_id`，再把它喂给本接口。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `content_id` / `reply_id` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* url: 公众号文章链接（`https://mp.weixin.qq.com/s/…`）。示例 `http://mp.weixin.qq.com/s?__biz=Mzk3NTA0MzM5NA==&mid=2247483745&idx=1&sn=3f34e768cf457a501038991ed30be1f4#rd`
* content\_id: 可选（纯数字）。目标一级评论的 `content_id`，取自 `fetch_article_comments` 响应的 `$.data.comments[N].content_id`；**不传则自动取第一条有回复的评论**。示例 `12109128638545265979`
* offset: 可选，默认 0（>=0）。回复翻页偏移；首页 0，`has_more=true` 时传上次返回的 `next_offset` 取下一页。`all_pages=true` 时忽略本参数。
* all\_pages: 可选，默认 False。为 True 时忽略 `offset`，一次取**全部**回复（响应不含 `offset` / `next_offset` / `has_more` 翻页字段）。
* raw: 可选，默认 True。True=完整原始回复对象；False=精简回复。

### 返回:

* 二级回复列表及翻页信息

> 注意：本接口 `raw=true` 与 `raw=false` 的**外层结构一致**，差异仅在 `replies[]` 每个元素的字段粒度（精简视图 vs 完整原始对象）。

### 响应结构与 JSON Path:

#### `raw=false`（精简回复）:

* `$.data.content_id`: 目标评论 id（回显）
* `$.data.parent_nick`: 父评论（被回复者）昵称
* `$.data.reply_total`: 二级回复总数
* `$.data.count`: 本次返回的回复条数
* `$.data.replies[N].reply_id`: 回复 id
* `$.data.replies[N].nick_name`: 回复者昵称
* `$.data.replies[N].content`: 回复内容
* `$.data.replies[N].create_time`: 回复时间戳
* `$.data.replies[N].ip_wording`: IP 归属地
* `$.data.replies[N].identity_name`: 身份标识
* `$.data.replies[N].from_ai` / `reply_is_elected`: 是否 AI 回复 / 是否精选
* 仅单页模式（`all_pages=false`）含翻页: `$.data.offset` / `$.data.next_offset` / `$.data.has_more`

#### `raw=true`（原始）:

* 外层 `content_id` / `parent_nick` / `reply_total` / `count`（及单页模式的 `offset` / `next_offset` / `has_more`）与 `raw=false` **完全一致**；差异仅在 `replies[]` 元素为完整原始回复对象（含 `raw=false` 投影掉的字段）。常用路径仍为 `$.data.replies[N].content` / `$.data.replies[N].reply_id` / `$.data.replies[N].nick_name`。

# \[English]

### Purpose:

* Get the second-level replies under a first-level comment.
* Chain: first call `fetch_article_comments` to get each comment's `content_id`, then feed it into this endpoint.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `content_id` / `reply_id` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* url: WeChat MP article URL (`https://mp.weixin.qq.com/s/…`). E.g. `http://mp.weixin.qq.com/s?__biz=Mzk3NTA0MzM5NA==&mid=2247483745&idx=1&sn=3f34e768cf457a501038991ed30be1f4#rd`
* content\_id: Optional (numeric). `content_id` of the target first-level comment, from `$.data.comments[N].content_id` of the `fetch_article_comments` response; **defaults to the first comment that has replies when omitted**. E.g. `12109128638545265979`
* offset: Optional, default 0 (>=0). Reply pagination offset; 0 for the first page, pass `next_offset` from the previous response when `has_more=true`. Ignored when `all_pages=true`.
* all\_pages: Optional, default False. When True, ignores `offset` and fetches **all** replies at once (the response omits the `offset` / `next_offset` / `has_more` pagination fields).
* raw: Optional, default True. True=full raw reply objects; False=simplified replies.

### Return:

* Second-level reply list with pagination info

> Note: the **outer structure is identical** for `raw=true` and `raw=false`; the difference is only in the field granularity of each `replies[]` element (simplified view vs full raw object).

### Response structure & JSON Path:

#### `raw=false` (simplified replies):

* `$.data.content_id`: target comment id (echo)
* `$.data.parent_nick`: nickname of the parent comment (the one replied to)
* `$.data.reply_total`: total second-level replies
* `$.data.count`: number of replies returned this time
* `$.data.replies[N].reply_id`: reply id
* `$.data.replies[N].nick_name`: replier nickname
* `$.data.replies[N].content`: reply content
* `$.data.replies[N].create_time`: reply timestamp
* `$.data.replies[N].ip_wording`: IP region
* `$.data.replies[N].identity_name`: identity label
* `$.data.replies[N].from_ai` / `reply_is_elected`: AI reply / featured flags
* Pagination fields only in single-page mode (`all_pages=false`): `$.data.offset` / `$.data.next_offset` / `$.data.has_more`

#### `raw=true` (raw):

* Outer `content_id` / `parent_nick` / `reply_total` / `count` (and `offset` / `next_offset` / `has_more` in single-page mode) are **identical** to `raw=false`; the only difference is that `replies[]` elements are full raw reply objects (including fields projected away in `raw=false`). Common paths remain `$.data.replies[N].content` / `$.data.replies[N].reply_id` / `$.data.replies[N].nick_name`.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_comment_replies",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_comment_replies",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号关联文章/Get WeChat MP Related Articles

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_related_articles`

# \[中文]

### 用途:

* 传文章 URL，返回文章底部「关联 / 相关文章」。未开启该功能的文章返回空列表。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* url: 公众号文章链接（长 / 短链均可）。示例 `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`（该文未开启关联文章，返回空）
* raw: 可选，默认 True。True=完整原始响应；False=精简投影。

### 返回:

* 关联文章列表

### 响应结构与 JSON Path:

#### `raw=false`（精简投影）:

* `data` 为拍平后的三字段:
  * `$.data.ret`: 返回码（0 正常）
  * `$.data.count`: 关联文章条数
  * `$.data.articles[]`: 关联文章列表（命中任一来源列表的合并；空文章为 `[]`）

#### `raw=true`（原始）:

* `data` 为完整原始响应:
  * `$.data.article_size`: 关联文章数量（对应精简模式 `count`）
  * `$.data.list[]`: 关联文章原始列表（对应精简模式 `articles`）
  * `$.data.base_resp.ret`: 返回码（对应精简模式 `ret`）；`base_resp.exportkey_token`: 导出 token
  * `$.data.empty_scene`: 空结果场景码；`$.data.show_rec_reason`: 是否展示推荐理由；`$.data.report_info`: 上报信息（JSON 串）

# \[English]

### Purpose:

* Pass an article URL to get the "related articles" at the bottom of the article. Articles without this feature return an empty list.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* url: WeChat MP article URL (long or short form). E.g. `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw` (this article has related articles disabled, returns empty)
* raw: Optional, default True. True=full raw response; False=simplified projection.

### Return:

* Related article list

### Response structure & JSON Path:

#### `raw=false` (simplified projection):

* `data` is flattened into three fields:
  * `$.data.ret`: return code (0 = OK)
  * `$.data.count`: number of related articles
  * `$.data.articles[]`: related article list (merged from whichever source list hits; `[]` when empty)

#### `raw=true` (raw):

* `data` is the full raw response:
  * `$.data.article_size`: number of related articles (corresponds to `count` in simplified mode)
  * `$.data.list[]`: raw related article list (corresponds to `articles` in simplified mode)
  * `$.data.base_resp.ret`: return code (corresponds to `ret` in simplified mode); `base_resp.exportkey_token`: export token
  * `$.data.empty_scene`: empty-result scene code; `$.data.show_rec_reason`: whether to show recommendation reason; `$.data.report_info`: report info (JSON string)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_related_articles",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_related_articles",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号文章广告/Get WeChat MP Article Ads

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_article_ad`

# \[中文]

### 用途:

* 传文章 URL，返回文章内嵌的广告位信息。该接口响应相对较慢，请耐心等待；未投放广告的文章返回空。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* url: 公众号文章链接。示例 `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw`（该文无广告，返回空）
* raw: 可选，默认 True。True=完整原始响应；False=拍平后的广告列表。

### 返回:

* 文章广告位信息

### 响应结构与 JSON Path:

#### `raw=false`（精简投影）:

* `data` 为拍平后的广告列表:
  * `$.data.count`: 广告条数（合并 `advertisement_info` 与 `ad_slot_data`）
  * `$.data.ads[]`: 广告项列表（无广告时为 `[]`）

#### `raw=true`（原始）:

* `data` 按抓到的响应聚合:
  * `$.data.pages`: 响应页数
  * `$.data.results[]`: 每页完整原始响应（广告原始字段在各页的 `advertisement_info` / `ad_slot_data` 内，即精简模式 `ads` 的来源）

# \[English]

### Purpose:

* Pass an article URL to get the embedded ad slot info of the article. This endpoint responds relatively slowly, please be patient; articles without ads return empty.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* url: WeChat MP article URL. E.g. `https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw` (this article has no ads, returns empty)
* raw: Optional, default True. True=full raw response; False=flattened ad list.

### Return:

* Article ad slot info

### Response structure & JSON Path:

#### `raw=false` (simplified projection):

* `data` is the flattened ad list:
  * `$.data.count`: number of ads (merged from `advertisement_info` and `ad_slot_data`)
  * `$.data.ads[]`: ad item list (`[]` when no ads)

#### `raw=true` (raw):

* `data` is aggregated by the responses captured:
  * `$.data.pages`: number of response pages
  * `$.data.results[]`: full raw response per page (raw ad fields are inside `advertisement_info` / `ad_slot_data` of each page — the source of `ads` in simplified mode)

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_ad",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_article_ad",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号资料页/Get WeChat MP Account Profile

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_account_profile`

# \[中文]

### 用途:

* 传 `gh_username`，返回公众号资料页：名称 / 头像 / 简介 / 认证主体类型等。
* 部分账号（如示例号）字段稀疏，`nick_name` / `signature` / `head_url` 可能为 `null`。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* username: 公众号 `gh_username`（`gh_…`）。来源：文章详情 `content.user_name`、或微信搜索 V2 `fetch_search`（business\_type=account）结果的 `jumpInfo.userName`。示例 `gh_363b924965e9`
* raw: 可选，默认 True。True=原始；False=精简解析。

### 返回:

* 公众号资料页信息

### 响应结构与 JSON Path:

#### `raw=false`（精简解析，snake\_case）:

* 公众号 username（`gh_…`）: `$.data.user_name`
* 昵称（可能为 null）: `$.data.nick_name`
* 用户角色: `$.data.user_role`
* 服务类型（订阅号 / 服务号代码）: `$.data.service_type`
* 签名 / 简介（可能为 null）: `$.data.signature`
* 头像（可能为 null）: `$.data.head_url`
* 封禁类型（0=正常）: `$.data.ban_type`

#### `raw=true`（原始，本接口默认）:

* `data` 为完整原始响应（几十个顶层字段），精简版字段对应其中嵌套位置:
  * 基础信息块: `$.data.baseInfo`（昵称 / 头像 / 简介等原始来源）
  * 账号信息: `$.data.accountInfo`（含 `userName` 等）
  * 统计信息: `$.data.statInfo`
  * 关联视频号: `$.data.videoFinderInfo`
  * 服务信息（自定义菜单原始来源）: `$.data.serviceInfo`
  * 文章 Tab / 消息列表: `$.data.articleTab` / `$.data.msgList`
  * IP 属地: `$.data.ipwording`
  * 其余: `liveInfo` / `nameCard` / `gender` / `setting` / `funcFlag` 等

# \[English]

### Purpose:

* Pass a `gh_username` to get the official account profile: name / avatar / description / verification entity type, etc.
* Some accounts (like the example) have sparse fields; `nick_name` / `signature` / `head_url` may be `null`.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* username: Official account `gh_username` (`gh_…`). Sources: `content.user_name` from article detail, or `jumpInfo.userName` from WeChat Search V2 `fetch_search` (business\_type=account) results. E.g. `gh_363b924965e9`
* raw: Optional, default True. True=raw; False=simplified parsing.

### Return:

* Official account profile info

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* Account username (`gh_…`): `$.data.user_name`
* Nickname (may be null): `$.data.nick_name`
* User role: `$.data.user_role`
* Service type (subscription / service account code): `$.data.service_type`
* Signature / description (may be null): `$.data.signature`
* Avatar (may be null): `$.data.head_url`
* Ban type (0=normal): `$.data.ban_type`

#### `raw=true` (raw, default for this endpoint):

* `data` is the full raw response (dozens of top-level fields); simplified fields map to nested locations:
  * Base info block: `$.data.baseInfo` (raw source of nickname / avatar / description)
  * Account info: `$.data.accountInfo` (with `userName` etc.)
  * Stats info: `$.data.statInfo`
  * Linked Channels account: `$.data.videoFinderInfo`
  * Service info (raw source of custom menu): `$.data.serviceInfo`
  * Article tab / message list: `$.data.articleTab` / `$.data.msgList`
  * IP region: `$.data.ipwording`
  * Others: `liveInfo` / `nameCard` / `gender` / `setting` / `funcFlag` etc.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_profile",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_profile",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号文章列表/Get WeChat MP Account Articles

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_account_articles`

# \[中文]

### 用途:

* 传 `gh_username`，返回公众号历史发文（**文章** tab）的**单页**列表。
* **手动翻页**：首页 `offset` 留空 → 从响应取 `next_offset`（base64 游标）→ 下次请求放进 **`offset`** 取下一页；`is_end` 为真即末页。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* username: 公众号 `gh_username`（`gh_…`）。示例 `gh_363b924965e9`
* page\_size: 可选，默认 20，范围 **10-20**。每页文章数。
* offset: 可选，翻页游标（base64），**首页留空**；翻页时传上一页响应的 `next_offset`。示例 `CAMQChiS5KfRBiAKOJLkp9EGQABIAVgAYABwAQ==`
* item\_show\_type: 可选，内容栏目（对应公众号主页的「文章 / 视频 / 音频」分栏）。留空 / `0`=文章（默认）、`5`=视频、`7`=音频、`8`=贴图。默认不传=文章，行为不变。
* raw: 可选，默认 True。True=原始；False=精简解析。

### 返回:

* 公众号文章列表（单页）及翻页游标

> 提示：`offset` 是 base64 游标（含 `+/=`），统一走 POST body。本接口**只取单页、不自动翻页**。

### 响应结构与 JSON Path:

#### `raw=false`（精简解析，snake\_case）:

* 公众号 username: `$.data.biz_username`
* 是否末页（0/1）: `$.data.is_end`
* 本页返回文章数: `$.data.count`
* 下一页游标（翻页回传 `offset`；末页为 null）: `$.data.next_offset`
* 文章列表: `$.data.articles[]`
* 单篇（N 为下标）:
  * 文章 appmsgid: `$.data.articles[N].app_msg_id`
  * 标题: `$.data.articles[N].title`
  * 摘要: `$.data.articles[N].digest`
  * 链接: `$.data.articles[N].url`
  * 封面: `$.data.articles[N].cover`（多比例 `$.data.articles[N].covers`）
  * 发布 / 更新时间戳: `$.data.articles[N].create_time` / `.update_time`
  * 群发内位置 / 类型: `$.data.articles[N].idx` / `.msg_type` / `.item_show_type`
  * 图文数 / 付费标志: `$.data.articles[N].pic_count` / `.is_paid` / `.is_pay_subscribe`

#### `raw=true`（原始，本接口默认）:

* `data` 顶层字段与精简版一致（`biz_username` / `is_end` / `count` / `next_offset`），但 `articles[]` 为完整原始群发条目（camelCase 嵌套）:
  * 单条: `$.data.articles[N].appMsg`（含 `baseInfo` / `detailInfo`）、`$.data.articles[N].baseInfo`（`msgId` / `msgType` / `dateTime` / `status`）
  * 图文正文在 `$.data.articles[N].appMsg.detailInfo`（一次群发可含多篇：头条 / 次条）
  * 翻页同样用顶层 `next_offset` 回传 `offset`。做列表展示建议直接用 `raw=false`，路径更干净。

# \[English]

### Purpose:

* Pass a `gh_username` to get a **single page** of the account's historical posts (**article** tab).
* **Manual paging**: leave `offset` empty for the first page → take `next_offset` (base64 cursor) from the response → pass it as **`offset`** in the next request; `is_end` truthy means the last page.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* username: Official account `gh_username` (`gh_…`). E.g. `gh_363b924965e9`
* page\_size: Optional, default 20, range **10-20**. Articles per page.
* offset: Optional pagination cursor (base64), **leave empty for the first page**; for the next page pass `next_offset` from the previous response. E.g. `CAMQChiS5KfRBiAKOJLkp9EGQABIAVgAYABwAQ==`
* item\_show\_type: Optional content tab (matches the "Articles / Videos / Audios" tabs on the account homepage). Empty / `0`=articles (default), `5`=videos, `7`=audios, `8`=image-text posts. Omitting it = articles, behavior unchanged.
* raw: Optional, default True. True=raw; False=simplified parsing.

### Return:

* Single page of articles with pagination cursor

> Tip: `offset` is a base64 cursor (contains `+/=`), hence POST body. This endpoint **fetches a single page only and does not auto-paginate**.

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* Account username: `$.data.biz_username`
* Is last page (0/1): `$.data.is_end`
* Articles returned on this page: `$.data.count`
* Next-page cursor (pass back as `offset`; null at the last page): `$.data.next_offset`
* Article list: `$.data.articles[]`
* Single article (N is the index):
  * Article appmsgid: `$.data.articles[N].app_msg_id`
  * Title: `$.data.articles[N].title`
  * Digest: `$.data.articles[N].digest`
  * URL: `$.data.articles[N].url`
  * Cover: `$.data.articles[N].cover` (multi-ratio `$.data.articles[N].covers`)
  * Publish / update timestamps: `$.data.articles[N].create_time` / `.update_time`
  * Position / type within the batch: `$.data.articles[N].idx` / `.msg_type` / `.item_show_type`
  * Image count / paid flags: `$.data.articles[N].pic_count` / `.is_paid` / `.is_pay_subscribe`

#### `raw=true` (raw, default for this endpoint):

* `data` top-level fields match the simplified version (`biz_username` / `is_end` / `count` / `next_offset`), but `articles[]` are full raw batch entries (nested camelCase):
  * Per entry: `$.data.articles[N].appMsg` (with `baseInfo` / `detailInfo`), `$.data.articles[N].baseInfo` (`msgId` / `msgType` / `dateTime` / `status`)
  * Article bodies are in `$.data.articles[N].appMsg.detailInfo` (one batch may contain multiple articles: headline / secondary)
  * Pagination also uses top-level `next_offset` passed back as `offset`. For list display, prefer `raw=false` for cleaner paths.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_articles",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_articles",
  "input": {}
}
)
print(res.json())
```

***

### 获取公众号服务/自定义菜单/Get WeChat MP Account Services & Custom Menu

`0.10 Credits / 次`

`/api/v1/wechat_mp/v2/fetch_account_services`

# \[中文]

### 用途:

* 传 `gh_username`，返回公众号底部的自定义菜单 / 服务入口。未配置自定义菜单的账号返回空菜单。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。

### 参数:

* username: 公众号 `gh_username`（`gh_…`）。示例 `gh_363b924965e9`
* raw: 可选，默认 True。True=原始；False=精简解析。

### 返回:

* 公众号自定义菜单 / 服务入口

### 响应结构与 JSON Path:

#### `raw=false`（精简解析，snake\_case）:

* 公众号 username: `$.data.biz_username`
* 菜单项列表（无菜单时为 `[]`）: `$.data.menu[]` —— 每项为菜单按钮（名称 / 类型 / 子菜单 / 跳转），无自定义菜单的账号该数组为空。

#### `raw=true`（原始，本接口默认）:

* `data` 为完整原始菜单结构。未配置菜单的账号返回空对象 `{}`。
* 精简版的 `menu[]` 即由此原始结构提取而来。

# \[English]

### Purpose:

* Pass a `gh_username` to get the custom menu / service entries at the bottom of the official account. Accounts without a custom menu return an empty menu.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.

### Parameters:

* username: Official account `gh_username` (`gh_…`). E.g. `gh_363b924965e9`
* raw: Optional, default True. True=raw; False=simplified parsing.

### Return:

* Custom menu / service entries of the official account

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* Account username: `$.data.biz_username`
* Menu item list (`[]` when no menu): `$.data.menu[]` — each item is a menu button (name / type / sub-menu / jump); the array is empty for accounts without a custom menu.

#### `raw=true` (raw, default for this endpoint):

* `data` is the full raw menu structure. Accounts without a configured menu return an empty object `{}`.
* The simplified `menu[]` is extracted from this raw structure.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_services",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_mp/v2/fetch_account_services",
  "input": {}
}
)
print(res.json())
```

***

### 微信综合搜索（搜一搜）/WeChat Universal Search

`0.10 Credits / 次`

`/api/v1/wechat_search/v2/fetch_search`

# \[中文]

### 用途:

* 微信「搜一搜」综合搜索，垂类由 `business_type` **字符串键**切换，传关键词即可。
* 可搜公众号 / 文章 / 视频号视频 / 直播 / 朋友圈 / 新闻 / 读书 / 图片 / 百科 / 微信指数等垂类。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `docID` / `feedNonceId` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* keyword: 搜索关键词（去空白后 1-100 字）。示例 `人民日报`
* business\_type: 可选，默认 `all`。垂类字符串键，仅支持 —— 综合 `all` / 公众号，视频号，服务号 `account` / 文章 `article` / 视频 `video` / 直播 `live_stream` / 朋友圈 `moments` / 新闻 `news` / 读书 `book` / 听书 `listen` / 图片 `image` / 百科 `encyclopedia` / 微信指数 `weixin_index`，传其他值将直接报错（422）。
* sort: 可选，默认 `default`。排序（结果页「排序」下拉，综合与各垂类通用）—— 不限(相关性) `default`/0 / 最新(发布时间降序) `latest`/1 / 最热(点赞降序) `hot`/2，字符串键或整数均可，非法值报错（400）。
* publish\_time: 可选，默认 `all`。发布时间（结果页「时间」下拉，通用）—— 不限 `all`/0 / 最近一天 `day`/1 / 最近七天 `week`/2 / 最近半年 `half_year`/3，字符串键或整数均可，非法值报错（400）。
* offset: 可选，默认 0（>=0）。首页传 `0`；**翻页请用 `cursor`，只传 offset 无效**（每页都回到第一页）。
* cursor: 可选。翻页游标。首页留空；翻页时把上一页响应里返回的 `cursor` 原样传回（须同时重复上一页的 `sort` / `publish_time`），配合 `continue_flag` 判断是否还有下一页。
* raw: 可选，默认 True。True=原始搜索响应；False=精简解析。

💡 视频垂类专属的「时长」筛选见 `/fetch_search_videos`（`business_type=video` + `duration`）。

### 返回:

* 搜索结果列表（结构随垂类略有差异）

### 典型链路:

* 💡 **拿视频号详情（媒体下载地址 / decode\_key）**：搜索（`video` / `all`）的视频结果项**不直接含**媒体，只给 `exportId`（+ `jumpInfo.extInfo.feedNonceId`）。要下载 / 解密：取 `exportId` → 走视频号 V2 接口 `/api/v1/wechat_channels/v2/fetch_video_detail`（传 `export_id`）拿 `media`（`url` / `url_token` / `decode_key`）和明文 `username`。完整链路与解密说明见该接口文档。
* 公众号结果项的 `jumpInfo.userName`（`gh_…`）可喂给公众号 V2 接口 `/api/v1/wechat_mp/v2/fetch_account_profile` / `fetch_account_articles`。

### 响应结构与 JSON Path:

#### `raw=false`（精简解析，snake\_case）:

* 关键词回填: `$.data.keyword`
* 实际生效的垂类代码（如公众号=33554499）: `$.data.business_type`
* 结果总数（部分垂类为 null）: `$.data.total`
* 是否还有下一页: `$.data.continue_flag`
* 翻页游标（原样回传接口的 `cursor` 参数取下一页）: `$.data.cursor`
* 服务端 offset（仅供参考，单独传回**无法**翻页）: `$.data.offset`
* 本页结果数: `$.data.count`
* 拍平的结果项列表（已把各 box / subBox 的 items 合并）: `$.data.items[]`
* 单项（N 为下标，字段随垂类不同；以下为 `account` 公众号示例）:
  * 标题（含 `<em>` 高亮）: `$.data.items[N].title`
  * 描述: `$.data.items[N].desc`
  * 文档 id: `$.data.items[N].docID`
  * 类型名（如「公众号」）: `$.data.items[N].accTypeName`
  * 跳转信息: `$.data.items[N].jumpInfo`（`.userName` = `gh_…`、`.nickName`、`.signature`）
  * 视频垂类项另含 `exportId`（+ `jumpInfo.extInfo.feedNonceId`）→ 见上「典型链路」

#### `raw=true`（原始，本接口默认）:

* `data` 顶层: `keyword` / `business_type` / `results`（**不**做 items 拍平）
* 完整结果集: `$.data.results`
* 结果盒子数组: `$.data.results.data[]`，每个 box 的结果在 `$.data.results.data[M].items[]` 与 `$.data.results.data[M].subBoxes[K].items[]` —— 即 `raw=false` 的 `items[]` 是把这些拍平后的结果。
* 是否还有下一页: `$.data.continue_flag`（`raw=true` / `raw=false` 均在顶层）
* 翻页游标: `$.data.cursor` —— 原样回传接口的 `cursor` 参数取下一页；`$.data.offset` 仅为服务端 offset，单独传回**无法**翻页
* box 内总数: `$.data.results.data[M].totalCount`（对应 `raw=false` 的 `total`）
* 做结果遍历建议直接用 `raw=false`（items 已拍平），路径更干净。

# \[English]

### Purpose:

* WeChat "Search" (搜一搜) universal search; the vertical is switched by the `business_type` **string key** — just pass a keyword.
* Searches official accounts / articles / Channels videos / live streams / Moments / news / books / images / encyclopedia / WeChat Index, etc.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `docID` / `feedNonceId` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* keyword: Search keyword (1-100 chars after trimming). E.g. `人民日报`
* business\_type: Optional, default `all`. Vertical string key, only the following are supported — `all` / `account` / `article` / `video` / `live_stream` / `moments` / `news` / `book` / `listen` / `image` / `encyclopedia` / `weixin_index`; any other value is rejected (422).
* sort: Optional, default `default`. Sort (result page "sort" dropdown, common to all verticals) — `default`/0 (relevance) / `latest`/1 (newest) / `hot`/2 (most liked); string key or integer, invalid values rejected (400).
* publish\_time: Optional, default `all`. Publish time (result page "time" dropdown, common) — `all`/0 / `day`/1 / `week`/2 / `half_year`/3; string key or integer, invalid values rejected (400).
* offset: Optional, default 0 (>=0). Pass `0` for the first page; **use `cursor` to paginate — offset alone does not work** (it returns the first page every time).
* cursor: Optional. Pagination cursor. Leave empty for the first page; for the next page pass back the `cursor` returned in the previous response (repeat the same `sort` / `publish_time`), and use `continue_flag` to check whether there are more pages.
* raw: Optional, default True. True=raw search response; False=simplified parsing.

💡 The "duration" filter specific to the video vertical is available at `/fetch_search_videos` (`business_type=video` + `duration`).

### Return:

* Search result list (structure varies slightly by vertical)

### Typical chains:

* 💡 **To get Channels video detail (media download address / decode\_key)**: video result items from search (`video` / `all`) do **not** contain media directly — only `exportId` (+ `jumpInfo.extInfo.feedNonceId`). To download / decrypt: take `exportId` → call the Channels V2 endpoint `/api/v1/wechat_channels/v2/fetch_video_detail` (pass `export_id`) to get `media` (`url` / `url_token` / `decode_key`) and the plain `username`. See that endpoint's docs for the full chain and decryption notes.
* The `jumpInfo.userName` (`gh_…`) of official account result items can be fed into the MP V2 endpoints `/api/v1/wechat_mp/v2/fetch_account_profile` / `fetch_account_articles`.

### Response structure & JSON Path:

#### `raw=false` (simplified, snake\_case):

* Keyword echo: `$.data.keyword`
* Effective vertical code (e.g. account=33554499): `$.data.business_type`
* Total results (null for some verticals): `$.data.total`
* Has next page: `$.data.continue_flag`
* Pagination cursor (pass back as the `cursor` parameter for the next page): `$.data.cursor`
* Server-side offset (informational only; passing it back alone does **not** paginate): `$.data.offset`
* Results on this page: `$.data.count`
* Flattened result item list (items of all boxes / subBoxes merged): `$.data.items[]`
* Single item (N is the index; fields vary by vertical; below is an `account` example):
  * Title (with `<em>` highlight): `$.data.items[N].title`
  * Description: `$.data.items[N].desc`
  * Document id: `$.data.items[N].docID`
  * Type name (e.g. "公众号"): `$.data.items[N].accTypeName`
  * Jump info: `$.data.items[N].jumpInfo` (`.userName` = `gh_…`, `.nickName`, `.signature`)
  * Video vertical items also carry `exportId` (+ `jumpInfo.extInfo.feedNonceId`) → see "Typical chains" above

#### `raw=true` (raw, default for this endpoint):

* `data` top level: `keyword` / `business_type` / `results` (items are **not** flattened)
* Full result set: `$.data.results`
* Result box array: `$.data.results.data[]`; each box's results are in `$.data.results.data[M].items[]` and `$.data.results.data[M].subBoxes[K].items[]` — the `items[]` of `raw=false` is the flattened merge of these.
* Has next page: `$.data.continue_flag` (top level for both `raw=true` / `raw=false`)
* Pagination cursor: `$.data.cursor` — pass it back as the `cursor` parameter for the next page; `$.data.offset` is only the server-side offset and passing it back alone does **not** paginate
* Per-box total: `$.data.results.data[M].totalCount` (corresponds to `total` of `raw=false`)
* For result iteration, prefer `raw=false` (items already flattened) for cleaner paths.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_search/v2/fetch_search",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_search/v2/fetch_search",
  "input": {}
}
)
print(res.json())
```

***

### 搜视频号视频（时长/排序/时间筛选）/WeChat Channels Video Search

`0.10 Credits / 次`

`/api/v1/wechat_search/v2/fetch_search_videos`

# \[中文]

### 用途:

* 专搜视频号视频（`video` 垂类），并支持搜索结果页里的「时长」「不限/最新/最热」排序与「时间」下拉。
* 等价于综合搜索 `/fetch_search`（`business_type=video`）再叠加筛选，筛选项均实测有效。
* 价格：0.01\$/次
* ⏱️ 由于微信服务器原因，本接口响应较慢，请将客户端请求超时（timeout）设置为 30 秒；timeout 设置过小会造成已扣费但收不到响应的情况。
* ⚠️ 大整数 ID 精度：响应中的 `docID` / `feedNonceId` 等为 64 位大整数，超出 JavaScript 安全整数范围（2^53-1）。请始终以**字符串**方式接收 / 传递这类 ID（解析 JSON 用 json-bigint 或按文本取值），勿让其经过 JS `Number`。Swagger UI 文档页对超大整数会末位舍入显示，属正常现象，不影响接口实际返回的数据。

### 参数:

* keyword: 搜索关键词（去空白后 1-100 字）。示例 `美食`
* duration: 可选，默认 `all`。时长档（video 垂类专属）—— 不限 `all`/0 / 短(\<5min) `short`/1 / 中(5-10min) `medium`/2 / 长(20min+) `long`/3，字符串键或整数均可，非法值报错（400）。
* sort: 可选，默认 `default`。排序 —— 不限(相关性) `default`/0 / 最新(发布时间降序) `latest`/1 / 最热(点赞降序) `hot`/2，字符串键或整数均可，非法值报错（400）。
* publish\_time: 可选，默认 `all`。发布时间 —— 不限 `all`/0 / 最近一天 `day`/1 / 最近七天 `week`/2 / 最近半年 `half_year`/3，字符串键或整数均可，非法值报错（400）。
* offset: 可选，默认 0（>=0）。首页传 `0`；翻页请用 `cursor`（只传 offset 无效）。
* cursor: 可选。翻页游标，用法同综合搜索 `/fetch_search`。首页留空；翻页时把上一页响应返回的 `cursor` 原样传回（须同时重复上一页的 `duration` / `sort` / `publish_time`）。
* raw: 可选，默认 True。True=原始搜索响应；False=精简解析。

### 返回:

* 视频号视频搜索结果列表（结构同综合搜索的 `video` 垂类）

### 典型链路:

* 💡 排序下拉里的「账号」选项**不是排序**，而是切到公众号垂类 —— 用综合搜索 `/fetch_search`（`business_type=account`）。
* 💡 **拿视频号详情（媒体下载地址 / decode\_key）**：视频结果项**不直接含**媒体，只给 `exportId`（+ `jumpInfo.extInfo.feedNonceId`）。要下载 / 解密：取 `exportId` → 走视频号 V2 接口 `/api/v1/wechat_channels/v2/fetch_video_detail`（传 `export_id`）拿 `media`（`url` / `url_token` / `decode_key`）和明文 `username`。结果字段与响应结构说明同 `/fetch_search`。

# \[English]

### Purpose:

* Search WeChat Channels videos specifically (`video` vertical), with the result page's "duration" filter, "relevance/newest/most-liked" sort, and "time" dropdown.
* Equivalent to universal search `/fetch_search` (`business_type=video`) plus filters; all filters are verified to work.
* Price: \$0.01 per request
* ⏱️ Due to WeChat server latency, this endpoint responds slowly; please set your client request timeout to 30 seconds — a timeout that is too small may result in being billed without receiving the response.
* ⚠️ Large-integer ID precision: IDs such as `docID` / `feedNonceId` in the response are 64-bit big integers beyond JavaScript's safe-integer range (2^53-1). Always receive / pass such IDs as **strings** (parse JSON with json-bigint or read them as text), never through JS `Number`. Swagger UI rounds the trailing digits of huge integers in its docs view — this is expected and does not affect the actual data returned by the API.

### Parameters:

* keyword: Search keyword (1-100 chars after trimming). E.g. `美食`
* duration: Optional, default `all`. Duration tier (Channels video only) — `all`/0 / `short`/1 (\<5min) / `medium`/2 (5-10min) / `long`/3 (20min+); string key or integer, invalid values rejected (400).
* sort: Optional, default `default`. Sort — `default`/0 (relevance) / `latest`/1 (newest) / `hot`/2 (most liked); string key or integer, invalid values rejected (400).
* publish\_time: Optional, default `all`. Publish time — `all`/0 / `day`/1 / `week`/2 / `half_year`/3; string key or integer, invalid values rejected (400).
* offset: Optional, default 0 (>=0). Pass `0` for the first page; use `cursor` to paginate (offset alone does not work).
* cursor: Optional. Pagination cursor, same usage as universal search `/fetch_search`. Leave empty for the first page; for the next page pass back the `cursor` from the previous response (repeat the same `duration` / `sort` / `publish_time`).
* raw: Optional, default True. True=raw search response; False=simplified parsing.

### Return:

* Channels video search result list (same structure as the `video` vertical of universal search)

### Typical chains:

* 💡 The "account" option in the sort dropdown is **not a sort** — it switches to the official-account vertical; use universal search `/fetch_search` (`business_type=account`).
* 💡 **To get Channels video detail (media download address / decode\_key)**: video result items do **not** contain media directly — only `exportId` (+ `jumpInfo.extInfo.feedNonceId`). To download / decrypt: take `exportId` → call the Channels V2 endpoint `/api/v1/wechat_channels/v2/fetch_video_detail` (pass `export_id`) to get `media` (`url` / `url_token` / `decode_key`) and the plain `username`. Result fields and response structure are the same as `/fetch_search`.

#### 输入参数 (input 对象)

*无需任何特殊参数（传空对象 `{}` 即可）*

```bash cURL theme={null}
curl -X POST https://socialvision.tisyk.xyz/api/v1/run \
  -H "Authorization: Bearer sv_live_你的API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_search/v2/fetch_search_videos",
  "input": {}
}'
```

```python Python theme={null}
import requests

res = requests.post(
    "https://socialvision.tisyk.xyz/api/v1/run",
    headers={
        "Authorization": "Bearer sv_live_你的API_KEY",
        "Content-Type": "application/json"
    },
    json={
  "provider": "tikhub",
  "endpoint": "/api/v1/wechat_search/v2/fetch_search_videos",
  "input": {}
}
)
print(res.json())
```

***
