怎么拿到一个公众号的历史文章和全文
按顺序用三个接口:公众号搜索把名称换成原始 ID(gh_…),公众号历史文章每次列 10 篇,公众号文章详情拿全文。下面的示例一共 9 次调用,搜索按满页计,花费 $0.74;失败的调用不扣费。
更新于
要做的事:你在关注某个竞品、某家行业媒体或某个监管部门的公众号,想把它最近的文章整理成能用的形式:标题、日期、阅读数放进一张表,重要的几篇拿到完整正文。在微信里,这意味着拿着手机一直往下翻历史消息。这里是连着三次调用:找到账号,列出文章,把要的那几篇拉全文。最后得到一张文章列表 CSV,每篇全文存一个文本文件。
不需要微信账号,不用扫码,也不用 Cookie。每次调用就是带着 key 发一个 HTTPS 请求。
分步操作
第一步:找到公众号
公众号搜索接收 query,填公众号名称或关键词。每个结果有 id(原始 ID,gh_ 加 12 位字符)、username(微信号,有的话)、name、avatar_url 和 followers。加上 view=full,ext 里还有 biz(公众号链接里的 __biz 值)、last_published_at 和 articles_per_week,用来区分正主和名字相近的号。
curl -G "https://api.okdata.online/v1/wechat_mp/accounts/search" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'query=极客公园' \
--data-urlencode 'view=full' \
--data-urlencode 'fields=id,name,username,ext.last_published_at'
这是唯一按条计费的接口:每返回一个公众号 $0.058,一整页 10 个最多 $0.58。用完整的公众号名称搜,通常只返回一个或几个结果,花费只是满页的零头;用宽泛的词搜,就会返回满满一页。搜索执行期间会先从余额里冻结满页的金额,结束后马上退回没用到的部分。余额不够一整页时,第一页只返回余额能付的条数。
留下 id 之前先核对 name,排第一的不一定是你要的那个。如果已经知道 gh_ ID 或微信号,这一步可以直接跳过。手工免费查的办法见怎么查公众号的原始 ID。
第二步:列出历史文章
公众号历史文章的 id 传第一步拿到的 gh_ ID 或微信号,每次返回 10 篇,从新到旧,每次 $0.02。每篇有 title、url(mp.weixin.qq.com 链接)、published_at、摘要 text、封面 images,以及微信展示时才有的 metrics.views(阅读)和 metrics.likes。加 view=full 时,ext.position 表示这篇在当天推送里的位置,1 是头条。
curl -G "https://api.okdata.online/v1/wechat_mp/accounts/articles/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=gh_7c2a9e41b05d'
要更早的文章,就把 page.next_cursor 原样作为 cursor 传回去,直到 page.has_more 为 false。翻 5 页大约是最近 50 篇。
第三步:拉全文
公众号文章详情的 url 传文章链接,返回正文,每次 $0.02。text 是纯文本,段落和小标题各占一行,正文里的图片去掉了,封面保留在 images 里。同时返回 title、published_at 和 author(公众号的 gh_ ID 和名称)。加 view=full 时,ext.author_byline 是标题下署名的作者,ext.copyright 和 ext.source_url 可以帮你识别转载。
curl -G "https://api.okdata.online/v1/wechat_mp/articles/get" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'url=https://mp.weixin.qq.com/s/Qm3xK7pVd2LrT9wYfZc1aB'
详情里的阅读和点赞为 null,这两个数从历史文章列表里取。
第四步:用 Python 串起来
脚本按完整名称找到公众号,翻 5 页历史文章,列表存成 CSV,再把阅读最高的 3 篇拉全文、各存一个文本文件。
import csv
import os
import re
import requests
API = "https://api.okdata.online"
HEADERS = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
NAME = "极客公园"
HISTORY_PAGES = 5 # 每页 10 篇,一次调用
FULL_TEXT = 3 # 拉全文的篇数
def get(path, **params):
body = requests.get(API + path, headers=HEADERS, params=params, timeout=90).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")
return body
accounts = get("/v1/wechat_mp/accounts/search", query=NAME)["data"]["items"]
account = next((a for a in accounts if a["name"] == NAME), None)
if account is None:
raise SystemExit(f"no exact match; got {[a['name'] for a in accounts]}")
articles, cursor = [], None
for _ in range(HISTORY_PAGES):
body = get("/v1/wechat_mp/accounts/articles/list", id=account["id"], **({"cursor": cursor} if cursor else {}))
articles += body["data"]["items"]
if not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
with open("articles.csv", "w", newline="", encoding="utf-8-sig") as f:
out = csv.writer(f)
out.writerow(["published_at", "title", "reads", "likes", "url"])
for a in articles:
out.writerow([a["published_at"], a["title"], a["metrics"]["views"], a["metrics"]["likes"], a["url"]])
for a in sorted(articles, key=lambda a: a["metrics"]["views"] or 0, reverse=True)[:FULL_TEXT]:
full = get("/v1/wechat_mp/articles/get", url=a["url"])["data"]["item"]
with open(re.sub(r"[^\w-]", "_", full["id"]) + ".txt", "w", encoding="utf-8") as f:
f.write(f"{full['title']}\n{full['published_at']}\n{full['url']}\n\n{full['text']}\n")
如果这个号的阅读数是 null,就改成按日期排序取最新的几篇。一个 500 篇文章的号全部拉全文,搜索之外是 $11.00。
注意事项
- 阅读和点赞不一定有。 历史文章列表在微信展示时才会填
metrics.views和metrics.likes,否则为 null,原因写在meta.unavailable里。评论、分享、收藏数拿不到。 - 粉丝数是估算。 搜索结果里的
followers来自第三方数据库,不是微信官方数字,ext.followers_note里有标注。 - 删掉的不收钱。 列出来之后又被删除的文章返回
not_found,不扣费。 - 重试不会重复扣费。 每次调用带一个
Idempotency-Key请求头。24 小时内同样的请求配同样的 key,会直接拿回上次的结果,meta.replayed为true,不再扣费。 - 试用额度。 新 key 的 $0.10 试用额度只够搜索满页的一小部分,第一次搜索返回的公众号可能不到一整页。可以直接从已知的微信号开始,或者先充值。
- 版权。 文章归原作者所有。用于研究和监测没问题,引用时保留原文链接。
如果要导出一个号的全部文章而不只是最近的,看怎么导出公众号的全部文章。要长期盯几个号的更新,看怎么监测竞品公众号。
示例花费
按名称搜一次“极客公园”,翻 5 页历史文章(约 50 篇),再拉阅读最高的 3 篇全文
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说找到公众号“极客公园”,列出它最近 50 篇文章的标题、日期和阅读数,再把阅读最高的 3 篇全文给我。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "wechat_mp.accounts.search",
"params": {
"query": "36氪"
},
"idempotency_key": "<新的 UUID>"
}