内容简介

微信自动回复插件,基于 Xposed 开发,可以给女朋友一个聊天机器人,她再也不会打扰我们敲代码了!

前介

现如今最常用的社交工具是什么呢?必然是 微信 ,不得不说现在的微信不在简简单单是一个社交程序,它已经和我们生活紧密相关了。

做为一个程序员?最重要的是什么呢?

我认为做为一个程序员最重要的是

但是做为一个程序员进程没日没夜的敲代码,经常没有时间回复女朋友的微信或者 尬聊

我做为一个资深的程序员,怎么能被这种小挫折打败呢?我们要用程序的去维护我们的 娇妻因此我要开发一款自动回复女朋友消息的微信插件。

你的 娇妻 再也不能打断你 打游戏 丶 敲代码丶 风流快活 ,让你的 娇妻 和机器人聊吧(维护家庭和谐)!

确定目标

  1. 自动回复高情商话术

  2. 微信无感知回复,在后台也不能遗漏回复

  3. 开关设置,能指定自动回复的娇妻

  4. 热修复,兼容多版本微信

  5. 找到女朋友

方案定制

我个人习惯,再开发之前,先做准备。把思路屡清楚事半功倍。

自动回复高情商话术

我的第一想法是先去下载类似 恋爱话术 的 App ,然后逆向其接口,接入我们的程序。

本人下载了将近 10 款这种类型的应用,最终都发现收费很贵,并且话术都不是很全,最后放弃了。

然后找到了 图灵机器人 ,提供完整的聊天机器人 API,并且话术还是很精湛的,因此果断注册开发者账号。

微信无感知回复,在后台也不能遗漏回复

这种没有很好的办法,因为要想在后台回复,只能想办法向微信注入我们的代码(也就是说我们的代码要在微信的进程中运行,在专业点就是我们要想办法拿到微信的 ClassLoader)。

我的方案还是使用 Xposed 框架 + 分身大师 实现免 Root 注入。

如何开发 Xposed 插件,请参看本人文章 查看链接

开关设置,能指定自动回复的娇妻(我们的娇妻可不止一个)

逆向分析微信的聊天界面,找一个合适的地方,通过 Xposed 注入一个开关按钮。这个难点是分析微信代码,并且寻找到的 Hook 代码尽量保证版本兼容(我不希望微信版本更新,就要重新发布或安装插件)。

这里补充下,为啥要 Hook 点尽量保证版本兼容呢?其实说白了就是寻找微信没有混淆的点做入口。为啥呢?因为一旦微信版本升级,肯定会再次混淆。若你 Hook 点是混淆的,那若微信版本升级,若要兼容新版本必定要从新寻找混淆后新的 Hook 点(我们可不得不到微信混淆后的 mapping 文件)。

热修复,兼容多版本微信

在第 3 点我讲过,尽量寻找没有混淆的点做 Hook,但是若死活寻找不到没有混淆的 Hook 点呢?我们只能想办法进行动态修复插件了,让用户无感知使用,我提供的方案是通过 DexClassLoader 去修复 Hook 点代码。
这套技术方案我在曾经在我的项目 微信语音助手 使用过(以停止维护),具体方案看下图。

找到女朋友

若有女程序员看到这里 

开始敲代码

都准备好啦,接下来我们开始 

对接图灵机器人

这个没啥好说的就是去注册账号,查看提供的API文档

搭建 Xposed 项目

首先在项目 build.gradle 加入依赖。

dependencies {...compileOnly 'de.robv.android.xposed:api:82'compileOnly 'de.robv.android.xposed:api:82:sources'...
}

注意一定要用 compileOnly 依赖。为啥呢?大家可以自行去看下 Xposed 的原理。我这里就叙述这个问题了,不再本文范畴。

接下来创建上图中所提到的入口类。

class XpCore : IXposedHookLoadPackage {override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {MMCoreHook.hook(lpparam)}
}

寻找消息 Hook 点

其实寻找 Hook 点就是一个细心的活,我们要在微信的代码海中去寻找合适的 Hook 点,寻找尽量没有混淆的 Hook 点。

如何能快速找到呢?由于文章篇幅问题,请 参考 鄙人文章。

object MsgHook {fun hook(actvity: Activity) {hookFun({if (TextUtils.equals("message", it.args[0].toString())) {try {val contentValues = it.args[2] as ContentValuescontentValues.apply {val msgSvrId = getAsString("msgSvrId")if (TextUtils.isEmpty(msgSvrId)) {return@hookFun}val talker = getAsString("talker")val type = getAsString("type")val content = contentValues.getAsString("content")Core.msgGo(talker, type, content, actvity)}} catch (e: Exception) {e.printStackTrace()Core.toast("消息拦截失败!!")}}},{},"com.tencent.wcdb.database.SQLiteDatabase",actvity.classLoader,"insert",String::class.java,String::class.java,ContentValues::class.java)}
}

寻找开关Hook点

前面说我们只想守护我们自己的 娇妻 所以需要一个开关,我可不想所有人都自动回复,更不想和一个男的暧昧,更重要的是 图灵机器人 收费啊。

最终通过不断的断点,分析,看源码,找到了一个非常好的 Hook 点。这个流程非常的长,我就不细讲了。具体如何逆向丶断点丶分析代码教程可以 参考 此文章。

部分核心代码,如下:

object ViewHook {fun hook(actvity: Activity) {log("view Hook开始")hookFun({}, {val viewGroup = it.thisObject as ViewGroupval wxId = it.args[0] as StringCore.addClickView(viewGroup, wxId)}, "com.tencent.mm.pluginsdk.ui.chat.ChatFooter", actvity.classLoader,"setUserName",String::class.java)}
}

来看看效果:

是否打开守护状态的数据,我使用的是 GreenDao 来进行存储的。我挺喜欢这个数据库框架的哦。

回复消息

我们已经通过 Xposed 将我们的代码注入到微信当中了,并且获取到了微信的 ClassLoader。有 ClassLoader 我们当然能通过反射去调用微信的方法啦。

这又是一个很长很长的过程,我就不叙述了,反正就是逆向丶断点丶分析。

我的 张美丽丶李花丶杨柳絮又离我而去了。

在分析过程中我一直想寻找没有混淆的发消息 Hook 点,我找了很久,也想尽了所有的办法,包括构造上面的开关按钮 Hook 点 ChatFooter 对象,通过调用 View 的方法。

我这里就跑题下,我当时想寻找到一个合适的微信发消息的 Hook 点(没有混淆的点),顺便给大家分享下我当时巧夺天工的想法 

我们前面分析到了 ChatFooter 对象,他是一个 FrameLayout,提示这个布局就是我们聊天的布局,如下图:

思路很简单,我通过遍历 View 寻找到消息输入框,然后调用 setText 设置文本,然后在寻找 发送 按钮,在调用其 performClick 方法。

然后查看微信 ChatFooter 源码,在其构造方法中看到了。

接下来寻找发送消息按钮,我是通过搜索 setOnClickListener 方法,搜索到的。

接下来只需要递归遍历,寻找到消息输入框的 View 对象。

/*** 递归遍历寻找 微信输入框 EditText 对象*/private fun findMsgEditText(view: View): EditText? {if (view is EditText) {return view} else {if (view is ViewGroup) {for (index in 0 until view.childCount) {val editText = findMsgEditText(view.getChildAt(index))if (editText != null) {return editText}}}}return null}

在开发过程中我发现个优化点,现在我们是通过递归查找到了,输入框 EditText 对象,本来还需要通过递归查找发送按钮的 View 对象,这样效率有点低,但是突然我想到了输入框,按回车也能发消息,因此从新去看了下微信代码,如下图:

啊哈哈,更能确定我的 View 对象是对的,然后就是通过反射获取到了 EditText 对象的 OnEditorActionListener 对象,然后调用了 onEditorAction 方法(由于无效,代码删除了,找不到了),这样如果能成功,我们的 护妻宝 就能兼容所有微信版本啦,也不用做什么热修复啦,好开心测试下。

既然无效,不应该啊。接下里我断点看了下,发送按钮的点击事件方法。

一直到我看到 ChatFooter 的这个方法。

死的心都有了,这个 xTi 对象又被混淆了,还是不行啊!回头我又想了想,腾讯微信这种大厂怎么可能将 View 层和逻辑层代码写在一起呢?

最终这种方案我还是放弃了,花费了这么长的篇幅讲这个,只是给大家提供一个思路,有时候我们可以通过这种手段去 Hook ,虽然微信不适用不代表,其他应用不适用,我曾经分析过 FacebookMessenge聊天工具就用的这种方案。

最终我还是没找到,没混淆的发消息方法。

/*** hook 发消息方法*/
private fun receiverMsg(activity: Activity, msg: String, talker: String) {val azClzz = XposedHelpers.findClass("com.tencent.mm.model.az", activity.classLoader)val obj = XposedHelpers.callStaticMethod(azClzz, "ZS")val msgClzz = XposedHelpers.findClass("com.tencent.mm.modelmulti.h", activity.classLoader)XposedHelpers.callMethod(obj, "b", XposedHelpers.newInstance(msgClzz, talker, msg, 1))
}

若有有能人,能找到没有混淆的发消息的 Hook(尽量兼容所有版本的),并且愿意无私提供给我,请留言哦。

热修复

其实我们大部分工作完成了,但是热修复还需要很多注意点。由于篇幅问题(代码还没写,哈哈)。

但是我们方案有了,其实大家也应该看我代码注意到,我在构建代码的时候,已经将核心的注入方法都抽取在了 Core 类,为了就是将来热修复方便。

总结

首先由于 图灵机器人 开发者账号,没审核下来(审核2天了)。我暂时没有集成,只是到收到 娇妻 信息后,自动回复 你好可爱哦

当前效果

补充

由于作者分析的微信版本是 7.0.7,等软件完成后在兼容最新版本微信,若想测试,可以安装微信 7.0.7 版本测试哦。

我是用我公司的 360分身大师X版 做的免 Root 使用 Xposed(微信版本是7.0.7哦)。

代码仓库:https://github.com/makeloveandroid/ProtectLove

参考资料:

图灵机器人 
http://www.turingapi.com/

Xposed插件开发
https://wenyingzhi.com/mu-lu-3/android-ni-xiang-fen-xiang

微信语音助手
https://wenyingzhi.com/mu-lu-3/wei-xin-yu-yin-zhu-shou

图灵机器人Api文档
http://docs.turingos.cn/

Android逆向技巧
https://wenyingzhi.com/mu-lu-3/android-ni-xiang-shi-zhan-zhi-mo-mo-miao-qiang-hong-bao

360分身大师X版
https://a.app.qq.com/o/simple.jsp?pkgname=com.qihoo.magic.xposed

--END--

识别二维码,关注我们

微信插件第一讲之自动回复机器人(护妻宝)相关推荐

  1. 微信插件之护妻宝(微信自动回复机器人)1

    前介 更多精彩文章,点这里 现如今最常用的社交工具是什么呢?必然是 微信 ,不得不说现在的微信不在简简单单是一个社交程序,它已经和我们生活紧密相关了. 做为一个程序员?最重要的是什么呢? 我认为做为一 ...

  2. python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器)

    python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器) 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关 目录 python实现微信自动回复机器人+查看别 ...

  3. 微信公众号后台java开发实现自动回复机器人

    1.注册微信公众号.(简单) 2.注册图灵机器人.(自己百度) 1)注册后可以拿到key  (注意  api接入里的钥匙不要打开,否则要加解密,麻烦) 3.配置微信公众号服务器验证. 1)在开发的基本 ...

  4. Python从编程零基础打造一款微信聊天自动回复机器人

    本教程的作用 零基础手把手教你打造一款微信自动回复机器人,零基础! 操作流程: 第一步:安装python环境,下载链接,下载好,一路next,默认安装. 第二步:打开命令行,(快捷键win(那个键上有 ...

  5. php微信自动回复机器人,微信自动回复机器人功能怎么实现?

    原标题:微信自动回复机器人功能怎么实现? 微信自动回复机器人功能怎么实现?最近有不少小伙伴都在询问这个问题.很多人在微信营销的过程中,都会有这样的问题,微信好友太多,想要都在第一时间回复,实在没有精力 ...

  6. python 微信自动回复机器人_python实现微信自动回复机器人+查看别人撤回的消息(部署到云服务器)...

    前言首先你的微信号能够登录网页版微信,才能打造你的专属个人微信号机器人,点击跳转网页版微信登录页面 类似的文章网上也都有,其实我也是受到别的文章的一些启发,因为不是每个人都想实现同样的功能的,直接套用 ...

  7. python实现微信机器人: 登录微信、消息接收、自动回复功能

    这篇文章主要介绍了python实现微信机器人: 登录微信.消息接收.自动回复功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ...

  8. python 贴吧自动回复机-Python实现微信自动回复机器人详细教程

    首先,我们需要安装并配置好Python环境,并安装requests和itchat包,我用的是Windows7环境! https://www.python.org/ python官网 下载 然后直接打开 ...

  9. python 贴吧自动回复机-python_库学习_02_微信自动回复机器人

    一.python发展的趋势日益庞大,微信也有对应的库itchat.这次的实例做做成可在任意电脑运行的微信自动回复机器人exe.文件. 二.完成这个小应用我们需要装一些库,, itchat:这个东东不出 ...

最新文章

  1. Python3 的urllib实例
  2. spring解决ajax跨域问题
  3. Java服务CPU飙到99%问题排查
  4. ABP入门系列(1)——通过模板创建MAP版本项目
  5. 用HashMap去重
  6. java动态代理原理
  7. 3d打印机 form3_桌面SLA卖掉5万台后,Formlabs发布新机型Form3和Form 3L
  8. python 保证所有数据能够显示,而不是用省略号表示,不以科学计数显示
  9. linux界面如何进行文档排序,Linux中使用sort对文档中的内容进行排序
  10. Java魔法堂:JVM的运行模式
  11. c语言设计 教师信息管理系统 含源码及说明
  12. ps模糊照片变清晰步骤东方逐梦
  13. gnuplot的常用技巧
  14. UE4 Shader 着色器概述
  15. css中设置body字体,css如何设置body字体颜色
  16. iOS学习-判断日期是周几
  17. CobaltStrike之Beacon命令使用
  18. 我的java学习之路之Spring MVC
  19. 1-3分钟教你如何开通微信支付0.2%费率,适用于公众号小程序和收款码
  20. QPS\TPS指的是什么?怎样测试一个接口得QPS

热门文章

  1. oracle dba 有哪些权限,Oracle DBA应知应会 -- 权限管理
  2. 模拟163邮箱登录钓鱼PHP源码,分享一个curl模拟网易163邮箱登录实例
  3. centos7部署openwhisk
  4. 怎样查阅java的api文档_【java基础(十)】查阅API文档
  5. 老板:你们和外包有什么区别?
  6. 各互联网大厂工程师薪资新鲜出炉,速来围观!
  7. 第七章-复用类-继承语法-1
  8. 构建module遇到pom报错Parent 'Unkown:Unkown:Unkown' has problems
  9. 安装QT5 出现错误 unkown type name ‘QApplication’ unkown type name ‘MainWindow’
  10. textView 的设置文本中某一文字的字体颜色以及图文混排