寫一個監控採集公眾號文章的外掛

Python成长路發表於2024-04-19

原文連結: 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 釋出!

相關文章