前言
本文不是用python写的,而是用auto.js,python的话,一是学艺不精,二是我并没有找到打卡网址,如果还想深入研究一下,可以看这个 链接.
一、auto.js优缺点及下载地址
Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
缺点还是要先说明一下,就是每次都要开启这个app,首先要打开无障碍功能才行
下载链接(注意:进去后选择第二个下载): 下载地址.
二、代码
150行左右
废话就不多说了,直接看代码:
auto.waitFor();
var phone = "110";
var province = "xxx";
var shi = "xxx";
/*详细地址*/
var detailAddress = "xxx";
/*如果不需要在qq群中签到,就要删掉下面两个方法*/
var qqqun = "xxx";
launchApp("微信");/*启动微信*/
sleep(1000);
/*找到搜索框 微信8.0搜索框的id*/
var object = className('android.widget.ImageView').id("he6").findOne();
let b = object.bounds();
click(b.centerX(), b.centerY());
sleep(2000);
/*搜索的文字*/
setText('学生健康打卡');
sleep(200);
/*点击内容*/
className("RelativeLayout").depth(10).drawingOrder(3).findOne().click();
text("健康打卡").findOne().parent().parent().click();
sleep(3000);
text("健康打卡").findOne().click();
sleep(3000);
var a = text("+ 今日打卡").findOne().bounds();
click(a.centerX(), a.centerY());
sleep(3000);
if (className("android.view.View").text("今日已打卡,明天再来!").exists()) {
toast("今日已打卡");
goBack();
} else {
toast("开始打卡");
sleep(1000);
swipe(500, 1500, 500, 500, 1000);
/*电话*/
directlyWriteInfo(4, phone);
/*当前所在地*/
writeAddress();
/*详细地址*/
directlyWriteInfo(7, detailAddress);
/*租住在学校附近*/
findView(8);
writeInfo("否");
/*体温*/
directlyWriteInfo(9, "36.5");
/*是否到过武汉*/
findView(10);
writeInfo("否");
/*是否接触确诊人员*/
findView(11);
writeInfo("无接触");
/*目前状况*/
findView(12);
writeInfo("正常");
/*家属状况*/
findView(13);
writeInfo("正常");
/*出现的症状*/
indexInParent(15).depth(21).row(-1).findOne().child(0).click();
/*今日外出行程*/
setText([6], "无");
/*提交*/
indexInParent(17).depth(21).row(-1).findOne().child(0).click();
/*确认提交*/
text("确认提交").findOne().click();
sleep(500);
toast("成功打卡");
goBack();
/*qq群*/
goto(qqqun);
sendMessage();
exit();
}
function findView(index) {
indexInParent(index).depth(21).row(-1).findOne().child(1).child(0).click();
sleep(500);
}
function writeInfo(message) {
var info = text(message).findOne().bounds();
click(info.centerX(), info.centerY());
sleep(500);
}
function directlyWriteInfo(index, message) {
indexInParent(index).depth(21).row(-1).findOne().child(1).child(0).setText(message);
sleep(500);
}
function goBack() {
for (let i = 0; i < 4; i++) {
back();
sleep(500);
}
}
function goto(qqqun) {
app.startActivity({
action: "android.intent.action.VIEW",
data: "mqqapi://card/show_pslcard?src_type=internal&version=1&card_type=group&uin=" + qqqun,
packageName: "com.tencent.mobileqq",
});
text("发消息").findOne().click();
}
function sendMessage() {
id("input").findOne().setText("1");
id("fun_btn").findOne().click();
toast("签到成功");
sleep(500);
back();
home();
}
function writeAddress() {
findView(6);
/*省份*/
var i = 0;
var j = 0;
var rect = className("LinearLayout").depth(5).drawingOrder(1).findOne().bounds();
var exist1 = className("TextView").depth(7).text(province).exists();
while (i < 10 && exist1) {
/*为什么放里面,因为我每次都要刷新这个bounds*/
var c = className("TextView").depth(7).text(province).findOne().bounds();
print(rect.bottom + "--- " + rect.top + "----" + c);
if (c.bottom < rect.bottom && c.top > rect.top) {
click(c.centerX(), c.centerY());
break;
} else {
swipe(rect.centerX(), rect.centerY(), rect.centerX(), rect.top + 20, 1000);
}
i++;
}
if (i == 10 || !exist1) {
toast("请检查你输入的省份,并重新执行程序");
exit();
}
/*市*/
indexInParent(6).depth(21).row(-1).findOne().child(1).child(1).click();
sleep(500);
var exist2 = className("TextView").depth(7).text(shi).exists();
while (j < 10 && exist2) {
var l_shi = className("TextView").depth(7).text(shi).findOne().bounds();
if (l_shi.bottom < rect.bottom && l_shi.top > rect.top) {
click(l_shi.centerX(), l_shi.centerY());
break;
} else {
swipe(rect.centerX(), rect.centerY(), rect.centerX(), rect.top + 20, 1000);
}
j++;
}
if (j == 10 || !exist2) {
toast("请检查你输入的市,并重新执行程序");
exit();
}
}
使用
- 我对代码进行了封装,只需在代码开头的几行修改成你自己的信息 你的电话,省份,市,详细地址,要签到的qq群,代码对各个手机都是适配的。每个手机应该都是可以自动化的
- 如果js代码总是显示在一行,那么就要格式化代码
步骤:进入某一个文件 —> 编辑 —> 格式化代码 - 要注意一点,打开app后,第一时间要打开无障碍功能,可能要多试几次
- 然后就可以自动打卡了
说明
- 点击之后不可能快速反应过来,所以代码多处用了sleep
- 我直接是launchApp(“微信”),所以进入微信后一定要是主界面才行,不然找不到控件,就不能进行接下来的点击事件了
总结
有不懂的话,可以加我qq(3620841688)聊聊,这个不常看
可能会有不足,欢迎指出,勿喷