當前位置:首頁 > IT技術 > 微信平臺 > 正文

PC Hook 從零開始搭建微信機器人
2021-08-01 18:23:10

你好,我是悅創(chuàng)。

本文我將給大家講解微信機器人的制作,首先要跟大家說的就是:機器人不管是 QQ 機器人還是微信機器人,相對而言是比較灰色地帶,說白了不是那種能非常光明正大拿出來用的,所以我現(xiàn)在教大家使用的技術,也有可能過段時間就用不了了,但這也是沒有辦法的。這類技術始終是,道高一尺,魔高一丈的感覺。所以,大家有興趣可以多多關注一些這方面的信息。

目錄

  1. 微信機器人基礎知識
  2. 前期配置
  3. 微信機器人實現(xiàn)代碼
  4. Itchat 實現(xiàn)微信機器人(拉黑檢測)

1. 微信機器人基礎知識

1.1 微信機器人實現(xiàn)方式

目前來說微信機器人有以下幾種實現(xiàn)方式:

  • Web 網(wǎng)頁端:2017年后不再支持新號登陸,僅支持老號,且掉線嚴重,容易被封號;
  • Xposed:在 2019年6月份,微信官方在行業(yè)重點打擊 Xposed;
  • PC Hook:代碼注入型破解,封號情況也多,比較偏小的團隊使用;
  • 模擬機:延遲高、消息實時到達率低、模擬認為操作效率慢;
  • Ipad 協(xié)議:安全性較好,功能滿足,行業(yè)占有率高,但具有研發(fā)能力的研發(fā)人員偏少;
  • Mac 協(xié)議:安全性相比 Ipad 協(xié)議更好,功能性相比 Ipad 協(xié)議少些,行業(yè)內(nèi)具有研發(fā)能力更少,安全性、穩(wěn)定性比較優(yōu)秀,不會出現(xiàn)追封、批量封的情況;
  • 混合通道:基于 Mac 與 Ipad 協(xié)議,非 grpc,mmtls 破解,功能合適,微信第三方最穩(wěn)定通道,不會出現(xiàn)技術封號問題;

第一種:是使用 Web 網(wǎng)頁端,你要理解我們是如何實現(xiàn)微信機器人的,其實我們就相當于去使用程序的方式去模擬我們?nèi)说牟僮?,所以說:只要你有能夠發(fā)微信的渠道,那我們就可以使用編程方式去操控,所以最簡單最容易想到的就是 Web 網(wǎng)頁端的操作。在 17年之前,我們是可以登陸網(wǎng)頁端的,可以去操作的。但是,出現(xiàn)了 Mac、Windows 客戶端之后,就逐漸的被淘汰了。你們大部分去查的就都是網(wǎng)頁端或者基于網(wǎng)頁端,這個方法我會給大家講解。但有些小伙伴的微信實際上是用不了這個方法的。

第二種:其實就是 Xposed ,這個其實我們現(xiàn)在主流的兩大手機系統(tǒng):IOS、Android,安卓我們知道是個開源的框架,那我們開發(fā)者是可以進行調(diào)整或者植入一些所需要的操作。那 Xposed 你簡單的理解:從整個系統(tǒng)層面,去做出一些改進,類似劫持(控制)微信消息的收發(fā)或者一些功能(改變定位之類的)。但從 在 2019年6月份,微信官方在行業(yè)重點打擊 Xposed。因為像營銷類、騙子等也會去用這樣的一些技術,所以是導致官方非常重點的在打擊。這樣看來,這方法貌似也不是那么穩(wěn)妥的方法。

第三種:利用的是電腦上的微信客戶端,將代碼注入客戶端里面,我們?nèi)ソ孬@收發(fā)消息,這也是我們今天主要用到的方式,這其實就是不要太過分(騷人他人之類的,個人使用微信官方一般不會去搞你的)

第四種:如果你做過手機開發(fā)的話,應該會知道,在模擬機上面讓我做軟件的這種操控。但延遲高、消息實時到達率低、模擬認為操作效率慢。

第五種:另外我們是知道,在 Ipad 上面也是有微信客戶端的,也就是如果可以破解掉微信客戶端里面的協(xié)議,這也是一種方式。安全性較好,功能滿足,行業(yè)占有率高,但具有研發(fā)能力的研發(fā)人員偏少。(使用 Ipad 原本就比較少,有開發(fā)能力的就更少了)

第六種:安全性相比 Ipad 協(xié)議更好,功能性相比 Ipad 協(xié)議少些,行業(yè)內(nèi)具有研發(fā)能力更少,安全性、穩(wěn)定性比較優(yōu)秀,不會出現(xiàn)追封、批量封的情況。

第七種:還有一種就是把 Mac 與 Ipad 結合,基于 Mac 與 Ipad 協(xié)議,非 grpc,mmtls 破解,功能合適,微信第三方最穩(wěn)定通道,不會出現(xiàn)技術封號問題;

1.2 本文主要會講兩種

  • 基于 PC Hook
  • 基于 Web 網(wǎng)頁端

2. 前期配置

有同學可能會問,我要不要了解軟件開發(fā)之類的?其實不用,我主要是站在前人的基礎之上操作的。

2.1 那一定要注意的兩件事情是:

第一件:

  • PC Hook 得在 Windows 系統(tǒng)上操作
  • 使用 Mac 的同學可以裝 VirtualBox 虛擬機

第二件:

我們一般裝 Python 的時候,大部分裝的是 64位的 Python。但是 Windows 的微信客戶端是 32 位程序,我們需要 32位的 Python 完成后面的操作,注意:也要勾選 Add to path。所以,我們需要安裝一個 Python 32 位的。

2.2 修改 32位 Python 名稱方便區(qū)分

一般來說,你安裝了 Python 32位而你電腦本身又有 Python 64位,就已經(jīng)有了兩個 Python,所以我們需要做一個區(qū)分。

首先找到 Python 的安裝位置,一般在:C:UsersclelaAppDataLocalProgramsPython,clela:用戶名,按你自己的來。

當然,如果你不知道路徑在哪,也可以在命令行輸入:where Python

clela@黃家寶 C:UsersclelaDesktop
$ where python
C:UsersclelaAppDataLocalProgramsPythonPython36-32python.exe
C:UsersclelaAppDataLocalProgramsPythonPython37python.exe
C:UsersclelaAppDataLocalMicrosoftWindowsAppspython.exe

上面的 C:UsersclelaAppDataLocalProgramsPythonPython36-32python.exe 這個就是我安裝的 python 3.6的 32位路徑。具體看你自己安裝的 Python 版本是多少,比如:是 Python 3.7 那路徑就表示:C:UsersclelaAppDataLocalProgramsPythonPython37-32python.exe 其他的規(guī)律皆為如此。

那我們要做的一件事情是什么呢?

就是我平時用的最多的是 Python 64位,32位的 Python 只是為了做我們這個機器人項目,一般用不太到,所以我把 32位和 64位做一個區(qū)分。

怎么區(qū)分呢?

把 32 位 Python 的目錄下面的 Python.exe 改名字,改為 python32.exe,以次用來和原來的 64為 Python 區(qū)分。(這個情況是你之前裝的是 64位的話,要是 32位則不用)

?

PC Hook 從零開始搭建微信機器人_linux
PC Hook 從零開始搭建微信機器人_人工智能_02
  1. 這樣你在控制臺里面輸入 Python 就是正常的 Python64位了,我如果輸入 Python32 那這個時候就是 Python32 位。同學們可以自行驗證一下。
  2. 重新打開命令行輸入 python32 會打開 32位的 Python。

?

PC Hook 從零開始搭建微信機器人_編程語言_03
PC Hook 從零開始搭建微信機器人_java_04

[MSC v.1900 32 bit (Intel)] 就是 32位,[MSC v.1916 64 bit (AMD64)]就是 64位。

接下來啟動我們微信機器人的 Python代碼時都要輸入:

python32 xxx.py

2.3 安裝指定版本微信

不同版本的微信客戶端注入時的地址有差異,2.6.7.40 版本的微信客戶端可以正常使用。

3. 微信機器人實現(xiàn)代碼

3.1 打開項目文件夾,確認必要的文件都在

本課程提供專有的資料包。文末提供獲取方式!

確認 WechatBot.py、WeChatSDK.allWeChatSDKCore.dll 都在,然后打開 test_bot.py 文件

?

PC Hook 從零開始搭建微信機器人_linux_05
PC Hook 從零開始搭建微信機器人_編程語言_06

我給同學們寫了 WechatBot.py 文件,這些代碼文件都要放在一起,而我們接下來要寫的就是 test_bot.py,WechatBot 是我簡單寫個一個文件,同學們把他引用就 ok 了。

3.2 微信機器人的實用方法

順序:登錄 >>> 指定接收消息的處理函數(shù) >>> 初始化 >>> 主循環(huán)運行

# -*- coding: utf-8 -*-
# @Author: clela
# @Date:   2020-04-15 14:50:24
# @Last Modified by:   clela
# @Last Modified time: 2020-04-15 23:33:27
# @公眾號:AI悅創(chuàng)
from WechatBot import WechatBot
from datetime import datetime


def print_msg(pid, wxid, msg):
    print(pid, wxid, msg)


bot = WechatBot()
bot.login()
bot.set_msg_handler(print_msg)
bot.initialize()
bot.send("filehelper", datetime.now())
bot.run()

我來說一下用法是:

  1. 登錄
  2. 指定接收消息的處理函數(shù)(就是如果我們收到消息了,用哪個函數(shù)來處理)
  3. 初始化
  4. 主循環(huán)運行

首先把我寫的機器人 WechatBot 導入:

from WechatBot import WechatBot

然后實例話:

bot = WechatBot()

接下來,第一步先 login

bot.login()

注意:你運行之前,可以不用提前打開微信客戶端。

  1. 登錄:因為,這行代碼:bot.login() 一運行就會自動的把微信客戶端打開。然后打開之后,這時候你在登陸(掃碼登陸都 ok 的)這些操作之后,他就會自動的往后運行。
  2. 指定接收消息的處理函數(shù):然后,我自己寫了一個函數(shù):print_msg, 這個函數(shù)名你可以自己命名,也就是這個函數(shù)的作用就是,我微信如果收到消息,我就用這個函數(shù)來幫助我處理消息。

bot.set_msg_handler(print_msg) 收到了消息找哪個函數(shù),這里我們找:print_msg。

  1. 初始化:然后,這些完成之后,我們做初始化的操作,代碼如下:
bot.initialize()

初始化完成之后,你就可以發(fā)消息或者等著吧。

bot.send("filehelper", datetime.now())

一個名稱:filehelper(發(fā)給誰也就是 wxid) 然后,你要發(fā)的內(nèi)容:datetime.now()(你可以發(fā)其他內(nèi)容)

注意:上面自定義函數(shù) print_msg 自定義的時候必要要留有三個參數(shù)給這個函數(shù):pid, wxid, msg

  • pid:當前微信客戶端運行的進程標識符;
  • wxid:就是你每一個微信號都有一個 wxid,就類似微信號是唯一的一樣(但是,這個 wxid 不一定等同于你的微信賬號,它有可能是,人為設定的,還有一些沒有設定的,就像是 wxid_xxxx 之類的)這個就是你在收到消息,這個發(fā)消息的這個人或者群組的這個人或者群的 wxid。如果你要給這個人發(fā)消息,那就照這個 wxid 來發(fā)。不建議你調(diào)過 wxid 來發(fā)送消息,因為有些人沒有設置微信賬號。
  • msg:對方發(fā)來的消息具體是什么。

3.3 非文字消息的格式

公眾號也是有 wxid 的。

  • 公眾號 WXID gh_332c335fdd4e
  • 消息內(nèi)容:XML 格式

?

PC Hook 從零開始搭建微信機器人_編程語言_07
PC Hook 從零開始搭建微信機器人_python_08

3.4 XML 格式的讀取

如果你要解析 XML 的話,需要安裝 xmltodict 模塊,pip install xmltodict

import xmltodict

with open("wechat_xml_msg_demo.xml", "r", encoding="utf-8") as f:
    xmlparse = xmltodict.parse(f.read())
    print(xmlparse['msg']['appmsg']['title'])
    print(xmlparse['msg']['appmsg']['des'])

大概就是這個樣子,功能大概沒有那么全,但是基本的接受和發(fā)送時 ok 的,這個已經(jīng)足夠我們?nèi)プ鲆恍┦虑榱恕?/p>

3.5 擴展

如果你要指定的收發(fā)消息,可以修改如下地方代碼:

def print_msg(pid, wxid, msg):
    print(pid, wxid, msg)
    if msg == "aiyc":
        bot.send(wxid, "AI悅創(chuàng)測試代碼")

運行效果如下:

?

PC Hook 從零開始搭建微信機器人_python_09
PC Hook 從零開始搭建微信機器人_linux_10

4. Itchat 實現(xiàn)微信機器人(拉黑檢測)

你好,我是悅創(chuàng)。

我們接下來來講一下微信機器人的第二種方法:itchat 的使用,利用網(wǎng)頁端的功能來實現(xiàn)編程控制的方式。

1. Itchat 使用

1.1 關于 ItChat 的使用

有的賬號時不能使用網(wǎng)頁微信進行登陸的,因此就無法使用 ItChat ,沒有任何解決方法,此外使用 ItChat 發(fā)消息過于頻繁會有很大的風險被限制登陸。一定注意酌情使用!

?

PC Hook 從零開始搭建微信機器人_java_11
PC Hook 從零開始搭建微信機器人_java_12

單純的收發(fā)消息還是可以的,不要過度的使用。

1.2 安裝 itchat

1.3 最簡單的例子

登陸微信然后給文件傳輸助手發(fā)一條消息

import itchat

itchat.auto_login()

itchat.send("Hello, filehelper", toUserName='filechelper')
# itchat.send("你要發(fā)的內(nèi)容", toUserName='發(fā)過給誰')

?

PC Hook 從零開始搭建微信機器人_java_13
PC Hook 從零開始搭建微信機器人_linux_14

1.4 消息回復

1.4.1 接收到文字消息時調(diào)用函數(shù)處理:
import itchat

@itchat.msg_register(itchat.content.TEXT) # itchat 將根據(jù)接收到的消息類型,尋找對應的已經(jīng)注冊的方法 @itchat.msg_register(itchat.content.消息類型)
def text_reply(msg):
    return msg.text # 人家給我發(fā)什么消息我就回什么

itchat.auto_login()
itchat.run()

消息類型有以下這些:

?

PC Hook 從零開始搭建微信機器人_編程語言_15
PC Hook 從零開始搭建微信機器人_編程語言_16
1.4.2 根據(jù)微信文本內(nèi)容回復消息
import itchat

@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
    reply_text = ''
    if msg.text == "你好":
        reply_text = "不好":
    elif msg.text == "你是誰":
        reply_text = "你好,我是悅創(chuàng)。"
    else:
        reply_text = "哦"

    return reply_text

itchat.auto_login()
itchat.run()

個人不建議使用 itchat,還是用上一張說的 PC HOOK 方法。

1.5 微信拉黑

一言不合上代碼:

"""
project = 'Code', file_name = 'test', author = 'AI悅創(chuàng)'
time = '2020/4/18 14:26', product_name = PyCharm
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
"""
import itchat
import time

itchat.auto_login(hotReload=True)  # 熱加載

print('檢測結果可能會引起不適。')
print('檢測結果請在手機上查看,此處僅顯示檢測信息。')
print('消息被拒收為被拉黑, 需要發(fā)送驗證信息為被刪。')
print('沒有結果就是好結果。')
print('檢測1000位好友需要34分鐘, 以此類推。')
print('為了你的賬號安全著想,這個速度剛好。')
print('在程序運行期間請讓程序保持運行,網(wǎng)絡保持連接。')
print('請不要從手機端手動退出。')
input('按ENTER鍵繼續(xù)...')

friends = itchat.get_friends(update=True)
lenght = len(friends)

for i in range(1, lenght):
    # 所以迭代從除去自己后的第二位好友開始 range(1, lenght)。
    itchat.send("? ? ?", toUserName=friends[i]['UserName'])
    print(f'檢測到第{i}位好友: {str(friends[i]["NickName"]).center(20, " ")}')
    # 發(fā)送信息速度過快會被微信檢測到異常行為。
    time.sleep(2)

print('已檢測完畢,請在手機端查看結果。')

itchat.run()

?

本文摘自 :https://blog.51cto.com/a

開通會員,享受整站包年服務立即開通 >