微信插件开发实战:用WeChatTweak-macOS实现消息防撤回功能
你是否曾因错过重要的撤回消息而困扰?是否想学习如何通过Hook技术扩展微信功能?本文将以WeChatTweak-macOS项目为例,带你从零开始理解macOS平台下的微信插件开发,重点解析消息防撤回功能的实现原理与关键技术点。
项目概述
WeChatTweak-macOS是一款针对微信macOS客户端的增强工具,采用动态库注入(Dynamic Library Injection)方式实现功能扩展。该项目的核心文件结构如下:
- 核心功能实现:WeChatTweak/
- 防撤回模块:WeChatTweak/AntiRevoke.m
- 多开功能:WeChatTweak/MultipleInstances.m
- 界面设置面板:WeChatTweak/Controller/
Hook技术基础
在macOS平台上,插件开发常使用Method Swizzling(方法交换)技术,这是一种Objective-C运行时特性,允许我们动态替换类的方法实现。WeChatTweak-macOS项目正是通过这种技术实现对微信客户端的功能增强。
方法交换核心代码
在AntiRevoke.m中,我们可以看到方法交换的典型实现:
static void __attribute__((constructor)) tweak(void) {
[objc_getClass("FFProcessReqsvrZZ") jr_swizzleMethod:NSSelectorFromString(@"DelRevokedMsg:msgData:")
withMethod:@selector(tweak_DelRevokedMsg:msgData:)
error:nil];
}
这段代码在动态库加载时执行,将微信客户端中负责处理消息撤回的DelRevokedMsg:msgData:方法替换为我们自定义的tweak_DelRevokedMsg:msgData:方法。
消息防撤回功能实现
拦截撤回请求
防撤回功能的核心在于拦截并修改微信的撤回消息处理流程。在AntiRevoke.m中,自定义的处理方法如下:
- (void)tweak_DelRevokedMsg:(NSString *)session msgData:(MessageData *)messageData {
if (messageData.isSendFromSelf) {
// 允许自己撤回消息
[self tweak_DelRevokedMsg:session msgData:messageData];
} else {
// 拦截他人撤回消息
messageData.mesSvrID = messageData.mesLocalID;
[((FFProcessReqsvrZZ *)self) ModifyMsgData:session msgData:messageData];
dispatch_async(dispatch_get_main_queue(), ^{
[((FFProcessReqsvrZZ *)self) notifyDelMsgOnMainThread:session msgData:messageData isRevoke:YES];
[((FFProcessReqsvrZZ *)self) notifyAddMsgOnMainThread:session msgData:messageData];
});
}
}
这段代码实现了一个关键逻辑:当检测到他人发送的撤回请求时,我们不执行删除操作,而是修改消息ID并重新添加该消息,从而实现"防撤回"效果。
消息通知与UI展示
除了拦截撤回操作,我们还需要向用户展示撤回通知。AntiRevoke.m中实现了系统通知的发送:
NSUserNotification *userNotification = [[NSUserNotification alloc] init];
userNotification.title = [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Title.Recalled"];
userNotification.informativeText = messageData.msgContent;
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];
同时,项目还修改了消息单元格的UI展示,在被撤回消息旁添加标识:
NSTextField *revokeTextField = [[NSTextField alloc] init];
revokeTextField.stringValue = [NSBundle.tweakBundle localizedStringForKey:@"Tweak.Message.RecalledMark"];
revokeTextField.font = [NSFont systemFontOfSize:7.0];
revokeTextField.textColor = [NSColor lightGrayColor];
开发环境搭建
编译与安装
WeChatTweak-macOS项目使用Makefile进行构建,通过以下命令即可编译安装:
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/we/WeChatTweak-macOS
# 进入项目目录
cd WeChatTweak-macOS
# 编译并安装
make && sudo make install
开发工具推荐
- Xcode:Objective-C代码编辑与调试
- Hopper Disassembler:分析微信客户端二进制文件
- class-dump:导出微信客户端头文件
功能扩展实践
除了防撤回功能,WeChatTweak-macOS还实现了多种实用功能,如:
- 客户端无限多开:MultipleInstances.m
- 消息处理增强:ContextMenu.m
- Alfred workflow支持:WeChat.alfredworkflow
- Launchbar action支持:WeChatTweak.lbaction/
这些功能模块都采用了类似的Hook技术实现,通过分析这些代码,你可以举一反三,开发出更多个性化功能。
注意事项
- 版本兼容性:微信客户端更新可能导致Hook失效,需要及时适配新的类名和方法名
- 安全性:动态库注入可能被杀毒软件误报,请确保从官方渠道获取代码
- 合规性:开发插件时请遵守相关法律法规,尊重软件使用协议
总结
通过WeChatTweak-macOS项目,我们展示了如何利用Objective-C的Method Swizzling技术实现对微信客户端的功能扩展。核心步骤包括:
- 识别目标方法:通过逆向工程找到需要Hook的类和方法
- 实现方法交换:编写自定义方法替换原方法实现
- 添加新功能逻辑:在自定义方法中实现增强功能
- 处理UI展示:必要时修改界面元素以反映新功能
希望本文能帮助你理解macOS平台下的插件开发技术。如果你对项目有任何改进建议,欢迎提交PR参与贡献。
学习资源
- 项目官方文档:README.md
- 开发指南:CONTRIBUTING.md
- 命令行工具:WeChatTweak-CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




