持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
1、前行提要
事情是这样的,我在玩某易的一款养成类游戏的时候,每天要做好多固定任务,很浪费时间。于是就上网找到了这款自动化工具 Hamibot,它有很多强大的功能,比如说OCR、以图找图、找色、文件操作等等。同时这些功能是已经封装好的API,我们只需要编写 JavaScript 脚本即可。可以把它理解为一个只需要写JS代码就能模拟手机操作、调用安卓API的自动化工具。
2、开发流程
下面就为大家介绍下,一个自动脚本的开发流程,以及我在实际编写中遇到的一些问题,避免踩坑。
2.1、注册账号、安装APP
首先,我们需要在手机上安装 Hamibot APP,它是一个基于 AutoJS 开源的项目,然后在其官网上注册账号,并于手机配对。同时我们编写的脚本需要上传到其官网上,才能在手机上运行。(配对好之后,运行脚本时,脚本文件会传输到手机上运行。这里,其官网就相当于服务端,但是这个服务端并没有开源,大家如果有需要而已自行编写服务端接口。)
在手机APP上输入配对码即可完成配对。
2.2、实战
2.2.1、常用API
1、唤起APP
//唤起APP有两种方式
//1、通过APP名称
// 启动 微信
launchApp('微信');
//但是,如果手机上的应用双开了,那么通过APP名称就只会打开其中一个。这个时候就用到了根据包名启动
//2、通过包名
launch(packageName);
launchPackage(packageName)
2、获取应用包名
这个功能就比较实用了,我们可以根据APP名称获取到应用包名。
let packageName = getPackageName('微信'); // 返回 com.hamibot.hamibot
console.log(packageName);
3、截图
一般来说,我们想要点击或者触摸手机界面上的某些内容或者控件时,就需要先把当前页面截图,然后进行OCR或者以图找图,找到目标空间的坐标或者其ID,然后再模拟具体操作。
// 请求截图权限 true标识横屏
if (!requestScreenCapture(true)) {
setLog("申请截图权限失败");
home();
exit();
}
//截图有两种,一种是提供图片保存路径,另一种是不保存截图,直接返回image对象
//1、先将图片保存到本地
let path = "/storage/emulated/0/Pictures/Screenshots/" + i + ".jpg";
captureScreen(path);
//得到image对象
let img = images.read(path);
// TODO 具体操作
// 回收image对象
img.recycle();
//2、直接得到image对象
let img = captureScreen();
截图后,拿到image对象就可以进行OCR了,这里我用荣耀V20执行的脚本,遇到了一个非常诡异的问题,就是在等待游戏加载的时候会进行循环截图OCR,然后OCR的结果总是第一张截图的,后来换成了小米手机就好了。
4、网络请求
在脚本执行完或者执行过程中,我们需要将执行情况发送通知到微信或者钉钉机器人中。
/**
* 通过钉钉机器人推送消息
* @param {*} title 标题
* @param {*} msg 内容
*/
function sendMsg(title, msg) {
http.post(
"https://oapi.dingtalk.com/robot/send?access_token=",
{
msgtype: "text",
text: {
content: title + "\n\n" + msg,
},
},
{
contentType: "application/json",
}
);
}
2.2.2、APP设置
这里我们一定要打开无障碍服务,同时也可以打开悬浮窗,悬浮窗中有个布局分析功能,可以帮助我们获取到目标区域的位置信息、详细信息等。
3、最后
Hamibot 的官网上有详细的开发文档,只需要懂得基本的JS知识,就可以写脚本了。Github上也有很多开源的脚本,大家也可以参考下。😎