怎么拉取一个视频号账号发布的全部视频
按顺序用三个接口:视频号账号搜索(用名称换到 v2_…@finder 账号 ID)、账号信息、账号作品逐页拉取。下面的示例一共 6 次调用,花费 $0.12;失败的调用不扣费。
更新于
要做的事:你关心某一个视频号账号,可能是竞品,也可能是准备合作的博主,想把它发过的视频整理进表格。每条视频能拿到描述、发布时间、点赞、评论、转发、收藏和时长。账号资料这一步再补上主页能看到的信息:名称、签名、作品数、IP 属地,以及关联的公众号。
动手之前先搞清楚要用哪个 ID。App 和视频号助手里显示的“视频号 ID”是 sph 开头的一小串,这里的接口不认它。接口要的是微信内部用的账号 ID,v2_ 开头、@finder 结尾,很长,比如 v2_060000231003b20faec8c353a18ebca650858991e19fab55aa5e12f6d5010f5e0eeaaafc3520@finder。这些接口没法把前者转成后者,所以要么按名称搜(第一步),要么从这个账号的任意一条视频里读 author.id。
分步操作
第一步:拿到账号 ID
调用视频号账号搜索,query 填账号名称。搜索走的是微信搜一搜,通常只返回名称最匹配的那一个账号,每次 $0.02。返回 id(就是 v2_…@finder)、name、bio、avatar_url 和 verified;加上 view=full,ext.verified_by 会给出认证主体,遇到同名账号时靠它分辨。
curl -G "https://api.okdata.online/v1/wechat_channels/users/search" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'query=新华社' \
--data-urlencode 'view=full'
如果手上已经有这个账号某条视频的分享链接,可以跳过搜索:视频号作品详情返回的 author.id 就是账号 ID。
第二步:读账号资料
把 ID 传给视频号账号信息,每次 $0.02。返回 name、bio(签名)、avatar_url、verified 和 posts(作品数)。加上 view=full,ext 里还有 ip_location、verified_reason、live_hours(累计直播小时数)和 linked_accounts(比如关联的公众号)。posts 能告诉你列表有多长:除以 15 就是大概的页数。
curl -G "https://api.okdata.online/v1/wechat_channels/users/get" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=v2_060000231003b20faec8c353a18ebca650858991e19fab55aa5e12f6d5010f5e0eeaaafc3520@finder' \
--data-urlencode 'view=full'
followers 和 likes 经常是 null。很多账号微信不公开这两个数,大的媒体号尤其如此,这时 meta.unavailable 里标的是 platform。
第三步:逐页拉作品
视频号账号作品用同一个 id,按从新到旧返回作品,每页约 15 条,每页 $0.02。每条有数字 id、text、published_at,以及 metrics.likes、metrics.comments、metrics.shares 和 metrics.favorites。加上 view=full 还有 ext.duration_s 和 ext.location。
curl -G "https://api.okdata.online/v1/wechat_channels/users/videos/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=v2_060000231003b20faec8c353a18ebca650858991e19fab55aa5e12f6d5010f5e0eeaaafc3520@finder' \
--data-urlencode 'view=full'
作品的 url 不是能打开的网页。视频号的视频没有网页版,所以 url 直接是视频文件地址,而且文件是加密的,解密用的 key 在同一次返回的 ext.decode_key 里(需要 view=full)。只是统计和对比数据的话,用不到这个文件。
要下一页,就把 page.next_cursor 原样作为 cursor 传回去。大号的作品可能有几千条,先想好在哪里停:按页数,或者按日期。
第四步:用 Python 串起来
脚本先找账号、打印资料,然后把作品写进 CSV,读满 MAX_PAGES 页,或者遇到一整页都早于 SINCE 的时候停下。
import csv
import os
import requests
API = "https://api.okdata.online"
HEADERS = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
NAME = "新华社"
MAX_PAGES = 4 # 每页一次调用,约 15 条
SINCE = "2026-09-01T00:00:00Z" # 早于这个时间的作品不要
def get(path, **params):
body = requests.get(API + path, headers=HEADERS, params=params, timeout=60).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")
return body
found = get("/v1/wechat_channels/users/search", query=NAME)["data"]["items"]
if not found:
raise SystemExit(f"没有找到视频号账号:{NAME}")
account_id = found[0]["id"]
profile = get("/v1/wechat_channels/users/get", id=account_id, view="full")["data"]["item"]
print(profile["name"], "|", profile["posts"], "条作品 | 粉丝:", profile["followers"])
with open("channels_videos.csv", "w", newline="", encoding="utf-8-sig") as f:
out = csv.writer(f)
out.writerow(["video_id", "published_at", "text", "likes", "comments", "shares", "favorites", "duration_s"])
cursor = None
for _ in range(MAX_PAGES):
params = {"id": account_id, "view": "full", **({"cursor": cursor} if cursor else {})}
body = get("/v1/wechat_channels/users/videos/list", **params)
items = body["data"]["items"]
for v in items:
if v["published_at"] >= SINCE:
m = v["metrics"]
out.writerow([v["id"], v["published_at"], v["text"], m["likes"], m["comments"],
m["shares"], m["favorites"], v["ext"].get("duration_s")])
if not items or all(v["published_at"] < SINCE for v in items) or not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
读 4 页就是上面的示例。读 20 页(约 300 条)的话,光作品列表就是 $0.40。
注意事项
- 两个 ID。
sph开头的是展示用的 ID,接口要的是v2_…@finder。拿到v2_ID 就存下来,下次直接用,不用再搜。 - 同名账号。 搜一搜按名称匹配,碰到粉丝号、山寨号或者同名的个人号时,先核对
ext.verified_by和bio,确认是你要找的那个账号再往下走。 - 列表的尽头。 大号的作品列表里,
page.has_more可能一直是true,直到某一页返回零条作品。脚本把空页也当成结束,你自己写的时候也这样处理。 - 没有播放量。 视频号不公开播放次数,
metrics.views是 null。 - 数据被隐藏。
followers或likes是 null,意思是微信没展示,不代表是零。 - 直播。 账号的直播回放在另一个列表里:视频号直播回放。
- 重试和查无此号。 每次调用带一个
Idempotency-Key请求头:24 小时内同样的请求配同样的 key,会拿回存下的结果,meta.replayed为true,不再扣费。ID 对不上任何账号时返回not_found,不扣费。
示例花费
按名称找到“新华社”,读账号资料,再拉最新的 4 页作品(约 60 条)
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说找到视频号账号“新华社”,给我看账号资料,再把它最新的 60 条左右作品列成表:日期、描述、点赞、评论、转发、收藏和时长。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "wechat_channels.users.search",
"params": {
"query": "央视新闻"
},
"idempotency_key": "<新的 UUID>"
}