autojs和Auto.js Pro获取微信聊天页面会话内容的方法,取微信聊天记录

前言

有位小伙伴要开发微信机器人。需要获取微信好友消息。


机器人软件要求在免root环境运行。 那么按键精灵是不行的,因为要依赖root。 所以考虑使用Auto.js Pro。


在手机上打开微信聊天会话窗口,查看节点信息,发现不显示text内容。 因此这里没办法通过autojs的text()函数来获取到聊天内容。

实现过程

首先百度一下,看看能不能找到相关的资料。 搜索“autojs 微信”

找到了这篇文章
初探 Autojs ,写了个简单的微信群聊机器人

我把文章内的部分开源代码复制到这里

"auto";

//设置无障碍模式 fast为启用缓存
auto();

//请求截屏权限  因为增加了这个权限请求 启动脚本必须在 autojs APP界面 否则会有问题,主要是连电脑调试要注意
if(!images.requestScreenCapture()){
    toast("请求截图失败");
    exit();
}

function getMsg(){

    if(currentActivity() != 'com.tencent.mm.ui.LauncherUI'){
        //不在聊天Activity

        //先判断是否在微信中
        if(currentActivity().search('com.tencent.mm') == -1){
            //当前 APP 不是微信
            return false;
            //app.launch("com.tencent.mm");
        }
        //不在聊天Activity ,则有可能是文字详情界面  点击任意区域回到聊天界面(点状态栏区域比较保险)
        press(1 ,1,1);
        sleep(100); //这个时间根据手机的响应速度可能要稍微调整 ***这里可以根据情况调整***
    }
    if(!id('aab').exists() || !id('y').exists()){
        //没有找到输入框则表示当前界面不是聊天窗口
        return false;
    }
    var last_y = id('y').findOnce(id('y').find().size()-1)

    if(last_y.childCount() != 2){
        return false;
    }

    var ji = last_y.child(1).findOne(id('ji'));

    if(ji){
        return ['text' , getText(ji)];
    }else {
        var aec = last_y.child(1).findOne(id('aec'));
        if(aec){
            var jh = last_y.child(1).findOne(id('jh'));
            if(jh){
                var nickname = jh.text();
            }else{
                var nickname = last_y.child(0).findOne(id('jg')).contentDescription.replace('头像','');
            }
            return ['img' , getImg(aec) ,nickname];
        }
    }

    return false;
}

function getText(uiObj){

    //微信的聊天文本不能直接获取到 这里模拟双击在文本详情界面获取内容
    //获取文字区域 模拟双击
    var last_ji_rect = uiObj.bounds();
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);
    sleep(40); //双击间隔时间  ***这里可以根据情况调整***
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);

    var afv = id('afv').findOne().text();
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);

    return afv;
}

function sendMsg(str){
    //设置输入框文本
    id('aab').setText(str);

    //获取标题栏区域并点击,解决发送按钮获取不到的问题
    var hj = id('hj').findOne().bounds();
    click(hj.centerX(), hj.centerY());

    //点击发送
    id('aah').click();
}

这段代码是2018年2月份写的,当时的微信版本和autojs的版本都比现在要低很多。 上面的代码,只能作为参考,有些语法和写法,现在的autojs可能已经不再使用了。

代码里有一个getText()函数。

function getText(uiObj){

    //微信的聊天文本不能直接获取到 这里模拟双击在文本详情界面获取内容
    //获取文字区域 模拟双击
    var last_ji_rect = uiObj.bounds();
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);
    sleep(40); //双击间隔时间  ***这里可以根据情况调整***
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);

    var afv = id('afv').findOne().text();
    press(last_ji_rect.centerX() ,last_ji_rect.centerY(),1);

    return afv;
}

这段代码的思路,是先找到会话气泡。双击会话气泡的中心点坐标,在弹出的内容里获取文本。 其中uiObj参数,就是会话气泡的节点对象。 在微信7.0.4版本里,测试并没有作用。弹出的内容页,跟前面一样,无法通过text()获取文字内容。
那么,有没有其他办法,能获取微信聊天内容呢?

经过一番研究,找到了一个不错的方法。
这个方法除了微信,其他的能获取到会话气泡节点的APP也可以使用。
在文字右侧下载代码,可查看实现过程。
下面是代码在Visual Studio Code中的调试输出内容:

21:44:58.625/V: 开始运行[[remote]获取微信会话内容聊天记录.js]
21:45:00.531/D: 第1条:又停电了吗?
21:45:00.788/D: 第2条:还没有来电呀?
21:45:00.789/V: 
------------
[[remote]获取微信会话内容聊天记录.js]运行结束,用时2.163000秒

开发环境与工具

微信版本:7.0.4
开发IDE:Visual Studio Code1.3.5.1
Auto.js:Pro 7.0.3-7
终端设备1:红米NOTE5A高配版
终端设备1分辨率:720X1280像素
终端设备1安卓版本:7.1.2
终端设备2:红米NOTE7
终端设备2分辨率:1080X2340像素
终端设备2安卓版本:9

开发文档

UI选择器

相关教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

常见问题

代码下载后可以直接在auto.js PRO 上面运行吗?

代码在Visual Studio Code中写,可以直接发送到autojs中运行和调试。

代码调用了autojs的函数吗?

是的。基于autojs封装的接口来编写的,肯定调用autojs的函数。

脱离autojs能独立运行吗?

当然不能。

其他编程语言怎么获取微信聊天记录?

易语言和java应该都可以实现。本文的代码主要是提供一种思路,一种解决方案。知道了这种思路,其他编程语言也可以实现。