遊戲自動化腳本 開發經驗分享

背景

技術棧:Auto.js + 安卓設備無障礙訪問 不需Rootgit

實現功能:【三國殺十週年】公會自動擂鼓,暫時只實現了這個。後續有空再更新其餘任務邏輯github

思路概覽:藉助OCR功能,進行頁面控件拆解,以及頁面狀態分析(任務完成狀況),而後經過Auto.js進行按鈕點擊,完成相應任務。json

項目目錄

.
├── 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的網絡圖片功能,進行分析ui

百度OCR有好幾個不一樣的場景,經調試,網絡圖片的OCR在此場景下最爲精確,基本能精確轉譯90%的文字內容

OCR調用後,返回的數據內容,都存儲在/asset/page/文件夾下(OCR價格較貴,且返回時間過長,所以事先進行了數據緩存,而非每次腳本運行時調用)。數據格式以下this

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

相關文章
相關標籤/搜索