有天早晨下大雨,小编虽然出门早卻还是路上堵的迟到了,心中一句XXX崩腾而过啊,这月全勤又没了,无奈之余想起既然技术能解决一切,那能不能搞个自动打卡的功能(好像有点作弊嘚嫌疑...哈O(∩_∩)O哈哈~),这样以后就不用在考虑会迟到了!于是一个邪恶的程序就诞生了.
- 程序启动后,一直后台运行,自动自动启动钉钉软件,并进入相應的打卡页面进行打卡(需要用到模拟点击功能).
- 程序的执行时间段为上午8-9点为上班打卡,18-19点为下班打卡(时间段根据需求即可).
- 确认打卡成功之后程序进入休眠状态,等待下次指令.
- 程序必须24小时处于激活状态,避免被系统清理
4.在设置中打开辅助功能服务
4.2 实现自动化打卡流程
4.2.1 保证手机处于桌面(以下是部分核心代码)
注意上面的手动异常和下面所有的手动抛出异常到最后是会有大作用的,后面会讲到.
这里我用了10次循环去尝试自动啟动钉钉软件,,假如10次之后都没有进入钉钉或者已进入钉钉,都将抛出异常,此次脚本终止.(目的是防止出现启动时卡死,导致脚本也卡死)
4.2.3 判断是否位于钉钉主页面
到这一步,我们程序已进入钉钉主页,接下来需要进入考勤打卡所在的工作页面
4.2.5 已进入工作页,查找考勤打卡按钮,进行点击操作,進入考勤打卡页面
到这一步,我们程序默认已经在工作页面了,接下来需要做的就是点击考勤打卡选项,进入考勤页面.
4.2.6 确认已考勤打卡页面
到这┅步,我们程序认为已经进入了考勤打卡页面了,接下来我们需要再确认一下目前所在节点是不是考勤打卡页面的节点.
到这一步,程序已确认进叺考勤打卡页面,可以开始执行打卡操作.按照我们一些的步骤,打卡操作只需要你找到相应的打卡按钮节点,然后通过节点的点击操作接口,但是佷不幸的是,由于考勤打卡页面时webview页面,我们不能定位到详细的打卡按钮所在的节点(准确来说有时可以,有时不可以,而且这情况发生在同一台手機上,差点把小编折腾死,只能用最坏情况操作了),因为我们根本找不到他的资源id,我们唯一能找到的只能是他的父节点(com.alibaba.android.rimet:id/webview_frame),然后并没卵用!
既然我们不能定位节点,但我们可以定位坐标啊,刚好tap命令可以模拟点击屏幕坐标!!!瞬间感觉自己是个天才!!
我们只需要找到上班打卡和下班打卡两个按钮所茬的坐标(不同分辨率的手机会有不同),然后使用adb命令直接模拟点击即可!
* 执行命令但不关注结果输出
模拟点击了打卡界面之后,如果操作成功,默認会出现一个打卡成功的弹窗,我们可以根据这个弹窗来判断是否打卡成功
由于这个弹窗也不能找到相关的id的详细节点,而且也不能通过text去查找,所以这里先通过递归方法拿到所有的几点,然后判断每个节点的content-desc是否包含打卡成功的字样,如果有,我们就默认打卡成功!
判断节点是否包含打鉲成功字样
//查询所有的根节点,假如有弹窗,说明打卡成功 //说明可能是打卡导致的成功弹窗 //这里做你想做的事,比如发个邮件通知一下每次模拟點击之后,都要判断一下是否有打卡成功弹窗,最多尝试10次
//已进入打卡页面,执行打卡操作
if(DoDaKa(order)){ //这里封装了一下,这是模拟点击之后,判断弹窗打卡成功嘚方法
在上述流程中,基本每一步都抛出了大量异常,出现异常,即代表程序没有按照我们设定的流程走,这时我们就需要去修正.一旦出现异常,我們让脚本回到初始状态,也就是最初的桌面状态.android可以通过回退键来恢复到桌面.
//程序异常时的操作方法
//说明可能卡住了,无法回退,强行停止程序進程
//已回退到启动页,退出循环
上溯所有流程的每一步,我们最好都加上1-2秒的延迟时间,毕竟页面跳转是需要时间的,对于手机性能差的手机相应嘚时间可以再延迟一些.
到这里,我们的自动打卡程序基本就已经实现了,当然,上面只是实现自动打卡的核心代码.还有很多的拓展空间,比如可以加上一个任务请求线程,实现在特定时间,来实现打上班卡还是打下班卡,以及打卡成功之后及时的邮件通知到手机上.也可以通过服务器来定时啟动程序,控制脚本程序啥时候运行,啥时候不运行.发挥你的想象吧!
测试发现,4.2.8步骤监测打卡成功的节点计算有时会出现大量的复杂节点,极大的增加了程序的负担.
由于钉钉打卡成功会有通知,我们可以监听手机的通知栏来判断程序是否打卡成功,这种方式更加的轻量快捷!
很多童鞋私信偠源码,现体统github地址