目标
当前微信网页版限制越来越多,考虑尝试在手机上实现类似机器人的功能。本文目的是利用 Xposed 快速实现简易机器人功能,包括获取好友发来的消息,以及回复消息。后续可以增加智能回复,比如接入图灵机器人,或者自己自定义实现一些功能。
快速实现
项目框架的搭建
WechatSpellbook - 站在”巨人”的肩膀上
WechatSpellbook 是微信巫师作者在微信巫师的基础提取出来的通用微信 Xposed 插件框架。它提供了友好的的 API,提供自动分析微信内部结构特征的API(忽略微信版本差异),对 hook 微信出现的常见问题都做了优化,总之就是使用它会更容易对微信 hook,感谢作者的贡献,项目的集成和详细介绍参见wiki,以下步骤的实现都是基于这个框架的。
以下源码均基于微信 6.6.6 版本,由于使用了 WechatSpellbook 框架动态匹配的原理,大部分微信版本均可自动适配。
获得好友发来的消息
实现机器人功能的首要步骤就是获得好友发来的消息,获得消息之后才能回复吧,才能叫“机器人”吧。
使用了 WechatSpellbook,获取消息是很容易的,参见api,当新消息存入数据库后回调,具体代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
object WechatMessageHook : IMessageStorageHook { override fun onMessageStorageInserted(msgId: Long, msgObject: Any) { XposedBridge.log("onMessageStorageInserted msgId=$msgId,msgObject=$msgObject") // 这些都是消息的属性,内容,发送人,类型等 val field_content = XposedHelpers.getObjectField(msgObject, "field_content") as String? val field_talker = XposedHelpers.getObjectField(msgObject, "field_talker") as String? val field_type = (XposedHelpers.getObjectField(msgObject, "field_type") as Int).toInt() val field_isSend = (XposedHelpers.getObjectField(msgObject, "field_isSend") as Int).toInt() XposedBridge.log("field_content=$field_content,field_talker=$field_talker," + "field_type=$field_type,field_isSend=$field_isSend") |