问答

怎么不登录导出一个公众号的全部历史文章?

简短回答

先用公众号搜索拿到原始 ID(gh_…),已经知道微信号的话可以跳过这一步。再用历史文章接口翻页,每次 10 篇(每次 $0.04),最后逐篇取全文(每篇 $0.02)。全程不扫码、不用 Cookie。500 篇文章的号全文导出共 $12.58,只要标题和链接则是 $2.58。

常见的公众号导出办法都要有人用微信扫码登录,登录态一过期就失效。用 okdata 只需要一个 API key:不用微信号,不用 Cookie,不用扫码。

三步调用

  1. 找到公众号。 公众号搜索按名称搜索,返回匹配的公众号,每个结果的 id 就是原始 ID,比如 gh_363b924965e9。搜索按返回的账号数计费,一整页最多 $0.58,已经知道微信号就不必搜。
  2. 列出历史文章。 公众号历史文章传入 id(原始 ID 或微信号),每次返回 10 篇,从新到旧,带标题、链接和发布时间。把 page.next_cursor 作为 cursor 传回,直到 page.has_more 为 false。
  3. 取全文。 公众号文章详情传入文章链接,返回纯文本全文,以及公众号和发布时间。阅读数和点赞数(微信展示的话)在历史文章列表里返回。

要花多少钱

公众号规模 调用次数 费用
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,重试不会重复扣费。
  • 文章版权属于作者。导出用于研究、监测或备份自己的号;转载时请尊重版权。

更新于