本篇目的在于折腾。
用户痛点
因为公司上下班需要打卡,而可能出现忘记打卡的情况。针对此情况,公司有了人性化的考虑,每月免费提供2次补卡机会。但是对于贪婪的程序员,这是远远不够的。所以我们想通过技术改变些什么
需求分析
打卡需要通过公司自己的客户端输入手机号获取验证码登陆,然后定位在公司附近N公里,点击上班打卡或者下班打卡。
要素
- 手机号登陆
- 位置
- 时间
- 点击操作
方案设计
- 接口调用方式
通过抓包获取打卡接口请求,然后调用接口请求完成打卡 - 篡改位置信息方式
手机上安装可修改定位信息的软件,修改地址,突破地域限制
可行性调研
通过Fiddler 抓包分析发现请求中有签名
签名通过客户端里的算法规则生成。
拿不到规则就拿不到签名,就无法直接调用请求。
获取规则这可能涉及到客户端的反编译了,暂时未接触过。
调接口的方式走不通,尝试篡改位置信息
网上可以找到虚拟定位软件,但是多数都收费。
虽然能满足当前需求,但是总感觉被收费不舒服,而且整个过程还是有很多机械化的操作。
重新给需求加戏
我希望把整个过程自动化解放双手,比如发一条“打卡”的消息,就能把事情做了
既然提高了效率,就应该提供更大的输出,最好能够帮对那些忘记打卡的同事伸出援手。
那不如开个公众号吧,谁需要了,发送手机号码,和验证码,就可以帮你完成。
既然提供服务了,就不能用自己的手机了。需要一台长期不关机的电脑做服务器
在“服务器”里用虚拟机来完成。这样一来,自己的手机也不必安装各种所需的工具软件
摸索过程
模拟器先用了蓝叠,后来发现有些软件在上面提示装不了
又换了mumu模拟器,所需的软件都能安装而且开启速度也更快了。
自动化实现上,先用了按键精灵,但是因为按键精灵的脚本的触发条件感觉不能做到对事件监控触发。
后来改用Tasker。
具体实现
- 在模拟器中安装Tasker及其插件
- 在模拟器中安装 QQ 作为接收消息的服务号
- 打开Tasker,完成相应的授权
Tasker首页点击右下角的 +
在弹出的列表中依次选择 事件——插件——NotificationListener——NotificationListener
操作后看到如图
点击右侧铅笔进入如下界面,并按照图示设置
Apps :是你要监听的应用,这里我选择手机QQ
Title :是你的QQ收到消息的标题,如下图中的,我用的是Test(也就是我要发消息给过来的QQ,在这个QQ上的备注名称是Test)
Text :是发过来的文本,如图,我填写的是“打卡”
配置好后,自动弹出新建任务,输入任务名称后
依次选择 【程序】——【启动应用】——【选择你要打卡的应用】——返回(找不到确认按钮,就返回到上层确认)
设置后如图,可以点击左下角的运行按钮测试能否成功启动设置的应用
如果成功启动,再尝试能否在接受到消息时触发
这里我们可以理解到
这个软件本质上通过【配置】+【任务】组合的方式为我们提供了一个【在什么场景触发】【做什么任务】的自动化支持
我们现在已经做了,当收到QQ推送的由Test发出的内容为“打卡”的消息时,则启动需要签到的应用,过程中你可能需要解决如下问题
- 【授权】为确保QQ消息发过来会在通知栏显示,你可能需要给应用授权
- 【杀进程】QQ如果没有启动,是不会通知的,如果在前台开着也不会通知。我的做法是,先打卡QQ,然后在任务栏把他×掉
请确保以上测试通过,再进行下一步
现在我们需要解决怎么打卡的问题
考虑到登陆后一直使用,我们的登陆态不会过期,所以暂时我们的自动化脚本暂时不必包含登陆
而打卡通常就是点一下按钮就完事了。那么我们来完成它
在【任务】Tab页,打开我们的任务,点击右下角的“+”,
依次选择【代码】——【运行外壳】
输入 命令 【input tap 33 44】 并勾选【使用Root】
这个命令意思是在屏幕上坐标为 33,44点一下
这个坐标如何获取呢?
打开模拟器【设置】,搜索【指针】,选择【指针位置】开启【开发者】和【指针位置】
开启后,会多出如图一栏,你在屏幕上的点击,将会显示坐标,其中X,Y就是我们需要的坐标
获取你需要点击打卡按钮的坐标,修改刚填写的33 44
现在你已经会点击APP里的任意地方了,我们再来理一理关于打卡,我们需要做的事情
- 打开应用
- 延时(为了避免应用打开了,但是页面没加载好啥的,或者你可能还需要点击下【获取定位】)
- 点击【打卡】
- 延时(为了等打卡结果出来)
- 截图(为了确保是打卡成功了,后面可以发到你的QQ上来确认)
- 延时(为了等截图完成)
- 打开QQ(为了把截图发回去)
- 点击要回复的QQ(可以在QQ里置顶聊天,确保位置不变)
- 点击【选择图片按钮】
- 延时
- 点击【选择图片】因为用模拟器,可以确保没有其他图片,而我们截图的图片每次是覆盖,所以位置固定,可以点击固定位置来选择这个图片
-
延时
- 点击【发送】按钮
- 延时
- 点击【返回】按钮
- 延时
- 点击【左上角自己的头像】(为了弹出菜单页面)
- 延时
- 点击【设置】按钮
- 点击【账号管理】选项
- 延时
- 点击【退出QQ】选项
- 延时
- 点击【确认】按钮(退出QQ,如果不退出QQ,则再次发消息,因为QQ在前台,消息会直接到QQ里,不会进通知栏)
以上我们总得来说也就用了几个简单的命令
【点击指定位置】 input tap x y
【截图】screencap -p /sdcard/ImgCheck/screen.png
【延时】sleep 秒数
尝试下,用QQ,给模拟器登陆的QQ发送“打卡”指令,测试下是否可行吧
本文纯属娱乐,采用本博文章提供的解决方案,风险读者自担。
所造成的损失,如程序,文件,数据造成损失和混坏,博主不承担责任。
转载本博文章须在文章明显处注明原文的链接和作者信息。便于读者找到原文的更新版。