• 程序员过年必备 -- 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("返回成功");
    }

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

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

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

  • 相关阅读:
    算法--将Excel列索引转换成默认标识
    Java参考资料-中文API
    java编程规范
    POI-根据Cell获取对应的String类型值
    将Excel中读取的科学计数法表示的Double数据转换为对应的字符串
    Android进程间通信之LocalSocket通信
    Android进程间通信之socket通信
    android用讯飞实现TTS语音合成 实现中文版
    Android Junit测试框架
    java interface的两个经典用法
  • 原文地址:https://www.cnblogs.com/chilliegg/p/12177535.html
Copyright © 2020-2023  润新知