程序员过年必备 -- Auto.js微信自动抢红包

打开微信就不用管了:

- 自动打开未读消息

- 自动滑动屏幕检测红包

- 自动跳过无效红包

 

基于Auto JS,apk版本4.01:

- 大多数动作均基于控件

- 极个别点击基于动态抓取的坐标

- 这就意味着不限机型或屏幕尺寸

 

使用说明:

- 安装auto.js apk

- 导入js脚本

- 在auto js设置中开启悬浮窗,因为懒得写控制逻辑了,直接用悬浮窗控制程序开始或结束

- 打开微信

 

逻辑思路和关联到的控件信息:

i. 检查是否有红包?循环上滑3次屏幕
ii. 点击红包消息
LinearLayout(clickable=true && depth=13 && id=atb)
iii. 检测红包是否可领?有无[开]
iv. 开红包【开】
Button(desc='开' && id=dan && depth=9)


v. 取得金额
TextView(depth=13 && id=d62 && text=【金额】)
vi. 返回聊天界面
LinearLayout(depth=7 && id=m0 && clickable=true)
vii. 返回微信首页
LinearLayout(depth=9 && id=lr && clickable=true)

 

主要代码逻辑 - 检测新红包/无效红包

Hints:

1. 如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:
var b = desc("打开侧拉菜单").findOne().bounds();
click(b.centerX(), b.centerY());  //如果使用root权限,则用 Tap(b.centerX(), b.centerY());


2. 小心使用find(),findOne()等,注意仔细看原文档,否则会莫名其妙找不到控件或被阻塞

//please avoid to use findOne() as it will jam until get one UIObject
// we could use findOne(500) or findOnce() to instead if need

 

//搜索新红包并点开领取
function searchNewRedpacket(){
    var rp_msg_list = className("android.widget.TextView").id('auk').find();
    log("调试信息3" + rp_msg_list);
    if(rp_msg_list.length != 0){
        log("检测到的红包个数: " + rp_msg_list.length);
        for(var i = 0; i < rp_msg_list.length; i++){
            var rp_auk = rp_msg_list[i];
            var rp_auk_parent = rp_auk.parent();
            if(rp_auk_parent.childCount() == 1){
                log("### 发现新红包");
                var rpB = rp_auk_parent.bounds();
                click(rpB.left, rpB.top, rpB.right, rpB.bottom);
                log("成功打开红包消息");
                openNewRedPacket();
                sleep(1000);
            }else if(i == (rp_msg_list.length - 1)){
                log("当前页面已检测完");
                break;
            }else{
                log("无效红包, 跳过");
            }
        }
    }else if(rp_msg_list.empty()){
        log("未检测到红包消息" + rp_msg_list.length);
    }else{
        return;
    }
}

 

主要代码逻辑 -- 开红包

//领取点开的红包
function openNewRedPacket(){
    var draw = desc("开").findOne(500);
    log("调试信息2");
    if(draw != null){
        log("#### 点开新红包");
        draw.click();
        log("#### Gain a LUCKY succesfully!!!");
        sleep(1000);
        //领完返回聊天主页
        back();
    }else{
        log("过期之类无效红包");
    }
    back();
    log("返回成功");
}

 

 

今天忙的有点晕,就写这些了,需要完整代码的留言,改天抽空上传操作视频和源码到github。

 

PS: 写这个前后大概花了4晚上(2小时/晚),起因是老婆说他们公司老板经常发大红包她总是抢不到。。。

今晚估计可以让老婆加鸡腿了^_^

posted @ 2020-01-10 18:10  chilliegg  阅读(...)  评论(...编辑  收藏