木木脚本浏览器 JS 脚本自动化功能详解

本篇深入它的核心:脚本引擎——它支持什么 API、坐标系统怎么算、脚本怎么写怎么装,最后用一个完整的实战脚本把所有知识点串起来。

一、先说结论:你的油猴脚本,大概率能直接跑

木木脚本浏览器完整实现了 Greasemonkey 风格的脚本规范。一个标准用户脚本(xxx.user.js)由元数据头代码主体组成:

// ==UserScript==
// @name         我的第一个脚本
// @namespace    mumudroid.demo
// @version      1.0
// @description  在页面右上角加一个悬浮按钮
// @author       yourname
// @match        https://www.example.com/*
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';
    GM_addStyle('.demo-btn { position: fixed; top: 40px; right: 10px; z-index: 99999; }');
    var btn = GM_addElement('button', { class: 'demo-btn', textContent: '点我' });
    btn.addEventListener('click', function () {
        GM_toast('按钮被点击了');
    });
})();

支持的元数据

字段 作用
@match URL 匹配规则,命中才会注入脚本;支持多条
@run-at 注入时机:document-start / document-body / document-end / document-idle
@require 引入第三方 JS 库(如 jQuery),每行一个 URL
@resource 预加载资源,脚本内用 GM_getResourceText / GM_getResourceURL 取用
@name / @version / @author / @description 脚本信息,展示在脚本管理列表中

支持的 GM API

经典风格(Greasemonkey 1/2/3)与 GM.* 风格(Greasemonkey 4)均支持

API 作用
GM_getValue / GM_setValue / GM_deleteValue / GM_listValues 脚本私有键值存储(按脚本隔离,持久化在本地)
GM_xmlhttpRequest 跨域网络请求(不受浏览器同源策略限制)
GM_addStyle 注入 CSS
GM_addElement 向页面添加元素
GM_getResourceText / GM_getResourceURL 读取 @resource 预载资源
GM_log 输出日志到控制台
GM_info 脚本自身信息(名称、版本等)
GM_registerMenuCommand / GM_unregisterMenuCommand 注册菜单命令

也就是说,网上大量公开的 PC 端油猴脚本(去广告、破解复制限制、页面美化、网盘直链……)复制过来基本就能用。

二、重点:原生自动化 API(六件套)

标准油猴 API 只能"改网页"。木木脚本浏览器在这之上扩展了六个原生函数,让脚本可以操作整个屏幕——这是它和其它移动端脚本浏览器最大的区别。

2.1 GM_toast(text) —— 弹 Toast

GM_toast('签到完成');

2.2 GM_click(x, y) —— 模拟屏幕点击

GM_click(0.5, 0.5);   // 推荐写法:点击屏幕正中心(归一化坐标)
GM_click(540, 960);   // 已知屏幕为 1080x1920 时,也支持像素坐标

2.3 GM_swipe(x1, y1, x2, y2) —— 模拟滑动手势

GM_swipe(0.5, 0.7, 0.5, 0.3);   // 从屏幕 70% 高度处向上滑到 30% 处(模拟上滑翻页)

2.4 GM_getImage(left, top, width, height, quality) —— 屏幕截图

var base64img = GM_getImage(0, 0, 1, 0.5, 75);   // 截取屏幕上半部分,质量 75,返回 Base64

配合 GM_xmlhttpRequest 把截图上传到第三方 OCR / 图像识别接口,可以实现完全自定义的视觉识别方案。

2.5 GM_findOcrText(left, top, width, height, callback) —— 屏幕 OCR

识别指定区域的文字,异步返回每段文字的内容和屏幕坐标

GM_findOcrText(0.5, 0.5, 0.5, 0.5, function (data) {
    // data 是数组,每个元素形如:
    // { left, top, width, height: 文本区域左上角与宽高,
    //   x, y: 文本中心点坐标, text: 识别出的文字 }
});

2.6 GM_findColor(color, offset, x_step, y_step, left, top, width, height, callback) —— 屏幕找色

在指定区域内按步进扫描,找到第一个匹配的颜色点:

GM_findColor('#ffffff', 5, 3, 3, 0, 0, 1, 1, function (data) {
    // 找到时 data 形如 { x: 色值x坐标, y: 色值y坐标 }
});
参数 说明
color 目标颜色,如 '#ff5722'
offset 允许的颜色误差范围(RGB 各通道)
x_step / y_step 扫描步进像素,越大越快但越可能漏检
left, top, width, height 搜索区域(归一化或像素均可)

找色适合识别没有文字的图标、色块、开关状态——比 OCR 更快更轻。

三、坐标系统:归一化优先

所有原生 API 的坐标参数都支持两种写法:

写法 范围 说明
归一化坐标(推荐) 0.0 ~ 1.0 屏幕宽高的比例,0.5 即正中心。换设备、换分辨率脚本照样能用
像素坐标 > 1 绝对像素值,适合从 OCR / 找色结果直接回传的场景

坐标系原点在屏幕左上角,x 向右、y 向下。

一个重要技巧:GM_findOcrText / GM_findColor 返回的就是屏幕像素坐标,可以直接传给 GM_click / GM_swipe,不需要换算。这就形成了"看到 → 点到"的闭环:

GM_findOcrText(0, 0, 1, 1, function (data) {
    for (var i = 0; i < data.length; i++) {
        if (data[i].text.indexOf('签到') >= 0) {
            GM_click(data[i].x, data[i].y);   // OCR 结果坐标直接点击
            break;
        }
    }
});

四、脚本从哪来:三种创建方式

打开「脚本」页 → 「创建脚本」,有三种入口:

1. 通过引导创建(零基础友好)

向导式表单:填脚本名称、版本、作者、描述,配置 URL 匹配规则(每行一条,如 https://www.example.com/*),需要的话填引入的第三方 JS 库,最后粘贴代码——APP 自动生成规范的脚本头,帮你避开元数据格式坑。

2. 导入脚本

.user.js 文件或代码文本直接导入,APP 解析元数据后入库。适合从网上下载的现成脚本、或在 PC 上写好传到手机的脚本。

3. 脚本仓库(一行代码都不用写)

内置第三方脚本市场,浏览 → 点击安装 → 完成。仓库脚本全部开源免费,也是学习脚本写法的最佳范本:安装后可以在脚本管理里查看和编辑它的源码。

脚本创建后随时可以在「脚本管理」中编辑(内置代码编辑器)、启用/停用、删除,登录账号后还能「备份脚本」到云端,换机时从「我的备份脚本」一键恢复。

五、注入模式:兼容模式 与 暴力模式

脚本注入由浏览器网络层拦截完成,针对不同网站提供两种策略(菜单 → 脚本注入):

  • 兼容模式(默认):拦截请求并重写注入,不改页面结构,兼容性好。
  • 暴力模式:改写 HTML 强制注入。当某些站点兼容模式注入无效(脚本不生效)时尝试,注意它可能改变页面内容结构。

调试脚本时还可以配合菜单里的控制台(查看 console.log / GM_log 输出)和源代码(查看实际注入后的页面源码)定位问题。

六、实战:自动签到脚本

需求:每天打开某网站时,自动识别页面上的"签到"按钮并点击,完成后弹提示。

// ==UserScript==
// @name         每日自动签到
// @namespace    mumudroid.demo.signin
// @version      1.0
// @description  打开页面后自动寻找"签到"按钮并点击
// @match        https://www.example.com/*
// @run-at       document-idle
// ==/UserScript==

(function () {
    'use strict';

    // 当天已签到则跳过(用 GM 存储做本地去重)
    var today = new Date().toISOString().slice(0, 10);
    if (GM_getValue('last_signin_' + location.host, '') === today) {
        return;
    }

    // 全屏 OCR,找"签到"字样
    GM_findOcrText(0, 0, 1, 1, function (data) {
        for (var i = 0; i < data.length; i++) {
            var item = data[i];
            if (item.text.indexOf('签到') >= 0) {
                GM_click(item.x, item.y);                       // 识别到就点
                GM_setValue('last_signin_' + location.host, today);
                GM_toast('今日已自动签到');
                return;
            }
        }
        // 第一屏没找到,向上滑动翻页后再试一次
        GM_swipe(0.5, 0.7, 0.5, 0.3);
        setTimeout(function () {
            GM_findOcrText(0, 0, 1, 1, function (data2) {
                for (var j = 0; j < data2.length; j++) {
                    if (data2[j].text.indexOf('签到') >= 0) {
                        GM_click(data2[j].x, data2[j].y);
                        GM_setValue('last_signin_' + location.host, today);
                        GM_toast('今日已自动签到');
                        return;
                    }
                }
            });
        }, 800);
    });
})();

这个 50 行的脚本用到了:元数据头、@match 命中、GM_getValue/GM_setValue 状态记忆、GM_findOcrText 屏幕识别、GM_click 模拟点击、GM_swipe 模拟滑动、GM_toast 结果反馈。每一行都是标准 JavaScript,会写 JS 就会写自动化。

提示:OCR / 找色 / 点击操作的是"屏幕",所以它们天然不依赖网页 DOM 结构——哪怕是 Canvas 渲染的游戏页面、WebApp、H5 活动页,只要人眼能看到,脚本就能识别和操作。

小结

  • 标准油猴 API(1/2/3 + 4 双风格)→ PC 脚本生态直接复用,改网页没问题
  • 原生六件套(点击/滑动/截图/OCR/找色/Toast)→ 操作整个屏幕,自动化没问题
  • 归一化坐标优先,OCR/找色结果可直接回传点击,形成识别-操作闭环
  • 引导创建 / 导入 / 脚本仓库三种入口,零基础也能起步


APP 脚本仓库中有开源免费脚本可以参考学习;遇到问题或想提需求,欢迎通过 APP 内"用户反馈"联系我们。