文档章节

初探 Autojs ,写了个简单的微信群聊机器人(02.22新增了 face++的人脸识别 API )

dubox
 dubox
发布于 02/20 15:10
字数 1352
阅读 286
收藏 0
点赞 0
评论 0

简单说一下 autojs ,这是一个开源(https://github.com/hyb1996/Auto.js 看账号貌似是个96年的小朋友?)的利用 Android 的无障碍服务实现的自动操作软件。

 

-------------------18.2.22 凌晨更新----------------------

这次更新同时支持了群聊和普通聊天,并且加入了 face++ 的 人脸识别API 实现了【颜值测试】功能,增加了趣味性。。。

这里需要注意的是 你需要自己去 face++ 申请接口 https://console.faceplusplus.com.cn/register ,注册个账号然后创建一个 app_key 就行了

【颜值测试】效果截图:
0_1519250608024_daadc6bb-6585-4781-bae7-bba68a0512c2-image.png

-------------------------------------------------------------

上代码:

"auto";

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

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


toast("打开微信聊天界面");

/**
 * a4 : 聊天界面 时间控件 id
 * apt: 聊天列表页 聊天摘要
 * jg:聊天界面 头像
 * aec , ae2:聊天界面  聊天图片
 * jh : 聊天昵称
 * ji:
 * y:头像和消息的父级  一个消息块
 * 
 * aab : 聊天界面 输入框
 * hj: 聊天界面 标题栏
 */

//console.log(text('微信').find());
//console.log(id('aab').exists());
//console.log(id('aps').findOne());
//log(id('y').findOnce(id('y').find().size()-1).child(2).findOne(id('ji')));

var wait = 0;

while(1){
    try{
        var msg = getMsg();
    }catch(e){
        var msg = 0;
    }
    log(msg); 
    if(msg){
       
        if(msg[0] == 'text')
        sendMsg(textAI(msg[1]));
        else
        sendMsg(imgAI(msg[1] ,msg[2]));
        
        wait = 0;
    }else{
        sleep(1000); //没有新消息 等待1秒  ***这里可以根据情况调整***
        wait += 1000;

        //5秒点击一次 保持屏幕常亮
        if(wait > 5000){
            if(id('ji').exists())
            id('ji').findOne().click(); 
            wait = 0;
        }
    }
}


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 getImg(uiObj){

    var img_rect = uiObj.bounds();

    //点击图片查看大图
    press(img_rect.centerX() ,img_rect.centerY(),1)

    //var img = images.clip(captureScreen(), img_rect.left, img_rect.top, img_rect.width(), img_rect.height());
    //log(img);
    //images.save(img, "/sdcard/clip.png");

    //等待动画完成
    sleep(750);

    //截屏并存到本地
    captureScreen("/sdcard/clip.png");

    //点击屏幕回到聊天界面
    press(img_rect.centerX() ,img_rect.centerY(),1)

    return "/sdcard/clip.png";
}

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();
}

function imgAI(img_path ,nickname){

    var res = http.postMultipart(
        'https://api-cn.faceplusplus.com/facepp/v3/detect', 
        {
            api_key: "你的 key",
            api_secret:' 你的 secret',
            return_attributes:'gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus',
            image_file: open(img_path)
    });
    var jsn = res.body.json();
    //log(jsn);
    if(typeof jsn.faces == 'undefined')
        return 'API 错误。。。';

    var face = jsn.faces;
    if(!face.length){
        str =  '抱歉!这可能不是一个人!\n';
    }else{
        
        var str = '';
        if(face.length > 1)
            str += '这可能不是一个人,但我一次只能检测一张脸,至于是哪张脸你要猜猜看了...[\调皮]\n\n';

        face = face[0].attributes;

        //基本信息
        str += '基本信息:\n ';
        str += face.gender.value == 'Male'?' 男 ':' 女 ';
        str += face.age.value + '岁 ';
        if(face.ethnicity.value == 'Asian')
            str += '黄种人\n';
        else if(face.ethnicity.value == 'White')
            str += '白人\n';
        else
            str += '黑人\n';
        
        //面部表情
        var emotions = {anger:'愤怒',
            disgust:'厌恶',
            fear:'恐惧',
            happiness:'高兴',
            neutral:'平静',
            sadness:'伤心',
            surprise:'惊讶'};
        var emotion = {e80:0,e40:[]};
        for(var i in face.emotion){
            if(face.emotion[i] > 80){
                emotion.e80 = i;
                break;
            }
            if(face.emotion[i] > 40){
                emotion.e40.push(i);
            }
        }
        str += '表  情:\n ';
        if(emotion.e80){
            str += '非常'+ emotions[emotion.e80] ;
        }else if(emotion.e40.length == 2){
            str += emotion.e40[0] > emotion.e40[1] ? emotions[emotion.e40[0]]+'中带着'+emotions[emotion.e40[1]] : emotions[emotion.e40[1]]+'中带着'+emotions[emotion.e40[0]];
        }else if(emotion.e40.length == 1){
            str += emotions[emotion.e40[0]];
        }else{
            str += '五味杂陈';
        }
        str += '\n';

        //皮肤状况
        str += '皮肤状况:\n';
        str += ' 黑眼圈:'+parseInt(face.skinstatus.dark_circle)+'%\n';
        str += ' 青春痘:'+parseInt(face.skinstatus.acne)+'%\n';
        str += ' 色 斑:'+parseInt(face.skinstatus.stain)+'%\n';

        //颜值
        str += '颜  值:\n';
        str += ' 在大部分男性眼中:'+parseInt(face.beauty.male_score) +'分\n';
        str += ' 在大部分女性眼中:'+parseInt(face.beauty.female_score) +'分\n';
    }
    str += '\n(测试结果和照片清晰度及拍摄角度等因素有关,如对本次结果不满意可发送新的照片进行测试,测试结果不代表本人观点!)';

    return '@'+nickname+' 欢迎使用【颜值测试】功能,您的测试结果如下:\n\n'+ str;
}

function textAI(msg) {
    var url = "http://www.tuling123.com/openapi/api";
    id1 = "llmjk";
    var res = http.post(url, {
      key: "65458a5df537443b89b31f1c03202a80", //图灵
      //key: "e0fcda33be9847c8b8534abe51b4b095", //唐嫣
      // key: "b4438ca194064134afa28f686fbd04a5", //my图灵
      info: msg,
      userid: "1",
    });
    var html = res.body.string();
    eval("b=" + html);
    return b.text;
  }

 

目前只支持群聊,实现方案可能也不是最好的,一些参数可能需要根据手机的情况做些调整。。。

里面的图灵机器人直接引用了论坛里 @O了吗 的‘QQ机器人’中的代码,在此感谢。。。

© 著作权归作者所有

共有 人打赏支持
dubox
粉丝 2
博文 75
码字总数 21359
作品 0
西安
程序员
基于Flask+Vue+Celery+SQLAlchemy+Redis等实现的微信管理系统

现在绝大多数同学都在使用微信,不过微信有很多限制,比如: 微信聊天记录只保存在本地,换个手机那些内容就找不到了 微信扫码加群人数有限制,超过100个就得先加群聊成员微信再由其拉进去,...

董伟明 ⋅ 2017/07/25 ⋅ 0

Python 网页微信 API--wxBot

wxBot 是用 Python 包装 Web 微信协议实现的微信机器人框架。 目前的消息支持情况: 群消息 文本 图片 地理位置 个人名片 语音 动画 语音电话 红包 联系人消息 文本 图片 地理位置 个人名片 ...

匿名 ⋅ 2017/04/13 ⋅ 9

禁止root远程登录及修改ssh默认端口号

注: 系统版本:CentOS release 6.9 (Final) 连接工具:xshell 虚拟机:VMware 12 pro 先创建一个普通用户以备使用 (一)禁止root远程登录 1)修改配置文件/etc/ssh/sshd_config 2)重启ssh...

Linux_yk ⋅ 02/21 ⋅ 0

水印第四版 ~ 非人水印(添加人脸识别)

demo:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP/LoTWaterAPP 说起这个人脸识别,还真有点缘分。记得逆天以前在学生时代参加创新大赛的时候,题目就是人脸识别...

浣熊干面包 ⋅ 2016/12/31 ⋅ 0

百度人脸识别API Java调用

人脸检测V3在线体验:http://123.207.12.111/xai/rest/face/index 工具类下载http://pan.baidu.com/s/1jIuo0N8 小Demo查询。请微信扫一扫我的个人小程序 。里面是腾讯优图+百度人工智能2个厂家...

小帅帅丶 ⋅ 2017/03/21 ⋅ 0

520 | 机器人竟然对我表白了?!用Python假装自己有女朋友(附代码)

     授权转载自大数据分析和人工智能   作者:小马哥 爱数圈联合创始人   520这一天,也是网络情人节。就在今天,python聊天机器人竟然对我表白了,并且还自动地和微信里面的所有人...

大数据文摘 ⋅ 05/20 ⋅ 0

你的微信,到底「连接」多少人?

作为一个技术人,用微信这么多年,也加了不少的好友和技术群。大半个月前,大概是5月初的时候,萌生了这个想法。 前后磕磕绊绊,经过了来美帝出差前期差点饿死、项目紧急期等艰难阶段以及各种...

猿湿Xoong ⋅ 05/25 ⋅ 0

万改称才/QQRobot

QQ小黄鸡VPS挂机版 该项目修改自SmartQQBOT这一项目,支持在VPS下nohup命令挂机。QQ协议说明请参考原项目。 请帮忙分析Android QQ协议:此项目现已稳定,在更新协议前不会有大更新。希望有人...

万改称才 ⋅ 2015/12/20 ⋅ 0

报名啦!旷视研究院解读COCO 2017物体检测夺冠算法 | 吃瓜社

刚刚结束的ICCV 2017期间,旷视科技(Face++)在竞争激烈的MS COCO大赛中,击败谷歌、微软、Facebook等国际巨头,夺得物体检测、人体关键点检测和Places物体分割三项核心竞赛冠军。 MS COCO ...

yh0vlde8vg8ep9vge ⋅ 2017/12/01 ⋅ 0

newflydd/itchat4go

DEMO: 加微信好友:168138332(已设置成免验证聊天) 或者扫描下方二维码 在聊天界面跟我对话,发送文字:cmd,随后根据提示操作,就能体验一下这个小机器人的功能了。 itchat4go -- 用Golan...

newflydd ⋅ 2017/09/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

SpringBoot简单使用ehcache

1,SpringBoot版本 2.0.3.RELEASE ①,pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELE......

暗中观察 ⋅ 昨天 ⋅ 0

Spring源码解析(八)——实例创建(下)

前言 来到实例创建的最后一节,前面已经将一个实例通过不同方式(工厂方法、构造器注入、默认构造器)给创建出来了,下面我们要对创建出来的实例进行一些“加工”处理。 源码解读 回顾下之前...

MarvelCode ⋅ 昨天 ⋅ 0

nodejs __proto__跟prototype

前言 nodejs中完全没有class的这个概念,这点跟PHP,JAVA等面向对象的语言很不一样,没有class跟object的区分,那么nodejs是怎么样实现继承的呢? 对象 对象是由属性跟方法组成的一个东西,就...

Ai5tbb ⋅ 昨天 ⋅ 0

Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库

Q: Ubuntu16.04 PHP7.0 不能用MYSQLi方式连接MySQL5.7数据库 A: 执行以下2条命令解决: apt-get install php-mysql service apache2 restart php -m 执行后会多以下4个模块: mysqli mysqlnd...

SamXIAO ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部