原文链接: https://mp.weixin.qq.com/s/f8zbM6wMld3koqjaFbCuxw
前言
微信关注了很多技术类的公众号,但是一直都没看,所以想先把文章下载下来,放着以后可能一定会看。
之前写的Python微信机器人系列文章里提到了如何hook微信的实时消息,实时消息里也包含了公众号文章的推送,可以获取到文章的标题链接和发布时间,而且获取的很及时,基本公众号已发文推送就能收到。这样我们可以在收到文章后请求到正文然后保存成html,这样也可以防止文章被删除。
后面有时间顺便把这些公众号的历史文章也下载保存成pdf或HTML。已经在计划内了,采集历史并不麻烦,只是我想保存的时候也将文章的评论一起保存(有时候评论里也有有价值的回复),然后就绕了一些弯路。
另外,我创建了一个github仓库来列出这些公众号,方便大家可以看到,如果你觉得某个公众号对你有帮助也可以关注它(不是广告)。后面如果有看到新的关于逆向的公众号也会更新到仓库里。或者大家有啥好的公众号也可以推荐出来。
仓库地址: https://github.com/kanadeblisst00/high-quality-biz
不过下载完这些历史文章后,分享这些文件也是个问题。如果压缩成一个包放网盘的话不方便更新(我打算每周或者每两周更新一次历史), 如果每次更新压缩成一个包,然后每个公众号一个文件夹的话又不方便上传,也不方便看。等我下载完再看怎么分享吧
导出已关注的公众号列表
这个可以看之前写的一篇文章:【写一个Python微信机器人】第九篇: 导出自己的微信好友列表 。导出的数据里也包含了公众号。
使用教程
安装
- 安装支持的版本(3.9.8.15)微信 (下载链接:
https://www.123pan.com/s/ihEKVv-XcWx.html
提取码:5WLu
) - 安装Python,版本大于等于3.7
pip install wechat_pyrobot==1.3.0
注入Python到微信
首先创建一个目录,例如robot_code
,再创建一个main.py
(名称随意)写入以下代码:
from py_process_hooker import inject_python_and_monitor_dir
from wechat_pyrobot import get_on_startup
from wechat_pyrobot.msg_plugins import MonitorBiz
if __name__ == "__main__":
process_name = "WeChat.exe"
open_console = True
on_startup = get_on_startup(msg_plugins=[MonitorBiz])
inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)
启动并登录微信,执行这个main.py就会把Python注入到微信并且打开控制台。只要收到公众号的文章推送,控制台就会打印出来
编写自己的处理插件
上面的插件只是演示了怎么获取公众号文章的数据,我直接将数据打印在了控制台。如果你需要保存到文件或者数据库,你只需要继承这个插件,然后重写相应的方法。
假设你在main.py同目录创建了一个文件夹plugins
,然后创建了一个文件biz.py
写入以下内容:
import os
import json
from wechat_pyrobot.msg_plugins import MonitorBiz
class MyMonitorBiz(MonitorBiz):
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
self.name = os.path.basename(__file__)
# 注意当前所在目录是微信目录,而不是main.py所在目录,所以需要用__file__来定位
main_path = os.path.dirname(os.path.dirname(__file__))
self.save_path = os.path.join(main_path, "公众号监听数据.json")
def save_items(self, items):
# item是包含多个数据(字典)的列表
with open(self.save_path, 'a', encoding='utf-8') as f:
for item in items:
print(item)
f.write(json.dumps(item) + '\n')
接着在启动的时候传你自定义的插件即可,其他代码不用变。因为没有传httpapi插件,所以不会有fastapi开启http的提示。wechat_pyrobot1.3.0也取消了监听文件夹热更新模块,只会看到如下图所示:
from py_process_hooker import inject_python_and_monitor_dir
from wechat_pyrobot import get_on_startup
from plugins.biz import MyMonitorBiz
if __name__ == "__main__":
process_name = "WeChat.exe"
open_console = True
on_startup = get_on_startup(msg_plugins=[MyMonitorBiz])
inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)
有公众号发文的话你就能看到公众号监听数据.json
文件被创建,里面也有数据了。
公众号采集
目前采集微信公众号的文章数据,实时的话基本都得hook。一是时效性高,另外就是不需要主动请求接口,不受接口限制,只需要关注公众号等待公众号发文即可。其中hook Windows端微信的应该最多,因为Windows机器成本低,且可以用服务器长期稳定的运行。
采集历史文章的话,目前能使用的还有以下方式:
- 微信公众平台
- 微信读书
- windows抓包http接口
- 微信官方客户端(Android、windows等)的非http接口
- 一些第三方平台,清博等
微信公众平台和windows的http接口使用的人比较多,因为技术难度低,只需要抓包到cookie或者参数就能使用,接口也都没加密。
windows http接口的入口链接 : https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU0OTkwODU2MA==
。使用biz拼链接然后访问,再用mitmproxy等监听工具修改js来自动化操作(翻页和拦截参数)。但这种方法最近老是被封接口,以前只会封24小时,现在最长可以封一个月。所以我这边已经抛弃了这种方式。
第二种则是新版本打开公众号出现的窗口,这种不是http接口,只能使用hook或者协议来请求。有意思的是这个接口可以无限请求,不会被封接口,但如果请求很频繁并且到达一定量的话会封号,所以需要限制一下每天的请求量。当然,在限制的情况下也比http方式采集的数据多很多。
这个方式还有一点比较好,就是可以在请求列表页的时候获取到每篇文章的阅读数,如果你只是需要链接和阅读数的话,就不需要去每篇文章请求一次阅读数了。