这看这篇文章前,请先去第一版,主要方法没变只是在原代码上进行了改进,当然,既然是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;
}