之前写公众号时使用一些浏览器插件能方便转载其他公众号文章,但现在功能已经无法使用;发现是因为微信官方已经关闭相关接口wechat-article/wechat-article-exporter。目前的解决方案是通过微信读书接口获取文章,但也有风控问题,只有最新文章能稳定获取。
核心思路
微信读书根据公众号查看文章
微信读书风控相对没那么严,每个公众号可以视作一个bookId,通过/web/mp/articles接口,参数bookId + offset获取文章,但目前测试来看只能获取很少部分文章,甚至获取不了。可以通过/api/mp/cover接口兜底。
首先通过/web/shelf/bookIds检查是否登录,登陆后获取bookId。
微信公众号的bookId以MP_WXS_开头,登录微信助手后可以过滤掉非MP_WXS_开头的bookId。

/web/mp/articles接口拿到reviewId拆解得到公众号文章,解析得到链接

另外还有通过文章链接解析得到公众号的bookId1
2bookId = 'MP_WXS_' + base64解码(__biz)
例:__biz=MzA5NTQ0NjU3Mw== → 解码 "3095446573" → MP_WXS_3095446573
通过文章链接的__biz解码得到公众号id,拼接得到公众号信息,这样可以在某篇文章处关注公众号。通过POST /mp/shelf/addToShelf添加公众号
公众号添加
公众号后台图文编辑器里「账号名片 / 超链接」的搜号入口,底层接口是 cgi-bin/searchbiz1
2
3
4
5GET mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&scene=1
&query=<名字>&begin=0&count=5&token=<后台token>&lang=zh_CN&f=json&ajax=1
未登录 → HTTP 200 + {"base_resp":{"ret":200003,"err_msg":"invalid session"}}
对照组 /cgi-bin/searchbizzzz → HTTP 404
返回的 fakeid 就是 __biz 的 base64 → 直接套上的换算公式 bookId = 'MP_WXS_' + atob(__biz)。
相关接口
| # | 接口 | 方法 | 归属 | 干什么 | 关键请求参数 | 关键响应字段 | 错误协议 |
|---|---|---|---|---|---|---|---|
| 1 | /web/shelf/bookIds | GET | 微信读书 | 书架列表 兼登录探针 | 无 | bookIds / data.bookIds / ids / books / shelf | 平铺 errCode:-2010 未登录、-2012 超时 |
| 2 | /web/book/info | GET | 微信读书 | 取号名 | bookId | title / bookName / name / bookInfo.title | 同上 |
| 3 | /web/mp/articles | GET | 微信读书 | 文章列表(主路径) | bookId、offset(步长 50) | reviews[].review.mpInfo.title、reviewId、mpInfo.time | -2041 风控、-2042 未收录 |
| 4 | /api/mp/cover | GET | 微信读书 | 单篇兜底 | bookId | 同 3,但外面套了一层 | 嵌套 statusCode>=400 + data.errcode |
| 5 | /web/mp/content | GET | 微信读书 | 单篇正文(已封装,界面暂未用) | reviewId | 正文 HTML | 平铺 errCode |
| 6 | /mp/shelf/addToShelf | POST | 微信读书 | 加入书架,唯一的写操作 | body {"bookIds":["MP_WXS_…"]} | — | 平铺 errCode |
| 7 | /cgi-bin/searchbiz | GET | 公众号后台 | 按名字搜号 |
通过微信读书获取关注的公众号(bookId)并获取文章标题、reviewId(用于解析文章链接),同时有添加关注读书公众号功能。
公众号提供按名称搜索功能,这样不完全依赖微信读书关注公众号

核心换算
1 | bookId = 'MP_WXS_' + atob(__biz) |
bizToFakid() 做了完整防御:decodeURIComponent 处理 %3D → 去空白 → URL-safe base64 转标准(-→+、_→/)→ 补 padding → atob → 用 /^\d{5,20}$/ 校验结果像不像 fakid。离线样本验证过三组,例如 MzU1MjI5MDk3Nw== → MP_WXS_3552290977。__biz 又有三个来源:URL 查询串、页面 DOM(window.biz / cgiData.biz / #js_name 的 href / 最后兜底扫源码正则)、以及后台搜索返回的 fakeid——三条入口在这里汇流。
做了个插件,欢迎使用,喜欢请点个star
VibeProjects/wechat_article_explorer at main · drowning-in-codes/VibeProjects
