木匠家里没椅子?十年程序员终于给自己写了个挂机脚本
起因:被广告逼出来的开发动力
我一直在玩几款手游,你懂的,现代游戏的套路:每日签到、挂时长、领奖励......不肝不行,但真没那么多时间和精力盯着手机点点点。
于是我找了个现成的挂机脚本,用了一段时间,效果还不错。直到有一天------
弹窗广告,一个接一个。
想去广告?可以啊,128 元终身会员了解一下。
我盯着付款页面,脑子里突然蹦出一句老话:
"木匠家里没椅子"
学软件开发都十年了,给公司写过无数需求,给客户做过各种项目,唯独从来没给自己做过一个真正属于自己的工具。
于是我决定:自己写一个挂机脚本。
选型:为什么选 AutoX.js?
既然要做 Android 自动化,技术选型就摆在眼前:
| 方案 | 优点 | 缺点 |
|---|---|---|
| ADB + Python | 灵活强大 | 需要电脑,不便携 |
| Appium | 专业测试框架 | 配置复杂,重量级 |
| AutoX.js | 轻量、纯手机运行、JavaScript | 生态较小,文档不全 |
最终选了 AutoX.js,原因很简单:
- 纯手机运行,不需要电脑
- JavaScript 语法,上手快
- 内置 PaddleOCR,支持文字识别(这个很关键)
- 开源免费,社区活跃
需求分析:我到底要什么?
在动手之前,我先列了个清单:
核心功能
- ✅ 自定义操作序列(点击、滑动)
- ✅ 支持 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

第四步:配置分享功能
为了方便我其他设备使用,我做了两种分享方式:
- 文件分享:导出 JSON 文件,通过微信/QQ 发送
- 剪贴板分享:复制 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+ 设备上稳定运行
- ⚠️ 旧设备兼容性差
- ⚠️ 没有多余的测试机
- ⚠️ 主力机没空拿来挂机
- ⚠️ 维护成本高于预期
实际使用体验:偶尔拿出来用一下,大部分时候还是看广告......
结果就是:做了一半,然后放弃。
后记:给想做个人项目的你
如果你也想给自己做个工具,我的建议是:
- 先评估投入产出比:你的时间值多少钱?
- 考虑维护成本:做完之后还要持续维护
- 准备好测试环境:多设备、多系统版本
- 不要盲目依赖 AI:小众技术栈 AI 帮不上忙
- 接受不完美:个人项目很难做到完美
最重要的是:享受过程,而不是结果。
即使最后回去看广告了,但至少我知道:
木匠家里没椅子,不是因为不会做,而是因为做椅子比买椅子更贵。
P.S. 那 40 美元的 Opus 4.6 学费,就当交了个"AI 不是万能的"的学费吧 🤡
P.P.S. 如果你看到这里,说明你也是个喜欢折腾的程序员。欢迎评论区分享你的"木匠椅子"故事。