微信插件开发实战:用WeChatTweak-macOS实现消息防撤回功能

微信插件开发实战:用WeChatTweak-macOS实现消息防撤回功能

【免费下载链接】WeChatTweak-macOS A dynamic library tweak for WeChat macOS - 首款微信 macOS 客户端撤回拦截与多开 🔨 【免费下载链接】WeChatTweak-macOS 项目地址: https://gitcode.com/gh_mirrors/we/WeChatTweak-macOS

你是否曾因错过重要的撤回消息而困扰?是否想学习如何通过Hook技术扩展微信功能?本文将以WeChatTweak-macOS项目为例,带你从零开始理解macOS平台下的微信插件开发,重点解析消息防撤回功能的实现原理与关键技术点。

项目概述

WeChatTweak-macOS是一款针对微信macOS客户端的增强工具,采用动态库注入(Dynamic Library Injection)方式实现功能扩展。该项目的核心文件结构如下:

功能概览

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还实现了多种实用功能,如:

这些功能模块都采用了类似的Hook技术实现,通过分析这些代码,你可以举一反三,开发出更多个性化功能。

注意事项

  1. 版本兼容性:微信客户端更新可能导致Hook失效,需要及时适配新的类名和方法名
  2. 安全性:动态库注入可能被杀毒软件误报,请确保从官方渠道获取代码
  3. 合规性:开发插件时请遵守相关法律法规,尊重软件使用协议

总结

通过WeChatTweak-macOS项目,我们展示了如何利用Objective-C的Method Swizzling技术实现对微信客户端的功能扩展。核心步骤包括:

  1. 识别目标方法:通过逆向工程找到需要Hook的类和方法
  2. 实现方法交换:编写自定义方法替换原方法实现
  3. 添加新功能逻辑:在自定义方法中实现增强功能
  4. 处理UI展示:必要时修改界面元素以反映新功能

希望本文能帮助你理解macOS平台下的插件开发技术。如果你对项目有任何改进建议,欢迎提交PR参与贡献

学习资源

【免费下载链接】WeChatTweak-macOS A dynamic library tweak for WeChat macOS - 首款微信 macOS 客户端撤回拦截与多开 🔨 【免费下载链接】WeChatTweak-macOS 项目地址: https://gitcode.com/gh_mirrors/we/WeChatTweak-macOS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值