1 说明
因为玩游戏,想偷懒,做一些自动点击功能,看能否代替枯燥的点击时间。最早的自动游戏是很久以前在校园里玩Mud的时候编写的,可惜早已成为往事。
补充笔记仅作为原教程学习笔记,并非单一教程,主要是记录遇到的坑
如有其他问题,欢迎留言交流。
1.1 学习资料网址
通过官网可找到基本配置及文档说明:https://pro.autojs.org/
2. 补充笔记
2.1 参照文章下载及设置vs code
https://blog.autojs.org/2021/07/05/vscode-debug/
参照官方博客可下载及配置成功
补充笔记
使用客户端模式连接时,一直未能成功。只能使用服务器端模式。
2.2 关于无障碍服务
学习时用的是8.0版本,每次关闭auto.js之后都需要启用无障碍服务。
2.3 Hello World
在VSCode中,新建一个文件,选择文件类型为“javascript”,文件中仅有以下语句:
toast("Hello world")
按F5, 在手机屏幕中可以看到有Hello world的字样出现
2.4 打开一个APP
在hello world的基础上,尝试打开一个APP。就用最熟悉的微信为例,代码如下:
toast("Hello world")
app.launchApp("微信")
按F5,在手机上可以看到微信被打开
3. 遇到的问题合集
3.1 Click函数失效
学习第一天,就遇到这个click函数失效的问题,到处找资料没有头绪。开始怀疑是否下载的版本问题,找了历史版本,依然如此。这是最简单的函数,搞不定就无法进行下去。几乎要放弃了。
//代码一 - 有效的点击,可以进到下一个页面
var iconBiz = id("title_store_enter").findOne();
iconBiz.click()
//代码二 - 页面完全没有反应,并且检查过click返回为true
var iconBiz = id("title_store_enter").findOne();
click(iconBiz.bounds().centerX(), iconBiz.bounds().centerY())
后来想,找了各种资料,都没有这个问题,应该不是我的理解有误,试试另一个手机,发觉代码二起效了。
这个就实在是无解,可能跟手机型号或者系统有关,这个迟些研究,知道这种情况要换台手机就好
3.2 UIObject.bounds() 横坐标返回负坐标,或者超出屏幕的坐标
调试过程中,发现一些object的坐标是负数,或者超出屏幕范围,导致后续操作出错。这个属于正常现象,是因为页面有可以左右滑动的广告轮播页,查找的object在轮播时处于页面以外,所以X坐标会在屏幕以外。
遇到这种问题,有两种解决方案:
- 找到轮播框,左右滑动到需要查找的object在屏幕以内。但这个方式需要反复做的判断比较多,不推荐
- 一般轮播都是广告,需要查找的object主体一定是在列表页面有的,可以通过到指定列表,或者通过swipe把页面往下划到轮播图消失,再查找
3.3 Object.bounds() 纵坐标超出屏幕以外不多时
当纵坐标刚好在页面最下方,小荷才露尖尖角时,使用控件查找还是能查找到,但点击却是无效的。如果找不到,程序还是很容易判断的(使用null判断即可),但比较大的坑是刚好控件在屏幕下方边界值,使用程序可以正常范围坐标。这个时候直接使用点击就无效了。
经过观察,发现返回的坐标,如果是上述情况,控件的下坐标会小于上坐标(正常情况下,下坐标是大于上坐标的。见下公式:
正常屏幕以上:boundsInScreen=[444,1656][636,1716]
1716 > 1656,为正常的坐标位置
不正常屏幕以下:boundsInScreen=[444,1878][636,1812]
boundsInScreen=[444,2009][636,1812]
1812 < 1878, 1812 < 2009,为不正常的坐标。
解决方案:增加判断,如果找到的控件下坐标小于上坐标,使用swipe将屏幕向上滑动,使得控件能正常显示到页面上
3.4 UI模式下不能使用sleep
写好逻辑代码,要优化一下加上界面,发现在界面模式下直接调用函数时,如果有sleep延时语句,运行时会报错导致程序无法运行,会出现以下提示
Error: 不能在ui线程执行阻塞操作,请使用setTimeout代替
然而,使用setTimeout确实也无法解决问题。
解决方案:
使用新的线程执行,部分代码块如下。其中threads.start(main)中的main,是自定义的function man()函数
"ui";
var threadMain=null
ui.layout(
<vertical padding="16">
<button id="myThreadStart" text="启动程序" w="*" style="Widget.AppCompat.Button.Colored" />
<button id="myThreadStop" text="终止程序并退出" w="auto"/>
</vertical>
);
ui.myThreadStart.on("click", () => {
if(threadMain==null) {
threadMain = threads.start(main);
}else {
toast("程序已在运行,请点击停止");
}
});
ui.myThreadStop.on("click", () => {
if(threadMain==null) {
toast("没有程序在运行");
exit();
}else {
toast("程序线程已停止");
threadMain.interrupt();
threadMain = null;
exit();
}
});