首页 > 编程知识 正文

聊天回复神器在线版,微信怎么设置机器人回复

时间:2023-05-03 06:08:52 阅读:51172 作者:2830

前介绍更精彩的文章,点击这里

现在最常用的社交工具是什么? 必然是微信。 不得不说,现在的微信不是简单简单的社交项目,而是与我们的生活密切相关。

作为程序员? 最重要的是什么?

作为程序员,最重要的是

但是,作为一个程序员,如果你在深夜里敲代码,往往没有时间回复她的微信和尴尬的故事。

作为一个资深的程序员,怎么能输给这么小的挫折呢? 因为我们要在程序上保持我们踏实的心锁,所以我会开发一个自动回复她的消息的微信插件。

你坚定的心钥匙再也不能中断你玩游戏丶编码丶风流愉快。 让你坚定的心钥匙和机器人说话吧。 (维护家庭和谐)!

决定目标

无法感知自动回复高情商对话的微信,后台也不能错过回复开关的设置。 可以指定自动回复的踏实红桃(我们踏实的红桃有多个)热修复补丁与多版本的微信兼容,找到她的方案定制我的个人习惯,在重新开发之前做准备。 多次明确想法会提高工作效率。

自动回复高情人话术我的首要想法是,先下载类似爱情话术的APP,然后反转那个界面,进入我们的程序。

我下载了近10种这种类型的APP,最终发现费用很高,而且说话技巧不够,最后放弃了。

然后找到图灵机器人,提供完整的聊天机器人API,说话技巧也很好,所以果断注册了正在开发的账户。

微信会议,后台也不能回复。 因为要在后台回复,只能通过向微信会议注入我们的代码。 换句话说,我们的代码在微信会议过程中运行,从专业角度来说,这是获取微信会议类加载器的方法。

我的方案还是使用Xposed框架分身主机实现无路由注入。

有关如何开发Xposed插件的信息,请参阅本人的文章参考链接

安装开关,可以指定自动回复的踏实的心锁(我们踏实的心锁可以有多个) )反向分析微信聊天界面,找到合适的地方,用Xposed注入开关按钮。 这个难点是分析微信代码,找到的Hook代码尽量保证版本兼容性。 如果不希望更新微信版本,则必须重新发布或安装插件。

在此补充。 为什么Hook点需要尽量保证版本的兼容性? 其实说白了,就是找微信没有混淆的地方做入口。 为什么? 因为微信版本升级后,肯定会再次混淆。 如果您的Hook点混淆了,并且微信版本升级了,则必须找到混淆的新Hook点才能与新版本兼容。 我们必须得到微信混淆的映射文件。

热修复补丁,支持多个版本的微信,在第三点上说了,尽量找不混的点做Hook,如果找不到死活不混的Hook点呢? 只能想办法动态修复插件,以免用户意识到。 我提供的方案是用DexClassLoader修复Hook积分代码。

这个技术方案在我项目的微信语音助手中使用过。 具体方案请看下图。

如果找到她,女程序员看到这里

准备好敲代码了。 现在开始吧

我对图灵自动机一无所知的是注册帐户并查看提供的API文档

要生成Xposed项目,请首先将依赖关系添加到项目build.gradle中。

ependencies {.compile only ' de.robv.Android.x posed : API :82 ' compile only ' de.robv.Android.x posed 3360 大家可以自己去看Xposed的原理。 我在这里提到了这个问题,所以不做这篇文章的范畴。

接下来,创建上图中介绍的条目类。

classxpcore : ixposedhookloadpackage { overridefunhandleloadpackage (lpparam : xc _ load package.loadpackageparam ) m mackage 寻找托特是一项细心的工作,我们在微信的码海中寻找合适的Hook点,尽量寻找不会混淆的Hook点。

怎样才能尽快找到? 在文章的篇幅问题上,请参考小学生的文章。

objectmsghook(funhook ) act vity : activity (hook fun ) if (textutils.equals )、it.args[0].tostrrags

ntentValues.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 ViewGroup val wxId = it.args[0] as String Core.addClickView(viewGroup, wxId) }, "com.tencent.mm.pluginsdk.ui.chat.ChatFooter", actvity.classLoader, "setUserName", String::class.java ) }}

来看看效果:

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

回复消息

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

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

我的 mdds丶李花丶杨柳絮又离我而去了。

在分析过程中我一直想寻找没有混淆的发消息 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 ,虽然微信不适用不代表,其他应用不适用,我曾经分析过 Facebook Messenge聊天工具就用的这种方案。

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

/** * 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哦)。

代码仓库

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。