ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Auto.js实战:从零编写自动刷视频领金币的安卓脚本

Auto.js实战:从零编写自动刷视频领金币的安卓脚本 不瞒大家说我第一次看到“刷宝”这类看视频赚金币的App时心里是拒绝的——手动滑视频太傻了。后来我才发现真正该拒绝的是“手动”这件事本身。如果你已经装了Auto.js或者正打算入坑安卓自动化这篇文章就是给你准备的我会完整拆解一个自动刷视频、自动领任务奖励的autojs脚本从环境配置到代码实现再到各种我踩过的坑全部摊开讲。这脚本的定位是“简单粗暴好用”不是说代码写得简陋而是思路直接滑动、等待、识别弹窗、点击奖励循环执行。你不需要懂复杂的Android开发有一点JavaScript基础就够了。文章里涉及的核心关键词就三个autojs、脚本、滑动翻页。我会把自动化的逻辑讲透让看完的人不光能跑起来还能自己改着玩。1. 项目背景与整体思路拆解1.1 这类看视频任务到底在做什么先说点实在的。像“刷宝”这类App它的商业化玩法不是让你真有看视频的快乐而是用“金币激励”换你的停留时长。你每滑动一个视频平台获得一次广告曝光你获得几个金币双方各取所需。从用户视角看任务无外乎这几类连续看视频达到指定时长领基础奖励看满多少个视频开宝箱或领额外金币每日签到攒连续签到天数不定时弹出的奖励气泡需要手动点一下偶尔弹出的广告、活动弹窗需要关掉才能继续刷。这些东西如果凭人类手指去操作一天下来就是在机械地重复。可如果换成脚本来做呢无非就是循环执行“滑动上滑、等几秒、发现按钮就点、发现弹窗就关”而已。所以这个项目的核心逻辑并不复杂真正复杂的是怎么让脚本在不同手机、不同分辨率、不同界面状态下都能稳定跑。这就要靠控件识别了。1.2 自动化方案的逻辑链条很多人第一次接触自动化第一反应是“模拟点击”用固定的坐标点屏幕。这个思路不是不行但有个致命问题手机分辨率不一样界面布局稍微一变坐标就全错位了。Auto.js走的是另一条路它基于Android的无障碍服务AccessibilityService可以直接读取界面上的控件树。什么叫控件树你看到的每个按钮、每个文本框、每张图片在系统眼里都是一个节点有自己的文本、类名、资源ID、坐标范围。脚本要做的是按文本或ID把这些节点找出来再执行点击或滑动。于是整个自动化方案的链条就变成了这样读取当前界面控件信息判断应该执行什么动作滑视频、点奖励、关弹窗执行动作加入随机延时循环回到第1步。用这个思路写出来的脚本兼容性远好于固定坐标方案哪怕换个手机只要App界面文本没大变基本都能跑。1.3 为什么脚本必须“拟人”这里必须插一句写auto.js脚本最重要的不是会多少API而是“别让行为看起来像机器”。很多平台的规则对自动化并不友好。如果你一秒内连刷十个视频、每次滑动间隔完全一致后台很容易识别出异常。所以脚本里一定要有随机性随机延时、滑动速度随机、偶尔停顿。拟人化不是为了作弊而是为了让自己编写的自动化工具更接近真实操作习惯。说白了就是你挂机跑一天行为和真人保持一致账号才不容易出问题。这个意识越早建立越好后面所有代码都会围绕这个思路来写。2. 工具选型与方案对比2.1 为什么我选了Auto.js安卓自动化工具其实不少为什么我首选Auto.js核心原因有三点第一直接用JavaScript写门槛低。JS的语法对新手友好而且Auto.js的中文文档和社区案例非常多。你随便搜一个功能基本都能找到对应的写法。第二能直接操控控件树。这意味着你可以通过文本、ID、描述来定位元素而不是只能靠坐标“盲点”。这对界面的适配性提升是巨大的。第三免费版基本够用。Auto.js在4.x时代有一个比较完整的免费版本日常自动化需求完全能覆盖就算你之后想用Pro版核心API差异也不大迁移成本不高。当然不是说要把它捧上天。它在不同安卓版本上的兼容性确实有坑尤其是Android 10以上的权限限制更严格。但这属于“能用成本解决问题”的范围后面我会讲怎么调。2.2 Auto.js版本与替代品怎么选现在网络上的Auto.js版本有点乱这里帮大家理一下Auto.js 4.x免费但项目已停更API偏旧不过简单的滑动、点击足够用Auto.js Pro 8.x/9.x收费功能更全支持Node.js运行、Web打包稳定性更好各类第三方fork版本比如改造版、内置模块增强版功能各异建议优先用官方来源的安装包。除了Auto.js还有按键精灵安卓版、触手精灵、Pure Script等同类工具。它们的区别大致是工具脚本语言是否基于无障碍控件识别能力上手难度Auto.jsJavaScript是强低按键精灵类Basic部分中低触手精灵图形化脚本是中低Pure ScriptKotlin/Java混合是强高如果你完全不会写代码按键精灵那种图形化积木可能更舒服但只要写过几行代码Auto.js会是效率和灵活度最均衡的选项。还有一点要提醒不要贪便宜用来路不明的破解版。破解版经常内置后门轻则弹广告重则窃取账号信息为省几十块钱冒这个险不划算。3. 环境准备与前置条件3.1 手机端配置三件套安装、无障碍、悬浮窗在写脚本前先把手机环境准备好。下面这三步很多人会漏导致脚本跑不起来或跑一半就停。安装Auto.js。去官网或者可信任的应用商店下载注意别下到山寨版。装完后打开App会引导你开启无障碍服务。这一步很关键不使用无障碍服务脚本就读取不到界面控件。开启无障碍服务的路径一般是手机设置 - 无障碍 - 已安装的服务 - 找到Auto.js - 开启。不同品牌路径略有差异但大致一致。开启悬浮窗权限。Auto.js的悬浮窗功能可以显示脚本运行状态有些版本还需要在悬浮窗中点击“启动服务”才能正常工作。在App里点“申请开启悬浮窗”然后在系统设置中给Auto.js授权。完成这三步后先别急着写脚本打开Auto.js自带的示例跑一下看看能否正常执行。如果提示“未开启无障碍服务”或“无法获取控件信息”大概率是服务没开成功需要重新开启或者重启Auto.js后再试。3.2 电脑端调试环境VS Code不装也行但装了真香Auto.js支持直接在手机上写代码但屏幕小、打字慢体验实在不好。我的习惯是用电脑写脚本再传到手机上运行。推荐一套免费的方案VS Code Auto.js插件。在VS Code中搜“Auto.js”插件安装后手机和电脑连同一个Wi-Fi用插件扫码连接手机就能在电脑上编辑脚本一键推送到手机运行。这在调试多文件项目时特别方便。这里顺带讲一个很多新手会卡住的问题在电脑上打开PowerShell执行某些命令时报“无法加载文件...因为在此系统上禁止运行脚本”。这个报错和Auto.js无关是Windows默认禁止运行.ps1脚本导致的。解决办法是以管理员身份打开PowerShell先输入Get-ExecutionPolicy查看当前执行策略如果需要修改执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned输入Y确认即可。改完之后电脑才能正常执行一些node命令或VS Code插件的辅助脚本。这个坑不填后面很可能被卡在环境配置上。3.3 首次运行前的自检清单准备跑脚本之前建议对照下面的清单逐项确认检查项说明不满足时的后果Auto.js安装并开启无障碍能读取界面控件脚本找不到任何按钮悬浮窗权限已授予能显示运行状态无法启动或运行后不可见手机后台锁定不让系统清理Auto.js进程运行一会脚本被杀掉关闭省电限制/智能限制允许后台保持息屏或切后台后脚本中断刷宝App已登录有账号状态才能刷任务脚本无法识别任务界面网络正常视频加载不卡滑动后无法进入下一视频自检清单的意义在于把环境问题和代码问题分开。脚本跑不起来九成是环境没配对而不是代码本身写错了。4. 核心脚本实现全拆解4.1 滑动引擎从死板的swipe到随机延时先写最基础的滑动功能。Auto.js里最常用的滑动API是swipe(x1, y1, x2, y2, duration)表示从起点滑到终点duration是耗时。假设你的手机屏幕宽为w高为h模拟手指从屏幕下方约78%的位置划到22%的位置就是一次快速上滑function swipeUp() { let w device.width; let h device.height; let startX w / 2; let startY h * 0.78; let endY h * 0.22; let duration 500 Math.floor(Math.random() * 300); // 500ms ~ 800ms swipe(startX, startY, startX, endY, duration); }这里为什么要用百分比而不是固定数值因为不同手机的分辨率差异很大用百分比计算坐标点脚本换设备后依然可用。另外duration随机化是为了避免每次滑动速度完全一样太机械化。接下来是随机等待。视频加载要时间金币动画要时间点击后跳转要时间。所以每滑一次等待时间也要随机function randomSleep(min, max) { let ms Math.floor(Math.random() * (max - min) min); sleep(ms); } // 每次滑动后等待5~9秒模拟真实观看 swipeUp(); randomSleep(5000, 9000);有朋友问过为什么等待要5秒以上因为短视频平台一般会统计“有效观看时长”你滑过去1秒就切下一个视频结算可能不算数。所以宁可多等几秒也不要滑得太频繁。4.2 控件定位与点击这句话别拼错滑动之后App经常会弹出奖励气泡比如“观看视频获得xx金币”“领取奖励”“我知道了”。这些UI元素都可以用文本定位。Auto.js定位控件的核心API是text()、textContains()、id()、desc()等再用findOne(timeout)拿到控件节点最后调用click()方法function tryClickText(keyword, timeout) { let node textContains(keyword).findOne(timeout || 1500); if (node) { node.click(); return true; } return false; } // 使用示例 tryClickText(领取, 1200); tryClickText(我知道了, 1500);这里有几个细节要注意。第一text()是全匹配textContains()是包含匹配。比如按钮上的文字是“领取奖励”用text(领取)找不到要用textContains(领取)或者text(领取奖励)。第二findOne(timeout)是“等待控件出现”也就是说控件暂时不存在时它会阻塞等待指定的毫秒数。如果超过时间找不到就会抛异常或返回null。所以要养成拿到节点后先判空的习惯let node textContains(开).findOne(800); if (node) { node.click(); }第三很多人会踩一个拼写坑看到别人写text(微信).findone().bouds().click()照着敲却报错。原因很简单方法名区分大小写正确写法是findOne()和bounds()不是findone()和bouds()。这种错误非常隐蔽不仔细看根本发现不了。还有一种情况控件文本能读到但调click()没反应。这时可以考虑用坐标点击。通过bounds()获取控件边界再算中心点let node textContains(去签到).findOne(2000); if (node) { let bounds node.bounds(); click(bounds.centerX(), bounds.centerY()); }坐标点击的好处是绕过了某些控件点击事件被屏蔽的情况坏处是如果你用了坐标点击一旦界面变化坐标就不可靠了。所以我习惯优先用控件click()不行再降级到坐标。4.3 任务循环弹窗、签到、异常兜底有了滑动和点击基础能力接下来要组装主循环了。主循环的目标是不断滑视频间隔性领奖励遇到弹窗就关闭偶尔切换到任务中心签到然后再回到视频流。为了避免脚本“死循环到底”建议加一个最大循环次数跑完就停方便你观察效果function mainLoop() { let count 0; let maxCount 100; while (count maxCount) { // 1. 滑一个视频 swipeUp(); randomSleep(4500, 8000); // 2. 顺手看看有没有奖励气泡 tryClickText(领取, 800); tryClickText(开宝箱, 800); tryClickText(知道了, 600); // 3. 每隔一段时间去任务中心签到 if (count % 20 0) { clickText(任务); randomSleep(3000, 5000); tryClickText(签到, 1500); // 返回视频流 back(); randomSleep(2000, 3000); swipeUp(); } count; log(已循环次数: count); } }这里用了一个clickText(任务)其实是封装了“通过文本找控件并点击”的逻辑。因为任务中心入口一般长这样底部栏有“任务”“我的”等文字直接文本定位就能点。主循环的重点在于“间隔做事”不是每一次滑动都去找任务入口而是每20次左右去一次让整个操作节奏更接近真人。如果担心脚本中途崩溃可以把整个主循环包在try/catch里出错时打印日志而不是直接退出try { mainLoop(); } catch (e) { log(脚本出错: e); toast(脚本异常请查看日志); }log方法是Auto.js内置的日志输出运行后可以在Auto.js日志面板查看也可以输出到电脑端VS Code控制台。排查问题基本靠它。4.4 完整脚本示例与逐段解读下面放一个可以直接复制运行的完整脚本我做了充分注释// 等待无障碍服务启动 auto.waitFor(); // 需要开启悬浮窗时先申请权限有些版本需要 // if (!floaty.checkPermission()) { // floaty.requestPermission(); // } const SCREEN_W device.width; const SCREEN_H device.height; /** * 随机等待 */ function randomSleep(min, max) { let ms Math.floor(Math.random() * (max - min) min); sleep(ms); } /** * 向上滑动视频 * 起点为屏幕底部78%位置终点为顶部22%位置 * 滑动耗时随机500ms-800ms */ function swipeUp() { let startX SCREEN_W / 2; let startY SCREEN_H * 0.78; let endY SCREEN_H * 0.22; let duration 500 Math.floor(Math.random() * 300); swipe(startX, startY, startX, endY, duration); } /** * 根据文本点击控件 * keyword: 包含的文本内容 * timeout: 等待控件出现的毫秒数 */ function tryClickText(keyword, timeout) { let node textContains(keyword).findOne(timeout || 1500); if (node) { node.click(); return true; } return false; } /** * 根据文本点击控件click无效时用坐标点击 */ function tryClickTextFallback(keyword, timeout) { let node textContains(keyword).findOne(timeout || 1500); if (!node) return false; try { node.click(); } catch (e) { let bounds node.bounds(); click(bounds.centerX(), bounds.centerY()); } return true; } /** * 主循环滑视频领奖励定时签到 */ function mainLoop() { let count 0; let maxCount 80; log(脚本开始运行); while (count maxCount) { // 滑动视频 swipeUp(); randomSleep(4500, 8000); // 处理奖励气泡和弹窗 tryClickText(领取, 800); tryClickText(开宝箱, 800); tryClickText(我知道了, 600); tryClickText(关闭, 600); // 每20次进入任务中心签到一次 if (count 0 count % 20 0) { tryClickText(任务, 2000); randomSleep(3000, 5000); tryClickText(签到, 1500); back(); randomSleep(2000, 3000); } count; log(已完成循环: count); randomSleep(1000, 2000); } log(脚本运行结束); } // 启动 try { mainLoop(); } catch (e) { log(脚本异常: e); toast(脚本异常请查看日志); }用的时候注意几点把maxCount调成适合自己的次数建议先跑20次试试效果如果任务中心入口文本不是“任务”改成你App里实际显示的名字“关闭”“我知道了”这类文本要看你手机上的实际弹窗文字不同版本可能不一样。5. 常见问题与排查技巧实录5.1 常见问题速查表跑这种自动化脚本必然会遇到问题。我把最常见的坑整理成了一张速查表问题现象可能原因解决办法脚本一运行就提示找不到控件无障碍服务未开启检查设置里的无障碍服务重新开启点击“领取”没反应控件click被拦截改用bounds()坐标点击脚本跑几分钟后自动停止系统杀掉了Auto.js后台进程开启手机后台锁定、关闭省电限制滑动没有效果分辨率不适配用相对坐标而不是固定坐标找不到“任务”入口界面布局变化用auto.getWindowRoot()检查实际控件文本日志不输出日志权限或版本差异在Auto.js日志面板查看或重启Auto.js脚本可以运行但金币增长极慢视频播放时长不够拉长等待时间单次视频观看6秒以上5.2 权限被杀与保活厂商后台限制怎么对付我踩过最狠的坑就是脚本运行十几分钟后“意外”停止。排查半天发现不是代码问题而是手机系统把Auto.js的后台进程干掉了。现在的国产手机普遍激进为了省电会清理不活跃的后台。Auto.js作为自动化工具在系统眼里可能就是“一个一直在后台跑的耗电应用”所以经常被杀。解决方案分三件事做第一步在最近任务界面把Auto.js锁定。一般是调出最近任务列表长按Auto.js卡片选择“锁定”或“加入白名单”。第二步进入电池设置把Auto.js的电池策略改为“无限制”不要用“智能省电”或“优化”。第三步给Auto.js开启“后台弹出界面”和“显示悬浮窗”权限。不同品牌叫法不一样小米叫“后台弹出界面”OPPO叫“允许显示悬浮窗”华为叫“关联启动”但逻辑都一样让系统不要限制Auto.js的活动。如果这些还不够有较深的玩法用ADB命令给Auto.js应用加上“忽略电池优化”的白名单权限需要电脑连接手机执行adb命令。不过这种方案新人容易搞混建议先用前面的系统设置解决搞不定再说。5.3 风控意识与合规使用最后必须讲一下风控和合规这个意识要尽早建立。平台对自动化行为是有识别能力的。如果你用主账号、开多开、一天24小时连续挂机被检测到的概率会显著增加。轻则收益清零重则封号。所以我的建议是第一脚本只作为个人学习与工具自动化研究用途不要用于批量操作或恶意刷量。自己签个到、领个日常任务奖励问题不大但大规模、群控式、牟利式的行为坚决别碰。第二脚本频率要克制。单次运行的循环次数别贪多跑一段时间就停一停。比如设置maxCount为80~100跑完了重新启动中间间隔久一点。第三不要连点器式地狂点。所有动作都要有随机延迟尽量模拟人的行为。这既是为了过风控也是让你的脚本更健壮。我自己的原则很简单自动化工具帮我节省重复劳动但我不依赖它去钻规则空子。技术和规则之间的边界自己心里要有数。写在最后的个人体会脚本写完跑通的那天晚上我把手机放在桌上看着它自己一屏一屏地刷视频、领奖励突然觉得这件事最有价值的反而不是“金币”。是“把重复劳动交给代码”这个思路本身。后来我把这套控件的思路迁移到别的地方自动打卡、自动收藏、定时提醒、甚至帮家里人做健康打卡都是同一个逻辑——读取界面、定位控件、点击滑动、随机延时。Auto.js教会我的不是某个平台的羊毛怎么薅而是怎么把一套可复用的自动化方法用在不同场景。如果你想把这个脚本玩好我的建议是先别急着加功能把基础的主循环跑稳定看日志、观察行为再一点点加“签到”“处理弹窗”这些模块。最后再分享一个小技巧——给脚本加上toast输出在手机屏幕上显示当前在做什么比如“正在滑动”“点到了领取”这样看着手机自己干活心里特别踏实。
返回列表