背景

技术栈:Auto.js + 安卓设施无障碍拜访 不需Root

实现性能:【三国杀十周年】公会主动擂鼓,临时只实现了这个。后续有空再更新其余工作逻辑

思路概览:借助OCR性能,进行页面控件拆解,以及页面状态剖析(工作实现状况),而后通过Auto.js进行按钮点击,实现相应工作。

我的项目目录

.├── README.md├── main.js // 入口逻辑├── package.json├── project.json├── secret.js // 百度Token └── src    ├── asset // 资源文件    │   ├── demo // OCR测试应用    │   │   └── index.js    │   ├── img    │   │   ├── WechatIMG604.jpeg    │   │   └── WechatIMG605.jpeg    │   └── page // 页面配置信息,通过OCR对页面进行剖析生成,次要是JSON格局,记录控件信息    │       ├── README.md    │       ├── gonghui //公会页面    │       │   ├── gonghui.js    │       │   └── huodong.js    │       ├── shouye.js // 首页    │       └── wujiang // 武将页面    │           └── wujiang.js    ├── config.js    ├── lib    │   └── utilTool.js // 罕用办法    └── task // 工作逻辑 相互隔离        ├── gonghui.js // 公会工作逻辑        ├── renwu.js // 以下均为其余工作,未实现        ├── weixin.js        └── zhuolu.js

逻辑实现

公会工作逻辑

var utilJS = require("../lib/utilTool");var utilTool = utilJS.utilTool;var shouye = require("../asset/page/shouye");var gonghui = require("../asset/page/gonghui/gonghui");var huodong = require("../asset/page/gonghui/huodong");// 公会工作function GonghuiTask() {}GonghuiTask.prototype.init = function () {    utilTool.clickButton(shouye, "公会"); // 外部办法,点击某控件    utilTool.clickButton(gonghui, "流动");    while (!utilTool.findText("耗费元宝20")) { // 如果有 耗费元宝20 等字样,阐明收费擂鼓曾经达到下限        // 阐明还能够擂鼓        utilTool.clickButton(huodong, "擂鼓");    }    utilTool.clickBack();};module.exports = {    gonghuiTask: new GonghuiTask(),};

性能比较简单,就是进入首页后,点击公会、流动等按钮,胜利进入到擂鼓工作页面。

而后检测以后的工作状态,是否能够擂鼓。

utilTool.findText("耗费元宝20")这一行,具体办法如下

UtilTool.prototype.findText = function (text) {    var page = this.captureWithOcr("basic"); // 外部封装办法,获取以后页面截图,并启用OCR剖析,查看以后页面的相干文字描述    var result = page.find(function (item) {        if (item.words == text) {            return true;        }    });    return result;};

难点剖析

手游版三国杀,无奈通过Auto.js自带的工具进行控件剖析,也无奈通过click("流动")框架办法,点击某按钮控件。

整个游戏页面都进行包装,且所有的属性都没有裸露进去,因而通过text("xx文案") 或者其余办法,都没法很好的定位到各个控件。因而本脚本,是采取了百度OCR的网络图片性能,进行剖析

百度OCR有好几个不同的场景,经调试,网络图片的OCR在此场景下最为准确,根本能准确转译90%的文字内容

OCR调用后,返回的数据内容,都存储在/asset/page/文件夹下(OCR价格较贵,且返回工夫过长,因而当时进行了数据缓存,而非每次脚本运行时调用)。数据格式如下

module.exports = [    {        words: "函件",        location: { top: 31, left: 1976, width: 68, height: 33 },        chars: [],    },    {        words: "充值",        location: { top: 29, left: 2136, width: 65, height: 32 },        chars: [],    },    {        words: "世界",        location: { top: 996, left: 130, width: 70, height: 34 },        chars: [],    },    {        words: "迹的来,可焚城",        location: { top: 1007, left: 271, width: 182, height: 26 },        chars: [],    },    {        words: "更多",        location: { top: 1031, left: 1021, width: 54, height: 30 },        chars: [],    },    {        words: "包裹",        location: { top: 1031, left: 1142, width: 55, height: 29 },        chars: [],    },    {        words: "好友",        location: { top: 1032, left: 1264, width: 57, height: 28 },        chars: [],    },        ...];

数据内容次要是涵盖了对应的文字内容,以及文字地位,大小等。有了这个数据,就能够达到咱们想要的成果,借助Auto.js,让脚本依照咱们所想,进行某个区域的点击,具体方法如下

// 遍历地位,点击按钮UtilTool.prototype.clickButton = function (arrays, name) {    var flag = false;    for (var i = 0; i < arrays.length; i++) {        var item = arrays[i];        if (item.words.includes(name)) {            // 阐明存在以后按钮            click(                item.location.left + item.location.width / 2,                item.location.top + item.location.height / 2            );            toast("点击了按钮:" + name);            flag = true;            sleep(1000);            break;        }    }    if (!flag) {        toast("没有遍历到按钮");    }};

至此,整个脚本的次要逻辑介绍结束

结语

本代码仅为了试验 OCR + Auto.js,能实现怎么样的脚本性能。当初看来成果应该还不错,其余的APP利用,也能够参照此逻辑,疾速进行脚本开发。

另,像这种简略的工作,也能够借助XX录屏精灵等工具进行实现,但比照起来,通过脚本的形式开发,会更加灵便。比方当咱们想判断以后的工作状态,或者页面逻辑时,能够借助脚本+OCR的性能,疾速剖析,以便施行咱们想要的逻辑。

代码仓库:https://github.com/qiangzi772... 后续应该不会再更新此仓库,仅为验证应用。

注:本仓库拉取到本地后,无奈失常运行,短少相干百度Token