Python一键下载公众号所有文章,导出文件支持PDF,HTML,Markdown,Excel,chm等格式
苏生不惑第167 篇原创文章,将本公众号设为星标
,第一时间看最新文章。
关于备份之前写过以下文章:
一键备份微博并导出生成PDF,顺便用Python分析微博账号数据
上面写的备份公众号方法都是单篇备份,如果你想备份某个公众号的所有文章,就有点太麻烦了,所以今天分享的是用Python一键备份某个公众号的所有文章,这里就以我自己的公众号苏生不惑
为例了,原理就是通过抓包抓取微信客户端的接口,用Python请求微信接口获取公众号文章链接再下载。
charles 抓包
常见的抓包工具有Fiddler,charles,这里用的charles,先去官网 https://www.charlesproxy.com/download 下载软件,然后打开微信客户端找到公众号,进入文章列表可以看到发过的文章。

image.png
不过charles没安装证书前获取不到https接口数据,显示unknown。

安装证书后在 proxy->ssl proxying settings 添加域名和host 。

image.png 再次抓取可以看到公众号文章接口数据了。

image.png 公众号文章的接口地址 https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MjM5ODIzNDEx&f=json&offset=25&count=10&is_ok=1&scene=124&uin=MTU0MTQzNj&key=f57423 ,参数比较多,其中有用的参数 __biz 是用户和公众号之间的唯一id,uin是用户的id,这个是不变的,key 是请求的秘钥,一段时间就会失效,offset 是偏移量,count 是每次请求的条数,返回值结构如下:
{
"ret": 0,
"errmsg": "ok",
"msg_count": 10,信息条数
"can_msg_continue": 1,是否还可以继续获取,1代表可以。0代表不可以,也就是最后一页
"general_msg_list": "{\"list\":[{\"comm_msg_info\":{\"id\":1000000182,\"type\":49,\"datetime\":1585702800,\"fakeid\":\"2398234112\",\"status\":2,\"content\":\"\"},\"app_msg_ext_info\":{\"title\":\"张国荣音乐\/演唱会\/电影全集网盘分享\",\"digest\":\"#17宠爱张国荣#\",\"content\":\"\",\"fileid\":0,\"content_url\":\"http:\/\/mp.weixin.qq.com\/s?__biz=MjM5ODIzNDExMg==&mid=2257484715&idx=1&sn=2fab0a11d62090d5e30e03e334bce636&chksm=a5b70ac492c083d275b6e15f0de85b8baf488ebb76e5429b08f40cdc53ab6e27b0ce5474fb30&scene=27#wechat_redirect\",\"source_url\":\"\",\"cover\":\"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/pchiblEh3tErdgYu06FFVuvnKr9aAkddJLB7pgNhaiav0aYGQKJI0Dwn0kpT4wnmQkIglGH1Nciam5IThX19ibyEag\/0?wx_fmt=jpeg\",\"subtype\":9,\"is_multi\":0,\"multi_app_msg_item_list\":[],\"author\":\"苏生\",\"copyright_stat\":100,\"duration\":0,\"del_flag\":1,\"item_show_type\":0,\"audio_fileid\":0,\"play_url\":\"\",\"malicious_title_reason_id\":0,\"malicious_content_type\":0}}]}",
"next_offset": 37,
"video_count": 1,
"use_video_tab": 1,
"real_type": 0,
"home_page_list": []
}
可以看到返回数据包括文章标题titile、摘要digest、文章地址content_url、阅读原文地址source_url、封面图cover、作者author ,只要抓取这些有用的数据就行了。
python 抓取公众号文章
上面分析了接口参数和返回数据,开始用Python请求微信接口就是了。
url = "https://mp.weixin.qq.com/mp/profile_ext"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat"
}
params = {
'action': 'getmsg',
'__biz': biz,
'f': 'json',
'offset': offset,
'count': '10',
'uin': uin,
'key': key,
}
response = requests.get(url, headers=headers, params=params)
res= response.json()
print(res)
next_offset = res['next_offset']
can_msg_continue = res['can_msg_continue']
general_msg_list = res['general_msg_list']
data_list = json.loads(general_msg_list)['list']#返回的公众号文章数据

image.png
这里只抓取原创文章,我的公众号有160多篇原创,生成HTML文件2分钟就搞定。

用谷歌浏览器打开就能看。

image.png
生成的HTML文件还可以转成chm格式,需要先安装软件 Easy CHM,这是一款强大的CHM电子书或CHM帮助文件的快速制作工具 http://www.etextwizard.com/cn/easychm.html
左侧是文章标题,右侧是文章内容,看起来非常方便。


image.png image.png 然后编译成一个chm文件,这样直接双击文件就能打开浏览了。 image.png

还有含有文章标题和链接的 markdown 文件,关于markdown之前文章介绍过 用 Markdown 来写简历和 PPT。

excel文件格式也有。

image.png image.png
生成HTML,markdown和Excel都比较快,因为都是文本,下面开始导出PDF。
导出PDF
导出PDF用的工具是wkhtmltopdf ,先到官网https://wkhtmltopdf.org/downloads.html 下载安装 wkhtmltopdf , 安装后设置环境变量,之前文章写过 那些你可能不知道的 windows 奇技淫巧,然后直接命令行就能生成PDF。
λ wkhtmltopdf http:
//www.baidu.com baidu.pdf
Loading pages (1/6) Counting pages (2/6) Resolving links (4/6) Loading headers and footers (5/6) Printing pages (6/6) Done
比如生成百度首页的PDF。

image.png
Python中使用pdfkit 模块来调用wkhtmltopdf ,先用pip install pdfkit -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
来安装它。
再次运行程序,PDF文件也生成了。

PDF也可以用谷歌浏览器打开,比如这篇一键解锁网易云音乐变灰歌曲。

不过由于生成PDF比较慢,文章多的话key参数会失效,需要重新获取,然后修改next_offset继续抓取。
{'base_resp': {'ret': -3, 'errmsg': 'no session', 'cookie_count': 0, 'csp_nonce': 406210942}, 'ret': -3, 'errmsg': 'no session', 'cookie_count': 0}

image.png
这样就完美的把我公众号的所有文章下载到本地了,有HTML,PDF,Excel,markdown,chm 格式(在公众号后台回复 公众号
获取我的所有原创文章,如果你有想下载的公众号可以加我微信免费帮忙下载)。

目前有个问题是如果公众号有付费文章,下载的也只能看一部分内容。

还有文章的评论也是有接口获取的,有空再研究下。


公众号 苏生不惑

扫描二维码关注或搜索微信susheng_buhuo