我成了🤡, 因为不想看广告,花了40美元自己写了个鸡肋挂机脚本

木匠家里没椅子?十年程序员终于给自己写了个挂机脚本

起因:被广告逼出来的开发动力

我一直在玩几款手游,你懂的,现代游戏的套路:每日签到、挂时长、领奖励......不肝不行,但真没那么多时间和精力盯着手机点点点。

于是我找了个现成的挂机脚本,用了一段时间,效果还不错。直到有一天------

弹窗广告,一个接一个。

想去广告?可以啊,128 元终身会员了解一下。

我盯着付款页面,脑子里突然蹦出一句老话:

"木匠家里没椅子"

学软件开发都十年了,给公司写过无数需求,给客户做过各种项目,唯独从来没给自己做过一个真正属于自己的工具。

于是我决定:自己写一个挂机脚本。


选型:为什么选 AutoX.js?

既然要做 Android 自动化,技术选型就摆在眼前:

方案 优点 缺点
ADB + Python 灵活强大 需要电脑,不便携
Appium 专业测试框架 配置复杂,重量级
AutoX.js 轻量、纯手机运行、JavaScript 生态较小,文档不全

最终选了 AutoX.js,原因很简单:

  1. 纯手机运行,不需要电脑
  2. JavaScript 语法,上手快
  3. 内置 PaddleOCR,支持文字识别(这个很关键)
  4. 开源免费,社区活跃

需求分析:我到底要什么?

在动手之前,我先列了个清单:

核心功能

  • ✅ 自定义操作序列(点击、滑动)
  • ✅ 支持 OCR 文字条件判断(比如"出现'签到'按钮才点击")
  • ✅ 无限循环执行
  • ✅ 可视化坐标选择(拖拽靶心,不用手动输入数字)
  • ✅ 配置导出/导入(方便多设备使用)

易用性

  • ✅ 悬浮窗界面,可最小化
  • ✅ 配置保存/加载/分享
  • ✅ 音量键紧急停止

防检测

  • ✅ 随机坐标偏移
  • ✅ 随机延迟偏移

开发过程:从 0 到 1

第一步:搭建项目结构

我把项目拆成了 4 个模块:

bash 复制代码
autoLoop/
├── main.js           # 入口文件
└── modules/
    ├── config.js     # 配置管理(保存/加载/分享)
    ├── engine.js     # 执行引擎(循环/OCR/点击/滑动)
    ├── picker.js     # 坐标拾取(拖拽靶心)
    └── ui.js         # 主界面(悬浮窗)

模块化设计的好处:代码清晰,方便维护和扩展。

第二步:实现坐标拾取

我做了个可拖拽的靶心

javascript 复制代码
// picker.js 核心逻辑
function showPicker(callback) {
    var window = floaty.rawWindow(
        <frame gravity="center">
            <img id="target" src="data:image/png;base64,..." 
                 w="80" h="80" alpha="0.8"/>
        </frame>
    );
    
    // 拖拽逻辑
    var x = device.width / 2, y = device.height / 2;
    window.target.setOnTouchListener(function(view, event) {
        switch (event.getAction()) {
            case event.ACTION_MOVE:
                x = event.getRawX();
                y = event.getRawY();
                window.setPosition(x - 40, y - 40);
                break;
            case event.ACTION_UP:
                callback(Math.round(x), Math.round(y));
                window.close();
                break;
        }
        return true;
    });
}

第三步:集成 OCR 文字识别

AutoX.js 内置了 PaddleOCR,但文档很少,我踩了不少坑:

javascript 复制代码
// engine.js OCR 检测
function checkTextCondition(text) {
    if (!text) return true;
    
    var img = captureScreen();
    if (!img) return false;
    
    var results = gmlkit.ocr(img, "zh");
    img.recycle();
    
    if (!results) return false;
    
    for (var i = 0; i < results.length; i++) {
        if (results[i].text.indexOf(text) !== -1) {
            return true;
        }
    }
    return false;
}

坑点提醒

  • 首次 OCR 会很慢(2~3 秒),后续会快很多
  • 小字和艺术字体识别率低,建议用包含匹配而非精确匹配
  • 记得 img.recycle() 释放内存,否则会 OOM

第四步:配置分享功能

为了方便我其他设备使用,我做了两种分享方式:

  1. 文件分享:导出 JSON 文件,通过微信/QQ 发送
  2. 剪贴板分享:复制 Base64 编码的配置,粘贴给朋友
javascript 复制代码
// config.js 分享逻辑
function shareConfig() {
    var json = JSON.stringify(currentConfig, null, 2);
    var path = "/sdcard/AutoLoop/config_" + Date.now() + ".json";
    files.write(path, json);
    
    app.startActivity({
        action: "android.intent.action.SEND",
        type: "application/json",
        extras: {
            "android.intent.extra.STREAM": "file://" + path
        }
    });
}

翻车现场:40 美元买来的三重暴击

开发过程中,我当了甩手掌柜, 但是事实给了我3个暴击。

第一重暴击:AI 翻车

Opus 4.6 对 AutoX.js 这种小众框架的支持几乎为零,生成的代码看起来很专业,实际运行全是 bug。我花了整整两天时间调试 AI 生成的代码,前前后后花了40美元的token.

第二重暴击:兼容性地狱

代码写完了,在我的主力机(Android 11)上跑得很完美。结果拿到旧手机(Android 7)上一测试------

  • 悬浮窗显示异常
  • OCR 识别失败
  • 部分 API 不支持

我的主力机每天都要用,不能拿来挂机;旧手机又跑不起来。进退两难。

第三重暴击:现实妥协

折腾了一个周末,最终发现:

  • 要兼容旧设备,需要大量适配工作
  • 测试机不够用,主力机不敢用
  • 时间成本远超预期

结局:鸡肋

食之无味,弃之可惜。

最后我还是老老实实回去看广告了。那个 128 元的终身会员,现在看起来也没那么贵了......

我成了小丑 🤡


最终效果(理想 vs 现实)

理想中的样子

经过一周的开发,AutoLoop 终于完成了:

  • ✅ 可视化添加操作(拖拽选位置)
  • ✅ OCR 文字条件判断
  • ✅ 无限循环执行
  • ✅ 配置保存/加载/分享
  • ✅ 悬浮窗 + 最小化
  • ✅ 随机偏移防检测
  • ✅ 音量键紧急停止

现实中的样子

  • ⚠️ 只能在 Android 11+ 设备上稳定运行
  • ⚠️ 旧设备兼容性差
  • ⚠️ 没有多余的测试机
  • ⚠️ 主力机没空拿来挂机
  • ⚠️ 维护成本高于预期

实际使用体验:偶尔拿出来用一下,大部分时候还是看广告......

结果就是:做了一半,然后放弃。

后记:给想做个人项目的你

如果你也想给自己做个工具,我的建议是:

  1. 先评估投入产出比:你的时间值多少钱?
  2. 考虑维护成本:做完之后还要持续维护
  3. 准备好测试环境:多设备、多系统版本
  4. 不要盲目依赖 AI:小众技术栈 AI 帮不上忙
  5. 接受不完美:个人项目很难做到完美

最重要的是:享受过程,而不是结果。

即使最后回去看广告了,但至少我知道:

木匠家里没椅子,不是因为不会做,而是因为做椅子比买椅子更贵。


P.S. 那 40 美元的 Opus 4.6 学费,就当交了个"AI 不是万能的"的学费吧 🤡

P.P.S. 如果你看到这里,说明你也是个喜欢折腾的程序员。欢迎评论区分享你的"木匠椅子"故事。

相关推荐
萧曵 丶5 小时前
Vue 中父子组件之间最常用的业务交互场景
javascript·vue.js·交互
冬奇Lab6 小时前
Android系统启动流程深度解析:从Bootloader到Zygote的完整旅程
android·源码阅读
Amumu121386 小时前
Vue3扩展(二)
前端·javascript·vue.js
NEXT066 小时前
JavaScript进阶:深度剖析函数柯里化及其在面试中的底层逻辑
前端·javascript·面试
牛奶8 小时前
你不知道的 JS(上):原型与行为委托
前端·javascript·编译原理
泓博8 小时前
Android中仿照View selector自定义Compose Button
android·vue.js·elementui
牛奶8 小时前
你不知道的JS(上):this指向与对象基础
前端·javascript·编译原理
牛奶8 小时前
你不知道的JS(上):作用域与闭包
前端·javascript·电子书
zhangphil9 小时前
Android性能分析中trace上到的postAndWait
android
十里-9 小时前
vue2的web项目打包成安卓apk包
android·前端