尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python微信机器人实现:Hook技术解析与防撤回、自动加好友实战

发布时间:2026/9/2 6:23:13

资讯中心
01
ARTICLE

Python微信机器人实现:Hook技术解析与防撤回、自动加好友实战

Python微信机器人实现:Hook技术解析与防撤回、自动加好友实战
简介本资源是一个基于Python开发的微信自动化工具集面向有一定编程基础的开发者与自动化需求者解决微信高频操作中的重复性问题如批量加好友、群消息管理、撤回消息捕获等。压缩包共17个文件含8个Python核心脚本实现扫码登录、好友邀请、防撤回监听等功能、6个JavaScript辅助模块可能用于网页端交互或前端展示、2个Markdown文档含项目说明与使用指南及1个JSON配置文件整体仅17KB轻量易部署。目前已有192人学习下载适合希望快速上手微信自动化实践、理解Wechaty等框架集成逻辑的中级Python学习者。读者可直接运行主程序体验自动加友流程结合源码掌握二维码解析、消息监听、群事件响应等关键实现细节并参考配套文档完成个性化定制与合规性适配。1. 项目概述与核心价值最近在整理个人项目时翻出了一个老项目一个基于Python的微信机器人。这个项目打包文件叫“pgj.zip”里面集成了几个当时挺有意思的功能自动通过好友请求、管理微信群消息以及一个我个人觉得最实用的——微信消息防撤回。现在回头看虽然微信的协议和风控策略一直在变但这个项目的设计思路、遇到的坑以及一些“野路子”的解决方案对于想了解客户端自动化、逆向工程或者单纯想搞个“玩具”来提升效率的朋友来说依然有不少参考价值。这不是一个教你“破解”微信的教程而是一个技术实现的思路复盘核心在于理解客户端自动化交互的逻辑和边界。简单来说这个项目就是一个运行在你电脑上的Python脚本它通过某种方式“附着”在你的微信PC客户端上能够监听微信客户端的事件比如收到新消息、好友申请并模拟用户操作进行响应比如自动点击“通过”按钮、拦截撤回指令。它适合那些对Python有一定了解对RPA机器人流程自动化、Hook技术或消息处理感兴趣并且愿意折腾和探索技术边界的开发者。需要明确的是这类工具存在明确的风险包括但不限于账号被封禁、数据安全等问题所以请务必在合规的测试环境如小号中谨慎使用并仅用于学习和技术研究目的。2. 技术方案选型与思路拆解实现一个微信机器人核心在于如何与微信客户端进行交互。市面上主流的技术路线大致有三条每一条都有其优缺点和适用场景。2.1 方案对比Web协议、客户端模拟与内存Hook方案一Web微信协议这是早期最流行的方式。通过抓包分析微信网页版的通信协议用Python模拟登录和收发消息。它的优点是纯Python实现跨平台不依赖特定客户端。但缺点极其致命腾讯早已加强风控网页版登录变得异常困难经常需要扫码且功能受限稳定性很差。对于“自动加好友”、“防撤回”这种深度客户端交互Web协议基本无法实现。因此这个方案在当前环境下几乎不可行。方案二客户端UI自动化使用像pyautogui、pywinauto这样的库直接模拟鼠标键盘操作或者通过识别微信客户端窗口的控件来进行点击、输入。这个方案的思路很“直白”就是做一个看不见的手帮你操作微信。它的优点是实现相对简单不涉及复杂的协议分析理论上能完成所有用户界面上可见的操作。但缺点同样明显效率低下、速度慢、容易被窗口遮挡或分辨率变化影响并且无法实现“防撤回”这种需要拦截底层网络指令的功能。它更适合执行固定的、简单的界面流程。方案三内存Hook/注入这是本项目采用的核心技术路线也是实现“防撤回”等高级功能的唯一途径。它的原理是将我们编写的代码DLL动态链接库注入到微信客户端的进程内存空间中。一旦注入成功我们的代码就成为了微信进程的一部分可以访问其内存数据、调用其内部函数或者拦截其发出的Windows消息和API调用。例如当微信收到一条消息时会调用某个内部函数来显示它当用户撤回消息时也会触发一个特定的函数。通过Hook挂钩这些关键函数我们就能在消息显示前先拿到内容实现防撤回或者在好友申请通知触发时自动调用“通过”函数。这个方案的优点是功能强大、响应速度快、可以实现深度集成。缺点是技术门槛高涉及Windows编程、逆向工程、内存操作不稳定且风险极大。微信客户端的每次更新都可能改变内部函数地址或数据结构导致Hook失效。我们的项目“pgj.zip”正是基于此方案它通常包含一个Python主控脚本以及一个用C/C或ctypes编写的核心Hook模块。2.2 本项目的核心架构设计基于Hook方案整个项目的架构可以拆解为三层注入层负责将核心的Hook模块通常是一个DLL文件加载到微信进程的地址空间。常见的方法有使用CreateRemoteThread远程线程注入或者通过注册全局钩子等方式。这部分通常用C或借助pywin32等库在Python中调用Windows API完成。Hook核心层这是注入的DLL它是项目的“大脑”。它需要完成几项关键工作定位关键函数通过逆向分析找到微信客户端中处理消息接收、消息撤回、好友申请通知等功能的函数地址。这通常需要借助反编译工具如IDA Pro和调试器如x64dbg进行静态和动态分析。安装Hook使用Detours、MinHook等Hook库或者直接编写内联汇编修改函数头部的字节码JMP指令将目标函数的执行流重定向到我们自己的处理函数。业务逻辑处理在我们的处理函数里我们可以读取函数参数其中包含消息内容、发送者等信息决定是放行、修改还是响应。例如在好友申请处理函数中直接返回一个“同意”的指令在消息撤回处理函数中阻止原函数执行并将消息内容保存下来。Python控制与交互层Hook核心层在拦截到数据后需要通过进程间通信IPC将数据传递给Python脚本。常见的方式有命名管道、共享内存、Socket等。Python脚本接收到数据后可以进行更复杂的逻辑判断、记录日志、调用外部API等也可以发送指令给Hook层要求其执行某些操作。这样复杂的业务逻辑和友好的交互界面可以用Python快速开发而高性能、底层的拦截工作由C模块负责。3. 核心功能模块实现细节下面我们深入拆解“自动加好友”、“防撤回”和“群管理”这三个核心功能的具体实现思路和关键代码逻辑。再次强调以下代码为原理性伪代码和思路不可直接运行且需要大量的逆向工程基础。3.1 微信防撤回功能实现防撤回是技术上最有趣的部分。微信的消息撤回本质上是一个客户端向服务器发送撤回指令服务器确认后再向所有接收者客户端发送一个“撤回提示”指令的过程。我们要做的就是在本地客户端收到“撤回提示”指令并执行删除消息动作之前将消息内容保存下来。实现步骤定位撤回函数使用调试器附加到微信进程在聊天窗口撤回一条消息同时监视堆栈调用和内存访问。通常能找到类似RevokeMsg或HandleRevoke的函数。通过反编译工具分析该函数找到其函数指针地址例如假设为0x12345678。编写Hook处理函数我们需要用C/C编写一个函数其签名与原RevokeMsg函数一致。在这个函数里我们首先获取消息的原始内容这通常需要通过函数参数或全局上下文结构体去解析然后将消息内容、发送者、时间等信息通过IPC发送给Python端保存或显示。最关键的一步执行完我们的逻辑后我们不调用原始的RevokeMsg函数或者修改其参数使其无法执行真正的撤回操作。这样消息在本地就不会消失了。安装Hook在DLL被注入后在DllMain或初始化函数中使用Hook库将0x12345678处的函数替换为我们自己的处理函数。// 伪代码示例Hook 撤回函数 // 假设找到的撤回函数签名void __stdcall RevokeMsg(DWORD msgId); void __stdcall MyRevokeMsg(DWORD msgId) { // 1. 根据 msgId 找到内存中对应的消息结构体 MessageStruct* pMsg FindMsgById(msgId); if (pMsg) { // 2. 提取消息内容、发送者等信息 std::string content pMsg-content; std::string sender pMsg-sender; // 3. 通过共享内存或管道发送给Python程序 SendToPython(REVOKE_CAUGHT, sender, content); // 4. 【关键】不调用原函数直接返回消息就不会被撤回 // ::RevokeMsg(msgId); // 注释掉这行或者让原函数无效化 return; } // 如果没找到可以选择放行但通常意味着Hook时机不对 // ::RevokeMsg(msgId); } // 安装Hook void InstallHooks() { // 假设 RevokeMsg 函数地址为 0x12345678 HookFunction((void*)0x12345678, (void*)MyRevokeMsg); }注意实际中消息结构体MessageStruct的定义极其复杂需要通过逆向分析一点点摸索出来包含链表指针、各种标识位等。这一步是最大的技术难点和风险点微信每次更新都可能改变这个结构。3.2 自动通过好友申请功能实现自动加好友的逻辑与防撤回类似但更侧重于“模拟点击”。我们需要找到当好友申请通知弹出时微信调用的那个“显示申请窗口并处理”的函数。实现步骤定位通知处理函数分析当收到好友申请时是哪个函数被调用弹出了那个系统通知或申请窗口。假设找到函数HandleFriendRequest(DWORD requestId, const char* welcomeMsg)。Hook并自动响应在我们的处理函数中直接构造一个“同意”的响应。这可能需要调用微信内部另一个用于同意申请的AcceptFriendRequest(DWORD requestId)函数或者直接修改HandleFriendRequest函数的流程使其在内部直接走向同意的分支。信息过滤为了更智能我们可以将申请者的验证信息welcomeMsg发送给Python端Python脚本可以基于关键词如“技术交流”、“同事”进行正则匹配判断然后返回“同意”或“拒绝”的指令给Hook层。// 伪代码示例自动处理好友申请 int __stdcall MyHandleFriendRequest(DWORD requestId, const char* welcomeMsg) { // 1. 将验证信息发送给Python逻辑层做决策 bool shouldAccept QueryPythonLogic(welcomeMsg); if (shouldAccept) { // 2. 调用微信内部的同意函数 // 需要逆向找到这个函数的地址例如 0x87654321 typedef void (__stdcall *AcceptFunc)(DWORD); static AcceptFunc pAccept (AcceptFunc)0x87654321; pAccept(requestId); // 3. 记录日志 SendToPython(FRIEND_ACCEPTED, welcomeMsg); // 返回一个值让原函数不再弹出窗口 return 1; } else { SendToPython(FRIEND_IGNORED, welcomeMsg); // 返回其他值或调用拒绝函数 return 0; } // 如果不做决策可以调用原函数弹出窗口让用户手动处理 // return OriginalHandleFriendRequest(requestId, welcomeMsg); }3.3 微信群消息监听与管理群管理功能更多是“监听”和“响应”。Hook消息接收的通用函数过滤出群消息然后根据消息内容进行响应。实现步骤定位通用消息接收函数找到一个最底层的、所有消息私聊、群聊、公众号都会经过的函数例如OnRecvMsg(MessageStruct* pMsg)。过滤群消息在pMsg结构体中通常有字段标识消息类型isGroupChat和群IDgroupId。根据这些信息过滤出目标群的消息。关键词响应将消息内容发送到Python端Python脚本可以维护一个关键词-回复的映射表。例如当群里有人发“所有人 开会了”机器人可以自动回复“收到”。或者实现一个简单的“入群欢迎”功能当检测到有新人入群系统消息时自动新人发送欢迎语。消息转发也可以将特定群的重要消息转发到你的私聊或另一个群实现消息聚合。# Python端伪代码示例消息处理逻辑 import json import time from ipc_client import IPCClient # 假设的IPC客户端 class WeChatBot: def __init__(self): self.ipc IPCClient() self.keyword_responses { 签到: 自动签到成功, 天气: 今天晴转多云25℃。, 所有人 开会: 已收到会议通知。 } self.welcome_msg 欢迎新朋友请阅读群公告。 def handle_message(self, msg_type, sender, content, group_idNone): if msg_type GROUP_MSG: print(f[群{group_id}] {sender}: {content}) # 关键词回复 for keyword, response in self.keyword_responses.items(): if keyword in content: self.ipc.send_reply(group_id, response) break # 新人欢迎需解析系统消息 if 加入了群聊 in content: self.ipc.send_reply(group_id, self.welcome_msg) elif msg_type FRIEND_REQUEST: # 自动通过逻辑 if 合作 in content or 同事 in content: self.ipc.send_accept(sender) elif msg_type REVOKE_CAUGHT: print(f[防撤回] {sender} 撤回了消息: {content}) # 可以将撤回消息转发到文件助手里 self.ipc.send_to_filehelper(f{sender}撤回了{content}) def run(self): while True: data self.ipc.receive() # 从Hook层接收数据 if data: self.handle_message(**data) time.sleep(0.1)4. 项目搭建、注入与运行实操这部分是真正的“踩坑”重灾区。即使你有了完整的代码如何让它稳定地跑起来才是最大的挑战。4.1 环境准备与依赖梳理Python环境建议使用Python 3.7-3.9兼容性较好。需要安装的库可能包括pywin32/pypiwin32: 用于调用Windows API进行进程操作、窗口查找等。ctypes: 用于调用C风格的DLL函数。requests/websocket: 如果你计划让Python层与外部服务通信。一个简单的GUI库如tkinter或PyQt5用于做控制面板可选。编译环境核心Hook模块是C DLL你需要Visual Studio建议2017或2019和Windows SDK来编译它。同时需要Hook库如Microsoft Detours官方版需授权或开源的MinHook。将MinHook的源码集成到你的DLL项目中。逆向工具x64dbg动态调试、IDA Pro或Ghidra静态分析、Cheat Engine内存扫描是必备的。这不是Python的范畴但却是项目的基石。4.2 注入流程详解注入是整个项目的启动钥匙。这里介绍一种相对常见的远程线程注入方法但请注意现代杀毒软件和游戏反作弊系统对此非常敏感。# Python端注入伪代码示例 (使用 pywin32) import win32api import win32con import win32process import ctypes def inject_dll(pid, dll_path): 向指定PID的进程注入DLL :param pid: 微信进程的ID :param dll_path: 编译好的Hook DLL的完整路径 # 1. 打开目标进程获取句柄 PROCESS_ALL_ACCESS (0x000F0000 | 0x00100000 | 0xFFF) h_process win32api.OpenProcess(PROCESS_ALL_ACCESS, False, pid) # 2. 在目标进程内存中分配空间用于存放DLL路径字符串 dll_path_bytes dll_path.encode(utf-8) b\x00 arg_address win32process.VirtualAllocEx(h_process, 0, len(dll_path_bytes), win32con.MEM_COMMIT, win32con.PAGE_READWRITE) # 3. 将DLL路径写入目标进程分配的内存中 written ctypes.c_ulong(0) win32process.WriteProcessMemory(h_process, arg_address, dll_path_bytes, len(dll_path_bytes), ctypes.byref(written)) # 4. 获取LoadLibraryA函数的地址它在kernel32.dll中每个进程的地址相同 kernel32 ctypes.windll.kernel32 loadlib_addr kernel32.GetProcAddress(kernel32.GetModuleHandleA(bkernel32.dll), bLoadLibraryA) # 5. 在目标进程中创建远程线程线程函数为LoadLibraryA参数为我们写入的DLL路径地址 thread_id ctypes.c_ulong(0) h_thread kernel32.CreateRemoteThread(h_process, None, 0, loadlib_addr, arg_address, 0, ctypes.byref(thread_id)) # 6. 等待线程执行完毕即DLL加载完成 win32event.WaitForSingleObject(h_thread, -1) # 7. 清理关闭句柄释放内存 kernel32.CloseHandle(h_thread) win32process.VirtualFreeEx(h_process, arg_address, 0, win32con.MEM_RELEASE) win32api.CloseHandle(h_process) print(f[*] DLL注入成功线程ID: {thread_id.value}) # 使用首先找到微信进程PID def find_wechat_pid(): import psutil for proc in psutil.process_iter([pid, name]): if proc.info[name] and WeChat.exe in proc.info[name]: return proc.info[pid] return None if __name__ __main__: wechat_pid find_wechat_pid() if wechat_pid: inject_dll(wechat_pid, rC:\path\to\your\WeChatHook.dll) else: print(未找到微信进程)4.3 Python与Hook层的通信实现注入成功后DLL和Python脚本是两个独立的进程需要通信。命名管道是一个简单高效的选择。DLL端C创建命名管道服务器#include windows.h void CreatePipeServer() { HANDLE hPipe CreateNamedPipe( L\\\\.\\pipe\\WeChatBotPipe, // 管道名称 PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 1, // 最多一个实例 1024, // 输出缓冲区大小 1024, // 输入缓冲区大小 0, // 默认超时 NULL ); ConnectNamedPipe(hPipe, NULL); // 等待Python客户端连接 // ... 后续用WriteFile/ReadFile进行通信 }Python端连接管道客户端import win32pipe import win32file import json class IPCClient: def __init__(self): self.pipe_name r\\.\pipe\WeChatBotPipe self.handle None def connect(self): try: self.handle win32file.CreateFile( self.pipe_name, win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, 0, None ) return True except Exception as e: print(f连接管道失败: {e}) return False def send(self, data_dict): if self.handle: data_str json.dumps(data_dict, ensure_asciiFalse) win32file.WriteFile(self.handle, data_str.encode(utf-8)) def receive(self): if self.handle: try: result, data win32file.ReadFile(self.handle, 1024) return json.loads(data.decode(utf-8)) except: return None5. 避坑指南、风险与伦理考量这是用血泪换来的经验部分比代码本身更重要。5.1 常见问题与排查技巧注入失败微信崩溃原因Hook的函数地址错误DLL依赖的运行时库如VC Redist缺失内存访问越界。排查先用调试器如x64dbg手动注入DLL看是否崩溃。检查DLL是否编译为与微信相同的位数x86/x64。确保Hook库如MinHook初始化成功。在DLL入口点加入大量日志文件输出记录每一步执行情况。Hook成功但无效果原因Hook的时机不对可能在消息处理链的较后位置消息已经被处理了或者函数签名分析错误参数读取不对。排查在目标函数被调用时用调试器下断点观察堆栈和寄存器确认函数参数。尝试Hook更上游的函数。对比微信不同版本函数偏移可能发生变化。Python端收不到管道消息原因管道名称不一致DLL端管道服务器未成功创建或Python端连接时机不对消息格式JSON解析错误。排查确保两边管道名称完全一致注意转义。在DLL注入成功后延迟几秒再让Python去连接。在通信前后加入简单的“握手”协议如DLL先发一个READY字符串。账号被限制或封禁原因行为模式异常如响应速度非人类、24小时在线、频繁操作等被微信风控系统检测到。缓解在Python逻辑中加入随机延迟time.sleep(random.uniform(1, 3))模拟人工操作间隔。避免在短时间内进行大量添加好友或发送消息操作。使用低活跃度的“小号”进行测试。5.2 安全与合规风险警示账号风险这是最大的风险。使用此类机器人严重违反微信用户协议一旦被检测到轻则功能限制如无法加人、拉群重则永久封号。务必使用没有任何重要联系人和数据的备用账号进行测试。法律风险如果你的机器人用于非法用途如诈骗、传播恶意信息、骚扰他人等你将承担相应的法律责任。技术本身无罪但用途决定性质。技术风险Hook技术本身不稳定。微信几乎每月都有更新每次更新都可能让之前的偏移地址和数据结构失效导致项目“猝死”。维护成本极高。安全风险你注入的DLL拥有和微信进程相同的权限。如果DLL代码有漏洞或者你从不可信的来源获取了编译好的DLL可能导致你的电脑被植入恶意软件窃取微信本地加密的聊天记录、钱包信息等。5.3 替代方案与未来方向鉴于上述风险对于有合法自动化需求的用户如社群管理、客服辅助可以考虑以下更安全、更可持续的替代方案企业微信/微信开放平台对于企业和开发者微信官方提供了丰富的API接口用于消息收发、用户管理、应用开发等。这是唯一合规且稳定的途径。桌面自动化框架对于轻度、固定的操作使用pyautogui、airtest等基于图像识别和控件识别的自动化工具虽然效率低但完全不触及微信进程内存风险小很多。协议逆向的合规思考纯粹出于学习目的可以在本地搭建测试环境分析自己与自己的通信并止步于学习。切勿将逆向成果用于干扰官方服务或侵犯他人权益。这个“pgj.zip”项目更像是一个技术考古样本它展示了在特定时期开发者们如何利用技术手段探索客户端软件的边界。它的核心价值不在于其代码本身很可能已过时而在于其体现出的问题拆解、逆向思维和系统集成能力。对于学习者而言理解其架构和原理远比尝试运行它更有意义。在动手之前请务必权衡好奇心、学习成本与潜在风险。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。