寫一個監控採集公衆號文章的插件

原文鏈接: 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 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章