开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天
qq空间自动点赞功能
脚本使用autojs开发,需要有js或其他面向对象语言编程基础
还不知道autojs是什么?看看这个👇
Auto.js入门介绍,用自动化解放双手! - 掘金 (juejin.cn)
话不多说,直接开始!
这里不再赘述开发环境的安装,直接进入开发步骤
我们实现自动点赞功能的思路——脚本打开qq,自动点击动态栏,找到点赞控件完成点击后下滑,重复步骤,下面我们一步一步实现
首先,最简单的一步,通过launchApp("app名称")打开app:
launchApp("QQ");
接下来,我们要实现动态栏的点击,就要先找到动态栏对应的控件:
点开Auto.js的小绿图标(如果没有小绿图标,记得在Auto.js软件中开启悬浮窗功能),点击蓝色按钮,选择布局范围分析
选中动态栏控件:
选择查看控件信息,找到里面的text属性,点击复制,接下来我们就可以通过text函数来在脚本中获取控件,findOne表示找到页面中的第一个该名称的控件,继续调用click完成点击
text("动态").findOne().click();
不过这时候要注意两个问题:
- 脚本执行速度很快,但你的手机未必有那么快,很有可能在点击时qq还没有打开
- 有些控件被设为不可点击(clickable=false),这时运行就会发现毫无效果
怎么解决呢?
问题一:
第一种,我们可以采用暴力法,调用sleep使程序暂停执行一段时间:
sleep("1000");
第二种,我们可以等待控件加载完毕(使用控件的text属性):
text("动态").waitFor();
这样脚本就会等待控件加载完毕后再进行下一步操作。
问题二:
既然他不让我们通过获取的控件来点击,那我们就获取控件的坐标,通过点击坐标来完成任务
click(text("动态").findOne().bounds().centerX(),text("动态").findOne().bounds().centerY())
其中bounds是获取控件的坐标信息,在控件属性中你也能找到一个名为bounds的属性,它由四个值构成:
(left, top, right, bottom)
分别对应距左、上、右、下方的距离
centerX和centerY帮助我们获取其中的X和Y坐标值,通过click(X, Y)来实现该坐标的点击
以上,我们实现了打开qq并自动跳转至动态页的功能,接下来完成点赞:
- 获取👍控件,我们发现它的clickable属性为true,id为c7p
- find方法获取所有👍,将其存入一个数组中
- 遍历数组完成点赞,注意点赞前先判断一下enabled是否为false,防止点击两次
- 点击完就继续向下滑动,使用swipe(起点横坐标, 起点纵坐标, 终点横坐标, 终点纵坐标, 滑动时间) 来完成,注意这里的坐标需根据自己的设备去设计,打开开发人员选项后开启指针位置就可查看触摸的坐标
launchApp("QQ");
text("动态").waitFor();
click(text("动态").findOne().bounds().centerX(),text("动态").findOne().bounds().centerY());
function like(){
let likes = id("c7p").find();
likes.forEach(like => {
like.click();
sleep(random(500,2000));//保险起见,每次暂停随机时间,使操作更像人为
})
swipe(400, 2100, 400, 100, 1000);
}
while(true){
like();
}
现在我们就完成了一个简陋的自动点赞脚本,但运行的时候我们会发现,它没有判断是否已点赞,有时会造成点赞取消,接下来我们解决这个问题
思路:
- 获取截图权限
- 点赞前先获取每个点在控件的坐标信息(bounds属性)
- 对比控件中间的颜色,未点赞时为白色,但由于显示可能有出入,我们使用模糊查询images.detectsColor()
launchApp("QQ");
text("动态").waitFor();
click(text("动态").findOne().bounds().centerX(),text("动态").findOne().bounds().centerY());
//获取截图权限
if(!requestScreenCapture()){
toast("请求截图失败");
exit;
}
function like(){
let likes = id("c7p").find();
likes.forEach(like => {
//截图取色的控件必须要在可视范围内,所以要加判断
if(like.bounds().centerY()<=2100&&like.bounds().centerY()>=240){
let notEnabled = images.detectsColor(captureScreen(), "#ffffff", like.bounds().centerX(), like.bounds().centerY());
if(notEnabled) like.click();
sleep(random(500,2000));//保险起见,每次暂停随机时间,使操作更像人为
}
})
swipe(400, 2100, 400, 100, 1000);
}
while(true){
like();
}
大功告成,让手机自动点赞去吧!