自动定时网课签到plus版(QQ群+学习通)

这看这篇文章前,请先去第一版,主要方法没变只是在原代码上进行了改进,当然,既然是plus那就会比第一版好用,相应的代码肯定也比之前的多了点

第一版在这里哦
昨天半夜系统提示更新,home()失效了,然后程序就呵呵了。老铁,这能忍?
所以今天我在原代码基础上进行了改进,新增:
1解锁功能(包含带密码的)。
2查错功能,在打卡发表和加入语音处进行检查。文章后面教大家怎么检查的,可以根据自己的需要设置检查点,比如想改成学习通定时签到,就在检查有没有最新的签到键。
3容错循环, 采用while循环,若程序没成功就一直循环。当然,你可以设置次数,老师要根本没发签到,签个星星?不过也有想无限循环直到老师发签到为止的也行,把num相关代码删了就行。
下面放代码(这几个子函数都是一个意思):

var is_daka = 0;//是否打卡标志位
var num = 0;//循环次数标志位
var qun_name = "天地会"//群名
function 解锁() {
    if (!device.isScreenOn()) {
        device.wakeUp();//点亮屏幕
        sleep(1000);
        gesture(500, [540, 1800], [540, 1000]);//上滑,从【540,1800】滑到【540.1000】坐标处,全程500ms
        sleep(1000);
        //下面代码为数字密码解锁使用,没有密码的不用加,一样通过x,y坐标点击。
        //手势解锁就用gesture函数
        //我就不说我密码是啥了,相信也没人闲的无聊去破我的密码。。。
        click(225, 1383);
        sleep(1000);
        click(850, 1391);
        sleep(1000);
        click(887, 1840);
        sleep(1000);
        click(237, 1869);
        sleep(1000);
        click(548, 1622)
        sleep(1000);
        click(548, 1622);
        sleep(1000);
    }
}
function 关闭应用() {
    //此函数是根据应用包名进行调用的,理解困难的可以先跳过
    //其实shell方法可能更简单点,但是大部分手机都没有root(俺也一样),好奇的可以去网上查查
    let packageName = currentPackage();
    app.openAppSetting(packageName);
    text(app.getAppName(packageName)).waitFor();
    let is_sure = text("强行停止").findOne();//我设置页面显示的是强行停止,不是的可以自己改
    if (is_sure.enabled()) {
        text("强行停止").findOne().click();
        sleep(2000);
        text("强行停止").findOne().click();
        log(app.getAppName(packageName) + "应用已被关闭");
        sleep(1000);
        back();
    } else {
        log(app.getAppName(packageName) + "应用不能被正常关闭或不在后台运行");
        back();
    }
}
function 搜索() {
    var say = desc("搜索").findOnce();
    //查找控件的desc属性内容为“搜索”,仅1次保存到say变量
    if (say) {
        say.click();//点击控件       
        sleep(2000);
        setText(qun_name);
        sleep(4000);

    }
    else {
        toast("搜索失败");//显示气泡框

    }


}
function 进群() {
    var say = id("title").className("android.widget.TextView").text(qun_name).findOnce();
    if (say) {
        say.parent().click();
        sleep(3000);

    }
    else {
        toast("进群失败");

    }


}
function 群聊设置() {
    var say = desc("群聊设置").findOnce();
    if (say) {
        say.click();
        sleep(2000);

    }
    else {
        toast("群聊设置失败");

    }


}
function 打卡() {
    var say = desc("打卡").findOnce();
    if (say) {
        say.click();
        return 1;
    }
    else {
        toast("打卡失败");
        return 0;
    }


}
function 发表() {
    sleep(10000);
    var say = text("发表").findOnce();
    if (say) {
        say.click();
        sleep(3000);
        is_daka = 1;
        return 1;
    }
    else {
        toast("发表失败");
        return 0;
    }

}
function 语音() {
    var say = id("gny").className("android.widget.ImageView").findOnce();
    if (say) {
        say.click();
        sleep(3000);
        var yu = desc("语音通话按钮").findOnce();
        if (yu) {
            yu.click();
            sleep(3000);
        }
        else {
            toast("语音按钮失败");
        }

    }
    else {
        toast("语音失败");

    }


}
function 立即加入() {
    var say = text("立即加入").findOnce();
    if (say) {
        say.click();
        return 1;
    }
    else {
        toast("加入语音失败")
        return 0;
    }
}

while (1) {
    var is_right = 1;
    if (num < 5) {//可自己设置若程序失败,再次运行次数。
        //我是为了排除比如群里没有发起语音通话导致程序无限循环的情况(也没啥就是费电)
        //要是不怕费电不加也行
        num += 1;
    }
    else {
        break;
    }
    解锁();
    home();
    sleep(3000);
    launchApp("QQ");
    sleep(5000);
    关闭应用();//先关一波后台,防止QQ处在无法操作的界面
    sleep(2000);
    launchApp("QQ");
    sleep(10000);
    搜索();
    进群();
    //下面打卡签到
    if (!is_daka) {
        群聊设置();
        is_right = 打卡() && 发表(); //打卡并发表才算成功      
    }
    if (!is_right) {
        关闭应用();//关闭QQ后台,方便程序再次运行
        continue;
    }
    语音();
    is_right = 立即加入();
    if (!is_right) {
        关闭应用();
        continue;
    }
    sleep(3000);
    break;
}




查错功能实现方法:
只要你会看控件的信息属性,然后想用什么信息都通过代码调用就行了(属性页面可以上下滑动。注意看步骤,别只会盯着狗哥)

我感觉这次应该比较完善了,解决了大部分问题。基本手机可以通用,只需能改解锁密码,群聊名称。把模拟点击方法换成了对控件进行操作,方便检测错误及时反馈,且移植性较高。

这次改动总的来说代码理解起来复杂了些,但功能增加了。我也搞了个学习通(只能普通的签到)的,其实你要理解了自己也能搞的。延时觉得慢的就改,但是不能太短,不然会出错。有什么问题或建议欢迎找我。
附:学习通签到代码(记得改解锁密码和课程)

var num = 0;//循环次数标志位
function 解锁() {
    if (!device.isScreenOn()) {
        device.wakeUp();//点亮屏幕
        sleep(1000);
        gesture(500, [540, 1800], [540, 1000]);//上滑,从【540,1800】滑到【540.1000】坐标处,全程500ms
        sleep(1000);
        //下面代码为数字密码解锁使用,没有密码的不用加,一样通过x,y坐标点击。
        //手势解锁就用gesture函数
        //我就不说我密码是啥了,相信也没人闲的无聊去破我的密码。。。
        click(225, 1383);
        sleep(1000);
        click(850, 1391);
        sleep(1000);
        click(887, 1840);
        sleep(1000);
        click(237, 1869);
        sleep(1000);
        click(548, 1622)
        sleep(1000);
        click(548, 1622);
        sleep(1000);
    }
}
function 关闭应用() {
    //此函数是根据应用包名进行调用的,理解困难的可以先跳过
    //其实shell方法可能更简单点,但是大部分手机都没有root(俺也一样),好奇的可以去网上查查
    let packageName = currentPackage();
    app.openAppSetting(packageName);
    text(app.getAppName(packageName)).waitFor();
    let is_sure = text("强行停止").findOne();//我设置页面显示的是强行停止,不是的可以自己改
    if (is_sure.enabled()) {
        text("强行停止").findOne().click();
        sleep(2000);
        text("强行停止").findOne().click();
        log(app.getAppName(packageName) + "应用已被关闭");
        sleep(1000);
        back();
    } else {
        log(app.getAppName(packageName) + "应用不能被正常关闭或不在后台运行");
        back();
    }
}


while (1) {
    var is_right = 1;
    if (num < 5) {//可自己设置若程序失败,再次运行次数。
        //我是为了排除比如群里没有发起语音通话导致程序无限循环的情况(也没啥就是费电)
        //要是不怕费电不加也行
        num += 1;
    }
    else {
        break;
    }
    解锁();
    home();
    sleep(3000);
    launchApp("学习通");
    sleep(5000);
    关闭应用("");//避免学习通在特殊页面产生错误
    sleep(2000);
    launchApp("学习通");
    sleep(10000);  
    id("tabButton").className("android.widget.TextView").text("消息").findOnce().parent().click()
    sleep(3000);
    id("tvName").className("android.widget.TextView").text("xx课程").findOnce().parent().click()
    sleep(3000);   
    qian = id("tvTitle").className("android.widget.TextView").text("签到").find();
    if(qian){
        dao = qian.pop();
        dao.parent().click();
    }
    else{
        toast("签到失败");
        关闭应用();
        continue;
    }
    sleep(3000);
    break;
}





发布了2 篇原创文章 · 获赞 2 · 访问量 842

猜你喜欢

转载自blog.csdn.net/tzqwqtzqwq/article/details/105010566