公众号文章有 API 吗?用 Python 批量取历史文章和阅读数(2026)

微信官方的公众号接口只管你自己的号,2025 年 7 月起个人号和未认证号连已发表文章列表都取不了,也没有读别人公众号的接口;要读任一公众号的文章和阅读数,用第三方数据接口。下面用 DataXAPI 的 Python SDK 演示,免费试用,最多 333 次。 用 3 个接口:微信公众号实时查找 → 微信公众号文章列表 → 微信公众号文章互动数据。下面的示例一共 34 次调用,合计 $0.68;失败的调用不收费。

更新于 2026-11-06在 ChatGPT 里打开在 Claude 里打开

按名字找到公众号,取它最近 3 页文章,再取每篇的阅读、点赞、分享数,写进一张 CSV。

第 1 步:微信公众号实时查找

按名字在搜一搜里找公众号,最像的排前面;id 是 gh_ 开头的原始编号。

curl -G "https://api.dataxapi.com/v1/wechat/accounts/search" \
  --data-urlencode "query=36氪" \
  -H "Authorization: Bearer $DATAXAPI_API_KEY"
# pip install dataxapi
from dataxapi import DataXAPI

dx = DataXAPI()  # reads DATAXAPI_API_KEY
result = dx.wechat.accounts.search(query="36氪")
print(result["data"]["items"])
// npm i @dataxapi/sdk
import { DataXAPI } from "@dataxapi/sdk";

const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.wechat.accounts.search({ query: "36氪" });
console.log(result.data.items);
dataxapi call wechat.accounts.search 'query=36氪'
录制的返回
{
  "code": "ok",
  "request_id": "86788fb5-4235-48ac-b9c6-23292e637c65",
  "data": {
    "items": [
      {
        "id": "1047168840907789",
        "username": "nanfeng_0721",
        "name": "南边的风",
        "bio": "在上海,周末都在山里",
        "avatar_url": "https://wx.qlogo.cn/mmhead/xjoBFsBvyPoDjvS4DO1qBnMkqIePSAETki44ma9I/132",
        "verified": true
      },
      // … 另有 10 条
    ]
  },
  "page": {
    "next_cursor": "c1.Ew51uWdKdB0gdItoicfGl1FUa3rXNGNkJvKajjh3",
    "cursor_expires_at": "2026-11-02T12:25:07.000Z",
    "has_more": true,
    "returned": 11
  },
  "warnings": [],
  "meta": {
    "capability": "wechat.accounts.search",
    "result_status": "complete",
    "fetched_at": "2026-11-02T11:25:07.000Z",
    "cached": false,
    "replayed": false,
    "unavailable": {
      "url": "platform",
      "created_at": "capability",
      "metrics": "capability"
    },
    "billing": {
      "amount": "0.02",
      "currency": "USD",
      "balance_after": "9.98"
    }
  }
}

取自 2026-11-02 11:25 UTC 录下的真实返回。名字、正文和编号是示例,链接也是,都不是录到的原文(页面不展示任何人的个人信息);数字是原样。长列表做了截断。请求号、游标和余额是示意。

微信公众号实时查找 · $0.0200 / 一次 · 参数、字段和报错见接口页 →

第 2 步:微信公众号文章列表

把原始编号放进 id,取一页文章,从新到旧;下一页用 page.next_cursor。每条的 url 是文章链接。

curl -G "https://api.dataxapi.com/v1/wechat_mp/accounts/articles/list" \
  --data-urlencode "id=gh_13c97ab93ce8" \
  -H "Authorization: Bearer $DATAXAPI_API_KEY"
# pip install dataxapi
from dataxapi import DataXAPI

dx = DataXAPI()  # reads DATAXAPI_API_KEY
result = dx.wechat_mp.accounts.articles.list(id="gh_13c97ab93ce8")
print(result["data"]["items"])
// npm i @dataxapi/sdk
import { DataXAPI } from "@dataxapi/sdk";

const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.wechat_mp.accounts.articles.list({ id: "gh_13c97ab93ce8" });
console.log(result.data.items);
dataxapi call wechat_mp.accounts.articles.list id=gh_13c97ab93ce8
录制的返回
{
  "code": "ok",
  "request_id": "882b7d3d-9a50-48d1-ba28-513bec440e40",
  "data": {
    "items": [
      {
        "id": "2651350693_1",
        "url": "https://mp.weixin.qq.com/s/yEmemDFnwYkjLklz1HGeGz",
        "type": "article",
        "title": "实测一个月周末露营,结论有点意外",
        "text": null,
        "published_at": "2026-10-12T13:35:48.000Z",
        "author": { "id": "gh_baa95f56a86c" }
      },
      // … 另有 9 条
    ]
  },
  "page": {
    "next_cursor": "c1.c3D9oI16A0J5E0SMD5JU_mAesJzXbexIUP2nOHbv",
    "cursor_expires_at": "2026-10-12T20:02:58.000Z",
    "has_more": true,
    "returned": 10
  },
  "warnings": [],
  "meta": {
    "capability": "wechat_mp.accounts.articles.list",
    "result_status": "complete",
    "fetched_at": "2026-10-12T19:02:58.000Z",
    "cached": false,
    "replayed": false,
    "unavailable": {
      "lang": "capability",
      "author.username": "capability",
      "author.name": "capability",
      "author.avatar_url": "capability",
      "author.verified": "capability",
      "author.followers": "capability",
      "metrics": "capability",
      "images": "capability",
      "hashtags": "platform",
      "mentions": "platform",
      "is_pinned": "capability",
      "post_id": "platform",
      "parent_id": "platform",
      "root_id": "platform"
    },
    "billing": {
      "amount": "0.02",
      "currency": "USD",
      "balance_after": "9.98"
    }
  }
}

取自 2026-10-12 19:02 UTC 录下的真实返回。名字、正文和编号是示例,链接也是,都不是录到的原文(页面不展示任何人的个人信息);数字是原样。长列表做了截断。请求号、游标和余额是示意。

微信公众号文章列表 · $0.0200 / 一次 · 参数、字段和报错见接口页 →

第 3 步:微信公众号文章互动数据

把文章链接放进 url,取这篇此刻的阅读、点赞、推荐、分享、收藏、评论数。要用长链接。

curl -G "https://api.dataxapi.com/v1/wechat_mp/articles/metrics" \
  --data-urlencode "url=https://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2667038683&idx=1&sn=0422127e651acd7f6cf6ef7e1cff04bc" \
  -H "Authorization: Bearer $DATAXAPI_API_KEY"
# pip install dataxapi
from dataxapi import DataXAPI

dx = DataXAPI()  # reads DATAXAPI_API_KEY
result = dx.wechat_mp.articles.metrics(url="https://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2667038683&idx=1&sn=0422127e651acd7f6cf6ef7e1cff04bc")
print(result["data"]["item"])
// npm i @dataxapi/sdk
import { DataXAPI } from "@dataxapi/sdk";

const dx = new DataXAPI(); // reads DATAXAPI_API_KEY
const result = await dx.wechat_mp.articles.metrics({ url: "https://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2667038683&idx=1&sn=0422127e651acd7f6cf6ef7e1cff04bc" });
console.log(result.data.item);
dataxapi call wechat_mp.articles.metrics 'url=https://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=2667038683&idx=1&sn=0422127e651acd7f6cf6ef7e1cff04bc'
录制的返回
{
  "code": "ok",
  "request_id": "789c698d-e1c1-4558-9aa5-408482ee5894",
  "data": {
    "item": {
      "id": "2622051355_1",
      "metrics": {
        "likes": 2235,
        "comments": 6,
        "shares": 9041,
        "favorites": 97,
        "views": 100001
      },
      "approximate": [
        { "field": "metrics.views", "kind": "lower_bound" }
      ]
    }
  },
  "warnings": [],
  "meta": {
    "capability": "wechat_mp.articles.metrics",
    "result_status": "complete",
    "fetched_at": "2026-10-29T09:44:39.000Z",
    "cached": false,
    "replayed": false,
    "unavailable": {
      "url": "capability",
      "type": "capability",
      "title": "capability",
      "text": "capability",
      "lang": "capability",
      "published_at": "capability",
      "author": "capability",
      "metrics.reposts": "platform",
      "images": "capability",
      "hashtags": "capability",
      "mentions": "capability",
      "is_pinned": "capability",
      "post_id": "platform",
      "parent_id": "platform",
      "root_id": "platform"
    },
    "billing": {
      "amount": "0.02",
      "currency": "USD",
      "balance_after": "9.98"
    }
  }
}

取自 2026-10-29 09:44 UTC 录下的真实返回。名字、正文和编号是示例,链接也是,都不是录到的原文(页面不展示任何人的个人信息);数字是原样。长列表做了截断。请求号、游标和余额是示意。

微信公众号文章互动数据 · $0.0200 / 一次 · 参数、字段和报错见接口页 →

示例花多少钱

找号一次,3 页文章列表,再取 30 篇的互动数

接口调用次数单价小计
合计34$0.68

价格是生成本页时的现行价格。失败的调用不收费。

在 AI 里做(MCP)

把 DataXAPI 接进你的 AI 客户端,只要接一次。之后直接说要什么,代理自己找到这些接口、看好价格,用你的余额调用。

这样说: 找到“人民日报”公众号,取最近 30 篇文章的标题、发布时间、阅读数和点赞数,整理成一张表。
代理发给 call 工具的参数
{
  "capability": "wechat.accounts.search",
  "query": "36氪",
  "idempotency_key": "<a new UUID>"
}

登录后复制带你 Key 的接入提示词了解 MCP 服务 →

为什么用 DataXAPI

  • 稳定:近 30 天接口可用 99.9%,状态页公开,可以自己核对。
  • 快:近 7 天付费调用的中位耗时 3.5 秒(2026-11-06 统计)。
  • 省 token:微信公众号的 8 个接口各取一份录制的真实返回,平台原始 JSON 合计 2.1 万 token,AI 通过 DataXAPI 的 MCP 读到的只有 4,494 token,少 79%;直接调接口拿到的 JSON 也少 70%(2026-11-06 统计)。所有平台同一种格式:作者在 author,互动数在 metrics,翻页用 page.next_cursor,换平台不用重写解析。
  • 先看再用:每个接口的页面上都有一份录制的真实返回,字段一目了然。
  • 花钱可控:失败不收费;每把 Key 能设金额上限,X-Max-Price 限定一次最多花多少,同一个 Idempotency-Key 24 小时内不重复扣费。
  • 接 AI 方便:远程 MCP 服务已在 MCP 官方登记处登记(com.dataxapi/mcp),Claude、Cursor、ChatGPT 都能直接用。
  • 免费试用,最多 333 次,不用绑卡。

要知道的

  • 不用微信号、不用扫码,也不用认证公众号。
  • 正文用 wechat_mp.articles.get,精选评论用 wechat_mp.articles.comments.list,都按文章链接取。
  • 不写代码也行:把 DataXAPI 接进 Claude 或 ChatGPT,用下面“在 AI 里做”的那句话。

完整脚本

上面这件事写成一个能直接跑的脚本:Python,用 SDK,Key 从 DATAXAPI_API_KEY 读。它写出一个 CSV 文件,最后打印调了几次、取到几条、扣了多少。

Python
# pip install dataxapi
# export DATAXAPI_API_KEY=dx_...   (your key)
import csv
from decimal import Decimal
from dataxapi import DataXAPI

dx = DataXAPI()
calls, fetched, charged = 0, 0, Decimal("0")

def run(capability, params):
    """One call; counts it and what it was charged."""
    global calls, charged
    result = dx.call(capability, params)
    calls += 1
    charged += Decimal(str(result["meta"]["billing"]["amount"]))
    return result

NAME = "人民日报"
PAGES = 3

# 1. The account's original ID (gh_...), the closest match first.
account = run("wechat.accounts.search", {"query": NAME})["data"]["items"][0]["id"]

# 2. Its articles, newest first, page after page.
articles, cursor = [], None
for _ in range(PAGES):
    page = run("wechat_mp.accounts.articles.list", {"id": account, **({"cursor": cursor} if cursor else {})})
    articles += page["data"]["items"]
    cursor = page["page"]["next_cursor"]
    if not page["page"]["has_more"]:
        break

# 3. Each article's reads, likes and shares right now.
rows = []
for article in articles:
    counts = run("wechat_mp.articles.metrics", {"url": article["url"]})["data"]["item"]["metrics"]
    rows.append([article.get("published_at"), article.get("title"), counts.get("views"), counts.get("likes"), counts.get("shares"), article.get("url")])

fetched = len(rows)
with open("wechat-articles-reads.csv", "w", newline="", encoding="utf-8") as file:
    csv.writer(file).writerows([["published_at", "title", "reads", "likes", "shares", "url"], *rows])

print(f"calls: {calls}, items: {fetched}, charged: ${charged}")