校园一卡通余额自动查询提醒脚本

校园一卡通余额自动查询提醒脚本
原文链接 https://sxdl.site/2023/08/02/202308021407/
背景
宿舍的水电费在晚上23:30到3:30这一时间段内是无法充值的,这就导致了经常半夜欠费停电停空调还无法充值的问题。学校提供的水电余额查询的唯一途径是企业微信的应用,且没有自动提醒的功能,因此自己开发一个程序用来定时自动查询余额然后发送微信提醒。
由于查询的 api 并不清楚,而且企业微信中的应用都需要身份验证,实在太麻烦。想着先尽快把功能实现,之后再考虑稳定性和扩展性,采用脚本的方式实现。
实现思路
设备选择
水电费查询的入口都在企业微信中,而企业微信只有Windows和移动客户端,没有Linux客户端。如果要放在服务器上跑的话环境配置十分麻烦,因此考虑将脚本放在本地设备上跑。本地设备需要确保在指定的时间段内保持开机并不被使用,因为脚本运行的时候不能对设备页面进行操作(脚本是按照步骤顺序运行的,外界操作会干扰脚本运行)。手头目前的设备有:两台笔记本,一台Windows,一台Ubuntu,一个华为平板,一个华为手机。其中Windows笔记本日常经常使用,另一台用作学习折腾和本地Linux环境,不方便重新刷系统,手机日常一直在用。平板倒是合适,一般从来不关机,平常只是用来记笔记用。最后就决定使用平板,在平板上跑脚本。
脚本工具
安卓平台上有个很不错的脚本工具,`Auto.js`,现在似乎已经停止维护了,还能用的有 [AutoX.js](http://doc.autoxjs.com/#/) 和 [OpenAuto.js](https://openautojs.github.io/#/). 本着对开源项目的偏好,我这里使用了 `OpenAuto.js`。
运行流程
预先登录企业微信和微信(用于消息提醒,可换用公众号或其他),脚本首先打开企业微信,找到查询的服务,查询到余额后将余额通过微信发送到指定聊天对话中(个人或群聊)。
环境准备
华为平板(HarmonyOS 3.0)
OpenAuto.js
企业微信
微信
一键锁屏(OpenAutojs没有提供锁屏的功能, 一键锁屏通过应用市场安装)
编写脚本
由于不同的环境脚本会有差异,不放详细代码了,只写关键的几个命令。详细说明查看[OpenAuto.js文档](https://openautojs.github.io/#/)
自动唤醒
用于从息屏状态中唤醒屏幕,然后解锁,注意必须没有密码,直接上滑解锁的那种。
```javascript
device.wakeUp();
```
手势
模拟上滑解锁或屏幕下滑,尝试使用过 swipe() 但是并不好用。
```javascript
gestures([350, [500, 1600], [500, 300]]); // 上滑
gestures([350, [500, 300], [500, 1600]]); // 下滑
```
其中`350`这个位置的参数指持续时间(毫秒),后面两个参数是起始点的坐标,默认屏幕是1080x1920像素。
等待
参数等待时间(毫秒),如果脚本出现问题,如某个控件找不到,可能是没有设置sleep,等待页面完全加载出来。
```javascript
sleep(1000);
```
控件点击
尝试了各种点击方法,发现只有一种能用(不是我不会用,是真的就找不到控件),直接通过文字点击控件。
```javascript
click("控件名称")
```
启动程序
```javascript
var appName = "应用名称"
launchApp(appName);
sleep(3000); // 记得添加以等待程序启动
```
OCR文字识别
先截图(需要获取权限,可以使用多线程自动允许),然后OCR提取文字
```javascript
if(!requestScreenCapture()){ // 获取截图权限
toast("请求截图失败");
exit();
}
sleep(1000);
var img = captureScreen();
const stringList = paddle.ocrText(img, true); // 识别到的文字列表
img.recycle(); // 回收图片,避免内存泄漏
```
多线程
在截图时,需要应用内获取权限,一般需要手动授权,也可以通过多线程自动授权。
```javascript
threads.start(function(){
sleep(1000);
click("允许");
})
```
界面操作
一些基础的界面操作
```javascript
home(); // 返回主菜单
sleep(1000);
back(); // 返回上一级
sleep(1000);
```
对话框输入
输入文本到当前页面中的对话框,用于微信发消息。
```javascript
input("message");
```
脚本调试
开发过程中,可能需要显示调试信息
```javascript
console.show(); // 显示控制台信息在应用上层,需要开启权限
toastLog("日志信息");
console.log("另一种方法,效果相同")
```
脚本退出
```javascript
exit();
```
运行脚本
首次运行脚本需要开启应用无障碍服务权限,点击运行即可。
设置定时任务
在 `OpenAuto.js` App 中可以设置脚本为定时任务。需要开启程序后台运行权限。
运行效果

后续
用了一个晚上,目前是基本实现了主要功能,后面考虑做一些稳定性和适用性的优化,简单列个Todo:
更多提醒方式(邮件,公众号,企业微信)
脚本打包成apk,其他用户可以开包即用
将查询结果发送到服务器上,服务器做一个余额变化统计