接上篇,使用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. Laravel篇之Laravel的安装及使用

      想搭建一个基于Lavarel和vuejs的个人网站,使用git推送到github存储,千里之行,始于足下,首先要做的用composer来下载laravel框架,并成功运行. 一.使用compose ...

  2. Nginx之OCSP stapling配置

    摘要: 正确地配置OCSP stapling, 可以提高HTTPS性能. 什么是OCSP stapling? OCSP的全称是Online Certificate Status Protocol,即在 ...

  3. php的TS和NTS的区别

    ts(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他 线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数 ...

  4. laravel前后台路由分离

    在laravel中创建文件放置前台和后台控制器 找到app/providers/RouteServiceProvider.PHP文件 在内配置 例: <?php namespace App\Pr ...

  5. 4种方法实现Html转码

    <script> var HtmlUtil = { /*1.用浏览器内部转换器实现html转码*/ htmlEncode: function(html) { //1.首先动态创建一个容器标 ...

  6. 08-HTML-框架标签

    <html> <head>  <title>框架标签学习</title>  <meta charset="utf-8"/> ...

  7. 洛谷P3966 [TJOI2013]单词(AC自动机)

    题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...

  8. VS2017 docker部署工具的使用

    **简要描述:** - VS2017的docker支持工具,支持对.Net Framework,.Net Core控制台或者Web应用,在docker中生成,调试,运行.对于.Net Framewor ...

  9. Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现

    大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌.这期我们继续实现接下来的功能--叫地主. 1.首先这两天,学习了DOTween,这是一个强大的Unity动画 ...

  10. 解决centos的mysql服务3306端口无法远程连接10038问题

    之前一期说过在centos下安装宝塔控制面板,当登陆进去新建了数据库,然后在windows使用navicat for mysql 远程连接数据库一直失败,没有解决就先用阿里的RDS先用着,直到近期找到 ...