以书蜗预约图书馆座位为例,简要介绍Auto.js脚本编写。
软件安装
推荐从以下3个网址提供的链接下载。Auto.js这样的自动化工具实际上可以读取到非常敏感的信息,所以最好不要下载非官网提供的文件。
开发者现在维护更新的版本,解决了一些Bug,提供了更丰富的功能,但是要付费才能用。
目前由其他开发者维护,但有一些问题没有修复。
不知道怎么从Github上下载文件的,可以用下面这个下载链接:http://120.25.164.233:8080/appstore/app/20211210103713.apk
可能会比较慢…
由于一些原因,这里虽然是官网,但只能下载到源码,没有可以直接安装的文件。如果既不想花钱,也不放心已经公开了源码的修改版,也可以自己打包官方源码,方法可以参考这篇《更新慢、弃坑了?实现 Android 应用自给自足:GitHub Actions 编译实例》 和作者的另一篇文章 《利用GitHub Action打包Apk文件》。
安装好后,启动软件,授予必要权限,新建2个文件,然后打开这段网址,复制Reading_19-59.js和Reading_19-50.js里的代码,一会儿就是基于二者进行修改。
脚本说明
这2个脚本本质上只是模拟正常的手动抢座流程而已。
Reading_19-50.js模拟的是19:50打开书蜗进入预约界面。这个脚本成功运行后,你可以返回你之前的App,但注意保持书蜗在后台运行,否则后面的脚本会出错。
Reading_19-59.js模拟的是19:59:57点击预约座位按钮的过程。
可以先想想上面的流程,这会帮助你理解下面修改代码的意义。
流程
下面针对需要手动修改的部分进行说明。
修改Reading_19-50
如果你想预约的座位不在下图所示区域内,即负二楼到二楼。

请直接删掉下面这段代码。
//滑动到指定楼层var widget1 = text("借阅部负二楼").className("android.widget.TextView").findOne(500);while (widget1 == null) {sleep(70);swipe(160, 1700, 160, 1300, 100);var widget1 = text("借阅部负二楼").className("android.widget.TextView").findOne(500);}
也可以不删——但这意味着你无法预约3楼和4楼的座位。反之,你删掉上述代码就意味着无法预约2楼及2楼以下的座位。
请注意,这个脚本有且只有这么一个地方要修改。
Reading_19-59.js
这个文件里要修改的也只有一个地方
var floor = className("android.widget.TextView").id("text_random_seat").bounds(551, 519, 826, 607).findOne()
把bounds(551, 519, 826, 607)替换为下面方法获取到的数据即可(注意不要删除.否则会报错)。

设置脚本运行时间
Reading_19-50.js的代码建议设置为推荐的19:50,实际上 19:55打开书蜗就有较为明显的卡顿,尽量早点准备。
Reading_19-59.js的代码请设置为19:59运行,不然一定会出错。
示例
基本概念说明
如果你此前完全没有编程基础,希望下面的解释能帮助到你。
控件
简单来说脚本就是替我们点的位置。
获取控件信息的详细步骤
打开Auto.js的悬浮窗功能,点击悬浮窗,选择布局分析,再选择布局范围分析,点击要识别的控件即可。
注意,如果是Auto.js和AutoX.js,获取到的控件信息是类似bounds = (529,99,639,253)这样的的格式,需要手动删除=,修改为bounds(529,99,639,253)这样的格式,再替换,不然会报错。

sleep()
有人可能注意到最后一个脚本,有大段重复的sleep(10000)代码,这只是让脚本在什么也不做的前提下,等待50秒,再唤起书蜗,发起预约。
如果你觉得提前十秒进入最后的预约界面还太早的话,可以修改为合适的时间。
但要注意,这个括号里面的数据的单位是毫秒,sleep(10000)是等待10秒,sleep(55000)是等待55秒,sleep(55)是等待55毫秒。
但不建议这样设置,官方文档强调sleep()的参数超过25秒,容易产生较大误差。
基本语法说明
以这段代码为例,从后向前进行说明,:
var floor = className("android.widget.TextView").id("text_random_seat").bounds(551, 519, 826, 607).findOne();
;是JavaScript语言的行标识符
findOne()是查找一个显示在手机屏幕上的控件,前面的className("android.widget.TextView").id("text_random_seat").bounds(551, 519, 826, 607)是这个控件的属性,也是查找这个控件的依据。
var floor =是JavaScript语言的赋值语句,为数据进行命名可以提高代码的可读性,也可以让脚本运行得更快。刚才通过findOne(),找到了一个要点的控件,现在通过var floor =将控件命名为floor,之后就可以通过floor.click()快速点击(不需要再去寻找一次控件)。
Bug
Auto.js和AutoX.js都有的问题。(短时间内多次)修改保存后,点击运行可能会提示missing ; before statement。
解决办法:先复制当前文件里的所有代码,粘贴到新文件即可。注意,这时候文档末尾一般会有多余的标点符号,删掉即可————在原文件进行修改不会被保存,必须要新建文件。
