问答
怎么不登录导出一个公众号的全部历史文章?
简短回答
先用公众号搜索拿到原始 ID(gh_…),已经知道微信号的话可以跳过这一步。再用历史文章接口翻页,每次 10 篇(每次 $0.04),最后逐篇取全文(每篇 $0.02)。全程不扫码、不用 Cookie。500 篇文章的号全文导出共 $12.58,只要标题和链接则是 $2.58。
常见的公众号导出办法都要有人用微信扫码登录,登录态一过期就失效。用 okdata 只需要一个 API key:不用微信号,不用 Cookie,不用扫码。
三步调用
- 找到公众号。 公众号搜索按名称搜索,返回匹配的公众号,每个结果的
id就是原始 ID,比如gh_363b924965e9。搜索按返回的账号数计费,一整页最多 $0.58,已经知道微信号就不必搜。 - 列出历史文章。 公众号历史文章传入
id(原始 ID 或微信号),每次返回 10 篇,从新到旧,带标题、链接和发布时间。把page.next_cursor作为cursor传回,直到page.has_more为 false。 - 取全文。 公众号文章详情传入文章链接,返回纯文本全文,以及公众号和发布时间。阅读数和点赞数(微信展示的话)在历史文章列表里返回。
要花多少钱
| 公众号规模 | 调用次数 | 费用 |
|---|---|---|
| 500 篇,只要标题和链接 | 1 + 50 | {{cost:wechat_mp.accounts.search1+wechat_mp.accounts.articles.list50}} |
| 500 篇,含全文 | 1 + 50 + 500 | {{cost:wechat_mp.accounts.search1+wechat_mp.accounts.articles.list50+wechat_mp.articles.get*500}} |
| 只要最新 20 篇全文 | 1 + 2 + 20 | {{cost:wechat_mp.accounts.search1+wechat_mp.accounts.articles.list2+wechat_mp.articles.get*20}} |
失败的调用不扣费,包括已删除文章返回的 not_found。
代码
import json, os, requests
API = "https://api.okdata.online/v1"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
def get(path, **params):
body = requests.get(f"{API}/{path}", headers=H, params=params, timeout=60).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']}")
return body
account = get("wechat_mp/accounts/search", query="36氪")["data"]["items"][0]["id"]
cursor, articles = None, []
while True:
body = get("wechat_mp/accounts/articles/list", id=account, **({"cursor": cursor} if cursor else {}))
articles += body["data"]["items"]
if not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
with open("articles.jsonl", "w", encoding="utf-8") as out:
for a in articles:
full = get("wechat_mp/articles/get", url=a["url"])["data"]["item"]
out.write(json.dumps(full, ensure_ascii=False) + "\n")
注意事项
- 阅读数和点赞数在历史文章列表里返回,微信不展示时为 null,
meta.unavailable会注明。 - 新 key 自带的 $0.10 试用额度不够做一次搜索,搜索会先冻结最多 $0.58。可以直接用已知的微信号开始,或者先充值。
- 作为长任务跑时,每篇文章带一个
Idempotency-Key,重试不会重复扣费。 - 文章版权属于作者。导出用于研究、监测或备份自己的号;转载时请尊重版权。
更新于