【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。
接上篇,使用Xposed来hook微信,找到微信进程:https://blog.csdn.net/weixin_42127613/article/details/81839537
既然已经找到了微信进程,那么就可以对微信的数据进行拦截获取了。
hook到微信的聊天消息,比较简单,只需要hook住数据库的插入方法即可。
因为一旦来了新消息,微信就会往本地数据库插入聊天消息,将聊天消息保存到本地。所以我们只要hook住消息的插入动作,就能实时的获取到聊天消息。
微信的数据库操作有很多类和实例,但最终都是调用了com.tencent.wcdb.database.SQLiteDatabase这个类。
插入方法用的是insert,insert内部又调用了insertWithOnConflict方法。我们可以hook住insert方法,也可以hook住insertWithOnConflict方法。
我们采用hook最终方法吧。hook这个insertWithOnConflict方法。
反编译微信,去查看com.tencent.wcdb.database.SQLiteDatabase这个类的insertWithOnConflict方法,看看都有什么参数,才能编写hook代码。如下图所示,有4个参数。
现在编写hook代码。在MainXposed中新建一个方法hookDatabaseInsert,进行hook。
//hook数据库插入操作
private void hookDatabaseInsert(final XC_LoadPackage.LoadPackageParam loadPackageParam) {
Class<?> classDb = XposedHelpers.findClassIfExists(WECHAT_DATABASE_PACKAGE_NAME, loadPackageParam.classLoader);
if (classDb == null) {
XposedBridge.log("hook数据库insert操作:未找到类" + WECHAT_DATABASE_PACKAGE_NAME);
return;
}
XposedHelpers.findAndHookMethod(classDb,
"insertWithOnConflict",
String.class, String.class, ContentValues.class, int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("HOOK住微信数据库插入操作。");
}
});
}
在主函数handleLoadPackage方法中加入调用,如下代码。
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.processName.equals(WECHAT_PROCESS_NAME)) {
return;
}
XposedBridge.log("进入微信进程:" + lpparam.processName);
//调用 hook数据库插入。
hookDatabaseInsert(lpparam);
}
现在开始执行,测试,查看日志。如下图所示,发现了很多数据库操作。
为了能清晰的查看消息。我们过滤掉非聊天消息的插入动作,同时将聊天消息的内容解析出来。
微信的新聊天消息,会插入2个表:message和rconversation。
message表:消息内容总表。所有的聊天消息,都会存入到这个表。
rconversation表:当前的会话表。就是进入微信,在主界面看到的列表。这个表保存的是最后一条聊天记录,每次有新消息,都会更新这个表。
我们hook这2个表中的任意一个都可以,但是rconversation表不仅有insert,还有update操作,所以我们还是只取message表即可。
为了能输出数据库的插入数据,我们特意定义一个函数printInsertLog,用于输出数据库插入日志。
//输出插入操作日志
private void printInsertLog(String tableName, String nullColumnHack, ContentValues contentValues, int conflictValue) {
String[] arrayConflicValues =
{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
if (conflictValue < 0 || conflictValue > 5) {
return;
}
XposedBridge.log("Hook数据库insert。table:" + tableName
+ ";nullColumnHack:" + nullColumnHack
+ ";CONFLICT_VALUES:" + arrayConflicValues[conflictValue]
+ ";contentValues:" + contentValues);
}
改进代码,去掉之前的日志输出,过滤掉非聊天消息表,输出消息日志。现在hookDatabaseInsert的代码为:
//hook数据库插入操作
private void hookDatabaseInsert(final XC_LoadPackage.LoadPackageParam loadPackageParam) {
Class<?> classDb = XposedHelpers.findClassIfExists(WECHAT_DATABASE_PACKAGE_NAME, loadPackageParam.classLoader);
if (classDb == null) {
XposedBridge.log("hook数据库insert操作:未找到类" + WECHAT_DATABASE_PACKAGE_NAME);
return;
}
XposedHelpers.findAndHookMethod(classDb,
"insertWithOnConflict",
String.class, String.class, ContentValues.class, int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
String tableName = (String) param.args[0];
ContentValues contentValues = (ContentValues) param.args[2];
if (tableName == null || tableName.length() == 0 || contentValues == null) {
return;
}
//过滤掉非聊天消息
if (!tableName.equals("message")){
return;
}
//打印出日志
printInsertLog(tableName, (String) param.args[1], contentValues, (Integer) param.args[3]);
}
});
}
编译、运行、重启,查看日志。没有日志输出,那么给当前的微信号,发送一条消息试试看。如下图所示,已经成功的获取到了聊天消息。
查看日志详情,可以看到插入的contentValues数据内容。
Hook数据库insert。table:message;nullColumnHack:msgId;CONFLICT_VALUES:;contentValues:bizClientMsgId= msgId=2622 msgSvrId=6403889649528004581 talker=wxid_e77yg22 content=在不在 flag=0 status=3 msgSeq=680182320 createTime=1534678573000 lvbuffer=[B@4428279 isSend=0 type=1 bizChatId=-1 talkerId=378
我们想要什么数据,只需要从contentValues的相应字段中取即可。
好了,现在我们已经成功的hook到微信的实时聊天消息,想怎么处理,就看你了。
代码已提交:https://github.com/dalu2048/WeChatGenius.git
接下来,下篇文章,测试文本消息自动回复功能:https://blog.csdn.net/weixin_42127613/article/details/81841099
---------------------
from:https://blog.csdn.net/weixin_42127613/article/details/81840536
【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。的更多相关文章
- 聊天机器人開發好消息!!DIALOGFLOW與微信的天作之合!!
虽然DIALOGFLOW暂未能够与微信(WECHAT)或企业微信(ENTERPRISE WECHAT)进行任何技制上的连接INTERGRATION),确实限制了我们这些聊天机器人开发者的创作空间,因为 ...
- 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统
基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...
- Python 简易聊天机器人
聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...
- 微信的自动回复&接入聊天机器人
今天偶尔发现了一个有趣的python库--itchat,可以实现微信的自动回复.防撤回,结合图灵机器人还能实现聊天机器人的作用 简单介绍一下配置与工具 win7旗舰版 pycharm python ...
- 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享
福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...
- 用python玩微信(聊天机器人,好友信息统计)
1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...
- SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成
今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...
- 使用图灵机器人api搭建微信聊天机器人php实现
之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...
- 手把手教你用Python代码实现微信聊天机器人 -- Python wxpy
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 来学习了,微信聊天机器人. 环境要求: Windows / Li ...
随机推荐
- linux 中的单引号 和双引号有什么区别吗
单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符 ,而不会有特殊符号.我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个 ...
- Java五种基本的Annotation,提高程序的可读性
从JDK5开始,Java增加了对元数据的支持,也就是Annotation(即注解也被翻译为注释). 这里的Annotation和普通的注释有一定的区别,它是代码中的特殊标记,这些标记可以在编译.类加载 ...
- C# % 和 /
/相当于整数除法中的除号,%相当于余号5 除以 2 = 2 余 1,因此 5/2=2,5%2=1.
- call,apply,bind的用法与区别
1.call/apply/bind方法的来源 首先,在使用call,apply,bind方法时,我们有必要知道这三个方法究竟是来自哪里?为什么可以使用的到这三个方法? call,apply,bind这 ...
- K8S 部署 ingress-nginx (二) 部署后端为 tomcat
在上面已经部署了 ingress-nginx, https://www.cnblogs.com/klvchen/p/9903480.html 创建 service 和 pods cd vi tomca ...
- 2018-10-08 Java源码英翻中进展-内测上线
创建了一个子域名: http://translate.codeinchinese.com/ 欢迎试用, 如有建议/发现问题欢迎在此拍砖: program-in-chinese/code_transla ...
- 取消IE、Office、Wmp首次开启提示
一.取消IE首次开启提示 1.运行框输入gpedit.msc.打开组策略配置 2.本地计算机策略-计算机配置-管理模板-windows组件-Internet Explorer,查找右边“阻止执行首次运 ...
- Android智能指针SP WP使用方法介绍
Android手机操作系统既然是开源的操作系统.那么在具体的文件夹中就会存放着各种相关功能的开源代码.我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能.在这里大家就一起来看 ...
- (网页)thinkpad 笔记本开机看看坏了没?
嗯!只是想看一下是不是块砖头. 出现许多细节问题: 1.不用注册联机的乱七八糟的,验证还慢,直接选择脱机的. 2.推荐密码:zaq!2wsx直接进去,以后可以改. 3.有很多选项都可以不勾选,(只勾选 ...
- VScode快捷键、Chrome快捷键知识小总结和状态码
一.VS code的一些快捷键 Shift + Delete 删除一整行 ctrl + Delete 删除光标之后到标点的数据 Delete 删除光标之后 ...