接上篇,使用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数据库插入操作。的更多相关文章

  1. 聊天机器人開發好消息!!DIALOGFLOW與微信的天作之合!!

    虽然DIALOGFLOW暂未能够与微信(WECHAT)或企业微信(ENTERPRISE WECHAT)进行任何技制上的连接INTERGRATION),确实限制了我们这些聊天机器人开发者的创作空间,因为 ...

  2. 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统

    基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...

  3. Python 简易聊天机器人

    聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...

  4. 微信的自动回复&接入聊天机器人

    今天偶尔发现了一个有趣的python库--itchat,可以实现微信的自动回复.防撤回,结合图灵机器人还能实现聊天机器人的作用 简单介绍一下配置与工具 win7旗舰版  pycharm  python ...

  5. 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享

    福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...

  6. 用python玩微信(聊天机器人,好友信息统计)

    1.用 Python 实现微信好友性别及位置信息统计 这里使用的python3+wxpy库+Anaconda(Spyder)开发.如果你想对wxpy有更深的了解请查看:wxpy: 用 Python 玩 ...

  7. SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

    今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...

  8. 使用图灵机器人api搭建微信聊天机器人php实现

    之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...

  9. 手把手教你用Python代码实现微信聊天机器人 -- Python wxpy

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 来学习了,微信聊天机器人. 环境要求: Windows / Li ...

随机推荐

  1. 2018年,JavaScript都经历了什么?

    摘要: 对JSer来说,这是很有意思的1年. 本文灵感来自JavaScript Weekly周报,欢迎大家订阅. The State of JavaScript 2018 The State of J ...

  2. 解决PHP Redis扩展无法加载的问题(zend_new_interned_string in Unknown on line 0)

    出错代码如下 PHP Warning: PHP Startup: Unable to load 最近在工作中需要使用PHP访问Redis,从https://github.com/phpredis/ph ...

  3. C#导入Excel、Excel导入、导入.xls 、导入.xlsx、Excel2003版本、Excel2007版本

    C#导入Excel: 1.选择Excel 03版文件 2.选择需要读取数据的Excel工作表   3.选择工作表中需要读取的列 源码地址在图片下面,不要点击图片,点击下载地址跳转下载.

  4. 微信小程序-查询快递

    1.新建快速启动项目 2.在设置里面勾选不校验合法域名,以防编译报错 3.在app.json中改一下窗口表现:app.json—"navigationBarTitleText": ...

  5. [vue三部曲]第一部:vue脚手架的搭建和目录资源介绍,超详细!

    第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装1.2 如果本机已经安装node的运行换,请更新至最新的node 版本下载地址:https://nod ...

  6. GIS开发之数据查询

    在GIS开发之我们经常会用到属性查询和空间查询,特别是在数据量比较大的时候,如何提高查询效率成为一个问题 1.属性查询 对于属性查询,除了必要的建索引之外,我们还应该考虑使用字段缓存:减少查询字段,减 ...

  7. Retrieve OpenGL Context from Qt 5.5 on OSX

    In the latest Qt 5.5, the QOpenGLWidget is much better and has less bugs than the QGLWidget, but it ...

  8. Android使用Glide加载https链接的图片不显示的原因

    平时我们使用Glide加载http网址的图片的时候,图片可以正常加载出来,但是如果服务器端加上了安全认证,当加载自签名的https图片的时候就会报如下错误(证书路径验证异常). 我们如果不修改Glid ...

  9. RecyclerView 高度不能随着Item数量 自适应高度

    在最近项目中遇到 ,在RecyclerView加载list数据时,高度无法自适应增长,看了很多博客,各种尝试,都没有解决这个问题,在某个博客中,讲到此解决方法,在此记录下. 即在RecyclerVie ...

  10. 关于iframe跨域实践

    提要 项目中与到iframe子页面中需要通过top获取在父页面中的全局变量的需求,由于App部署的缘故,导致父页面和iframe子页面分别在不同的端口下,导致iframe跨域现象,通过查阅资料进行问题 ...