给 AI

操作指南

怎么拿到一个公众号的历史文章和全文

按顺序用三个接口:公众号搜索把名称换成原始 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 篇全文

接口调用次数单价小计
公众号搜索1$0.058 / 条$0.58
公众号历史文章5$0.02$0.10
公众号文章详情3$0.02$0.06
合计9$0.74

按本页生成时的价格计算。失败的调用不扣费。

在你的 AI 里用(MCP)

先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。

可以这样说找到公众号“极客公园”,列出它最近 50 篇文章的标题、日期和阅读数,再把阅读最高的 3 篇全文给我。

智能体第一次调用 call 工具时发送的内容
{
  "endpoint": "wechat_mp.accounts.search",
  "params": {
    "query": "36氪"
  },
  "idempotency_key": "<新的 UUID>"
}

配置 MCP 服务 →

接上一次,以后直接问 AI。

新 key 自带 $0.10 试用额度。贴一句话,就能接进你的智能体。

免费开始
一句话接进你的 AI

把这句话发给你的智能体

读一下 https://okdata.online/zh/agents.md,帮我把 okdata 配好;我的 key 在环境变量 OKDATA_API_KEY 里。

Claude Code、Cursor、Codex 等能打开网址的智能体,读完会自己配好。

MCP 地址https://api.okdata.online/mcp