写一个监控采集公众号文章的插件

原文链接: https://mp.weixin.qq.com/s/f8zbM6wMld3koqjaFbCuxw

前言

微信关注了很多技术类的公众号,但是一直都没看,所以想先把文章下载下来,放着以后可能一定会看。

之前写的Python微信机器人系列文章里提到了如何hook微信的实时消息,实时消息里也包含了公众号文章的推送,可以获取到文章的标题链接和发布时间,而且获取的很及时,基本公众号已发文推送就能收到。这样我们可以在收到文章后请求到正文然后保存成html,这样也可以防止文章被删除。

后面有时间顺便把这些公众号的历史文章也下载保存成pdf或HTML。已经在计划内了,采集历史并不麻烦,只是我想保存的时候也将文章的评论一起保存(有时候评论里也有有价值的回复),然后就绕了一些弯路。

另外,我创建了一个github仓库来列出这些公众号,方便大家可以看到,如果你觉得某个公众号对你有帮助也可以关注它(不是广告)。后面如果有看到新的关于逆向的公众号也会更新到仓库里。或者大家有啥好的公众号也可以推荐出来。

仓库地址: https://github.com/kanadeblisst00/high-quality-biz

不过下载完这些历史文章后,分享这些文件也是个问题。如果压缩成一个包放网盘的话不方便更新(我打算每周或者每两周更新一次历史), 如果每次更新压缩成一个包,然后每个公众号一个文件夹的话又不方便上传,也不方便看。等我下载完再看怎么分享吧

导出已关注的公众号列表

这个可以看之前写的一篇文章:【写一个Python微信机器人】第九篇: 导出自己的微信好友列表 。导出的数据里也包含了公众号。

使用教程

安装

  1. 安装支持的版本(3.9.8.15)微信 (下载链接: https://www.123pan.com/s/ihEKVv-XcWx.html 提取码: 5WLu)
  2. 安装Python,版本大于等于3.7
  3. 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方式采集的数据多很多。

这个方式还有一点比较好,就是可以在请求列表页的时候获取到每篇文章的阅读数,如果你只是需要链接和阅读数的话,就不需要去每篇文章请求一次阅读数了。

本文由博客一文多发平台 OpenWrite 发布!

posted @ 2024-04-19 09:41  Python成长路  阅读(706)  评论(0编辑  收藏  举报