公众号后台数据抓取
Overview
未认证的微信公众号(订阅号/服务号)无法通过官方 API 获取后台数据:datacube/* 直接 404、
freepublish/batchget 报 48001。但浏览器登录态不受这些接口权限限制。
本 skill 用 Playwright 持久化 profile 保存登录态,扫码一次即可长期免登录,
全程录制后台返回的 JSON,再解析成可直接复用的文章数据表。
When to use
- 需要公众号阅读数、分享数、涨粉数据做复盘
- 需要已发表文章的真实链接(建往期链接库 / 文末超链接)
- 遇到
datacube404、freepublish/batchget48001、publish/getarticlelist40066
快速判断:先确认是不是权限问题
调一次账号信息接口,看认证状态:
GET https://api.weixin.qq.com/cgi-bin/account/getaccountbasicinfo?access_token=TOKEN
若返回 qualification_verify: false 或 naming_verify: false → 未认证 → API 路彻底封死,走本 skill。
若已认证 → 直接用 datacube/getarticletotal 等官方接口,不需要本 skill。
各接口的确切表现与替代方案见 references/接口权限速查.md。
Workflow
Step 1 · 探测并记录 HTTP 数据(必须)
node scripts/grab_mp_data.js --out ./mp-data
- 首次运行弹出浏览器,用户微信扫码登录(默认等 180 秒,可用
--scan-timeout调整) - 登录态写入
./.mp_profile/(可用--profile指定位置)。这个目录等同账号密码,不要外传或提交到 git - 脚本会录制后台所有 JSON 到
<out>/raw/,并访问已发表列表、内容分析、用户分析、图文素材四个页面 - 已有登录态时可加
--headless无窗口运行
产出:<out>/raw/*.json、pages/*.txt、shots/*.png、接口清单.txt
Step 2 · 解析成表格
python3 scripts/parse_mp_data.py ./mp-data/raw --out ./mp-data
产出 已发表文章.csv(Excel 友好,UTF-8 BOM)和 已发表文章.md。
解析脚本不硬编码字段名——递归遍历所有 JSON,凡含 title 键的对象都当作一条记录,
再按候选名抽取阅读/分享/在看/评论。后台改版导致字段改名也能适配。
Step 3 · 校验与补漏
- 先看
接口清单.txt,确认有PUBLISHED_LIST或DATA_ANALYTICS标记的接口 - 若某类数据缺失(常见:阅读数在单独的分页接口里),翻
raw/里对应 JSON 的字段名,
把新字段名加进parse_mp_data.py的FIELD_CANDIDATES再跑一次 - 若
raw/里没有预期接口,看shots/*.png判断当前后台页面结构,
或直接读<out>/pages/页面文本_已发表列表.txt—— 页面文本里有数据的话可以纯文本兜底解析
Step 4 · 补链接(可选)
已发表列表拿不到链接时,用公开页反查法补齐,见 references/公开页反查.md。
关键实现细节
- 反自动化检测:启动参数必须带
--disable-blink-features=AutomationControlled,
否则公众平台会拦截。这是脚本能跑起来的前提。 - 持久化 profile 而非 cookies 文件:
launchPersistentContext一次登录长期有效,
比手动导出 cookie 稳定得多。 - 探测式抓取而非写死解析:后台每年改版,录制全部 JSON 再反推,
比赌某个接口地址存活更可靠。 - 不需要 AppID / AppSecret:整个流程只用扫码登录。脚本不接受任何密钥参数,
若用户主动提供密钥,提示无需提供。
排错
| 现象 | 原因 / 处理 |
|---|---|
| 提示「缺少依赖 playwright」 | npm i playwright && npx playwright install chromium |
| 浏览器打不开 / 闪退 | 确认已装 chromium;macOS 上保留 --no-sandbox |
| 扫码后一直不跳转 | 登录态可能过期,删掉 .mp_profile/ 重跑 |
raw/ 为空 |
后台改版,接口地址变了;看 shots/ 截图找新入口 |
| 解析出 0 条 | JSON 里没有含 title 的对象;人工看 raw/ 结构后扩 FIELD_CANDIDATES |
| 抓到数据但全是 0 | 数据接口分页或延迟加载,在页面上多滚几屏再抓 |
Security & Privacy
- 登录态目录
.mp_profile/包含完整账号会话,不得打包、上传或提交到版本库 - 脚本不需要也不应接收 AppID / AppSecret
- 抓取的数据仅用于号主自己的运营分析,不对外分发