
1. 项目背景与应用场景刷宝短视频是前几年挺火的一款看视频赚积分类应用核心玩法就是刷视频、做任务、攒积分换现金。虽然现在热度下去了但把它当作AutoJS的学习练手对象仍然非常合适——App结构不复杂、操作路径固定、界面元素容易定位新手拿来复盘自动化脚本的完整思路比硬啃文档高效得多。我自己当时写这个脚本就是冲着AutoJS 4.1.0的稳定性去的。这个版本发布较早API设计比较规整无障碍服务的兼容性在主流安卓机型上表现尚可而且社区文档、示例代码都比较齐全适合作为自动化入门的第一站。这篇文章会从设计思路、控件分析、脚本编写到稳定运行的完整链路展开把我在实机上踩过的坑、用过的技巧全部记录下来。适合刚接触AutoJS、或者想系统了解移动端自动化脚本编写逻辑的朋友参考。2. 整体方案设计与技术选型2.1 为什么选AutoJS 4.1.0做安卓自动化市面上能用的方案有好几种Appium、MonkeyRunner、按键精灵、AutoJS等等。多种方案对比下来选择AutoJS 4.1.0的原因很直接方案脚本语言上手成本控件识别能力免费程度AppiumPython/Java高强免费但环境配置繁琐MonkeyRunnerPython中弱免费但功能单一按键精灵自定义脚本低中部分功能收费AutoJSJavaScript低强开源/免费AutoJS最大的优势是JavaScript语法加丰富的UI自动化API直接在手机上编写运行不需要连电脑、不需要打包APK改完脚本立即生效调试效率极高。对于“快速实现某个App的自动化操作”这种需求它是性价比最高的选择。4.1.0版本还有一个特点API设计相对内聚id()、text()、desc()、className()这些控件选择器在4.x里已经非常完善配合click()、scroll()、swipe()等操作函数几乎能覆盖绝大多数App的自动化场景。新版AutoJS虽然功能更多但4.1.0在稳定性方面口碑不错所以就锁定了这个版本。2.2 刷宝短视频自动化的核心需求拆解刷宝短视频的核心玩法就是刷视频攒积分所以自动化脚本要解决的核心问题很清晰自动播放视频模拟真实用户行为根据视频内容和时间自动滑到下一个视频处理可能弹出的任务提示、签到弹窗、福利红包控制运行时长避免长时间无意义挂机异常处理网络卡顿、应用闪退、控件未加载这五个需求对应的技术点分别是定时器调度、滑动手势模拟、控件状态轮询、条件判断与退出机制、异常捕获与恢复。用AutoJS实现这套逻辑并不复杂关键是设计好状态机和异常处理。脚本本质上是“自动化操作主循环 异常处理支线”不要想着把所有情况都写在同一个流程里那样后期维护会非常痛苦。2.3 初始版本的脚本结构规划写脚本之前先梳理结构我采用的是“主线程循环子线程监控”的模式// 主线程负责刷视频主循环 function mainLoop() { // 滑视频、等待播放、处理弹窗 } // 监控线程负责检测异常状态并处理 function watchDog() { // 定时检查当前界面发现异常回调处理 } // 启动入口 auto.waitFor(); mainLoop();这种结构的优势在于异常检测和主流程解耦互不阻塞。监控线程发现弹窗就处理弹窗发现卡死就重启主循环主流程只需要保持核心节奏——播视频、滑动、播视频、滑动。3. 环境搭建与基础配置3.1 真机环境准备写AutoJS脚本最理想的环境是安卓7.0以上系统无障碍服务兼容性更好屏幕分辨率主流即可1080x1920或者2340x1080都能适配2GB以上可用内存开启“开发者选项-USB调试”可选但方便adb调试我测试用的是一台安卓10的旧手机2GB运存跑刷宝短视频没什么压力AutoJS也能流畅运行。安装AutoJS 4.1.0 APK后还需要做两件事开启无障碍服务系统设置 → 无障碍 → AutoJS服务 → 开启。这一步是脚本能够模拟点击、滑动的关键不开启的话click()无法生效。关闭电池优化设置 → 应用管理 → AutoJS → 电池 → 不限制。否则手机息屏后进程容易被系统回收挂机中断。保持屏幕常亮可以在AutoJS脚本里直接调用device.keepScreenOn(true)或者系统设置中把休眠时间调成30分钟以上。3.2 AutoJS 4.1.0的常用API准备写脚本之前先把要用到的核心API捋一遍API功能使用场景auto.waitFor()等待无障碍服务开启脚本启动时调用text(xxx)按文本找控件点击签到、确认按钮id(xxx)按资源ID找控件定位视频播放元素desc(xxx)按描述找控件一些无文本但有无障碍描述的按钮click(x, y)坐标点击兜底点击方案swipe(x1, y1, x2, y2, duration)滑动手势切换视频className(xxx)按控件类型找控件列表、按钮定位waitForActivity(xxx)等待Activity加载判断页面切换textContains(xxx)模糊匹配文本处理不确定文本的弹窗findOne(timeout)在指定时间内查找控件避免死等熟悉这些之后脚本框架就出来了。不要急着写逻辑先建一个“控件侦查”流程用AutoJS的控件嗅探功能看清楚刷宝短视频界面上的元素长什么样再动手写代码。4. 界面控件分析与核心实现4.1 刷宝短视频的界面结构用AutoJS自带的“布局分析”或者配合“控件面板”功能可以很直观地看到App的界面层级。我当时抓到的核心结构大概是这样的FrameLayout └── LinearLayout ├── VideoView/播放器容器 ├── 右侧操作栏点赞、评论、分享等 ├── 底部标题栏App名称、任务入口 └── 顶部悬浮窗金币收益显示、签到入口没有统一的全屏控件IDApp的UI结构会随版本迭代变化。但重点在于切换视频的主要路径是手势滑动——上滑切换下一个视频这是所有短视频App的共同设计不需要依赖特定控件。所以脚本主循环不依赖控件定位滑动而是直接模拟手势这样即使UI小改也能保持脚本有效。4.2 脚本主循环的实现主循环的逻辑判断当前是否在视频页 → 模拟上滑 → 等待新视频加载 → 循环。// 主循环刷视频 function mainLoop() { var videoCount 0; var maxCount 200; // 最多刷200个视频防止无限运行 while (videoCount maxCount) { // 1. 检查当前界面是否正常 if (!isNormalPage()) { handleAbnormalPage(); continue; } // 2. 模拟上滑切换视频 swipe(screenW / 2, screenH * 0.7, screenW / 2, screenH * 0.3, 300); // 3. 等待视频加载 sleep(3000); // 4. 模拟观看行为——停留一段时间 sleep(random(5000, 10000)); videoCount; console.log(已刷视频数: videoCount); } }这里的核心参数滑动起点和终点的坐标比例是关键。起点在屏幕下方约70%位置终点在屏幕上方约30%位置避免从屏幕最上沿或最下沿滑动导致误触底部导航栏或顶部状态栏。滑动速度控制在300毫秒太快会直接跳过视频且容易被检测太慢又不像正常操作。观看停留时间用random(5000, 10000)模拟人工刷视频的节奏。不要每次固定等同一个时长这既是行为模拟的基本要求也能降低被系统识别的概率。4.3 短视频页面状态检测为了不让脚本在出现异常时盲目滑动我加了一个页面状态检测函数function isNormalPage() { // 如果当前存在直播间、广告、弹窗等非视频页元素视为异常 var abnormalTexts [立即下载, 打开, 领取红包, 去赚钱]; for (var i 0; i abnormalTexts.length; i) { if (text(abnormalTexts[i]).findOne(1000) ! null) { console.log(检测到异常元素: abnormalTexts[i]); return false; } } return true; }页面状态检测的思路很简单定义一组“非正常视频页”的文本特征一旦检测到就进入异常处理分支。这里用了findOne(1000)意思是只等待1秒找不到就返回null这样不会阻塞主流程。4.4 弹窗处理与任务自动领取刷宝短视频会定期弹“签到”、“福利中心”、“今日任务”、“开红包”之类的弹窗。这些弹窗如果不管会一直挡在屏幕上干扰后续滑动。处理方式分两种情况A明确有“关闭”或“X”按钮function closePopup() { var closeBtn text(关闭).findOne(500) || text(X).findOne(500); if (closeBtn ! null) { closeBtn.click(); console.log(已关闭弹窗); sleep(1000); return true; } return false; }情况B有“领取”或“我知道了”这类任务按钮function handleTaskPopup() { if (text(领取).findOne(1000) ! null) { text(领取).findOne().click(); sleep(1500); return true; } if (text(我知道了).findOne(1000) ! null) { text(我知道了).findOne().click(); sleep(1000); return true; } return false; }这里要特别注意按钮的“点击有效区域”。用text(领取).findOne()返回的控件是整个文本区域如果文本太小点击可能点到旁边的空白地方。更稳妥的做法是拿到控件bounds中心坐标再点击function clickCenter(control) { var bounds control.bounds(); var x bounds.left (bounds.right - bounds.left) / 2; var y bounds.top (bounds.bottom - bounds.top) / 2; click(x, y); }“领取”类弹窗处理完还可以触发一次“任务完成”的反馈——比如积分到账提示、任务进度更新给脚本加一个检测并记录积分变化的逻辑方便验证脚本是否真实生效。4.5 点击视频区域模拟真实观看除了滑动切换AutoJS还可以模拟“点击视频暂停播放”和“再次点击继续播放”的行为这种微操作让脚本行为更像真人。function simulateWatchBehavior() { // 模拟偶尔点击视频区域暂停/恢复 if (Math.random() 0.2) { // 20%概率点击视频中心区域 var x screenW * (0.3 Math.random() * 0.4); var y screenH * (0.4 Math.random() * 0.2); click(x, y); sleep(500); } }这里调低点击概率就是因为如果每个视频都点击一下反而显得不自然。真实用户刷短视频时不会每次都精准点击偶尔停顿偶尔划走行为有随机性才更safe。4.6 完整主循环代码整合把上面的模块整合起来就是一套能直接运行的完整逻辑// 配置 var screenW device.width; var screenH device.height; var maxRuns 200; var videoCount 0; // 启动 auto.waitFor(); device.keepScreenOn(true); console.setPosition(0, 500); function main() { toast(刷宝短视频自动化启动); while (videoCount maxRuns) { // 1. 检测并处理任何弹窗 if (!isNormalPage()) { handleAbnormalPage(); continue; } // 2. 滑动切换到下一个视频 swipe(screenW / 2, screenH * 0.7, screenW / 2, screenH * 0.3, 300); sleep(2500); // 3. 观看停留 var watchTime random(4000, 8000); sleep(watchTime); // 4. 模拟点击行为 if (Math.random() 0.15) { var x screenW * (0.3 Math.random() * 0.4); var y screenH * (0.4 Math.random() * 0.2); click(x, y); sleep(600); } videoCount; console.log(已完成: videoCount / maxRuns); } console.log(脚本运行结束); device.keepScreenOn(false); } function isNormalPage() { // ...略 } function handleAbnormalPage() { // ...略 } main();提示把sleep的时长设置成随机数是为了规避固定周期操作的行为特征。AutoJS脚本如果每次都一模一样的停顿很容易被检测。5. 坐标选择与控件定位的踩坑笔记5.1 为什么优先用控件定位而非坐标坐标点击是最简单直接的方式但也是最低效、最脆弱的方案。屏幕分辨率一变、App UI布局一变坐标方案就废了。所以我的原则是能用控件定位就用控件定位坐标定位只作为兜底。控件定位的核心API就那几个text(视频).findOne(); id(play_button).findOne(); desc(播放).findOne(); className(android.widget.FrameLayout).findOne();不过也要认识到很多短视频App的控件细节并不规范播放按钮、点赞按钮可能都没有带文字或者ID这时就只能退而求其次用坐标计算。5.2 坐标计算的通用方法暂时性坐标计算的核心思路先拿屏幕宽高再按比例计算关键点位。以1080x1920为例短视频App的右侧操作栏一般居中偏左约950附近按钮间距约180像素。我第一次写坐标定位时直接写死了click(950, 1300)这种硬坐标结果换一台分辨率2340x1080的手机就完全错位。后来改成比例计算问题就解决了var x Math.round(screenW * 0.88); // 屏幕88%宽度位置 var y Math.round(screenH * 0.65); // 屏幕65%高度位置拿比例坐标代替绝对坐标至少能兼容大多数主流分辨率。5.3 控件定位的几个易踩坑点坑一TextView文本含换行或空格控件文本看起来是“立即领取”实际带换行符或首尾空格text(立即领取)就匹配不上。解决方式用textContains(立即领取)或者descContains(立即领取)。坑二findOne返回null导致崩溃AutoJS的findOne()在不给参数时默认无限等待如果控件永远不出现会卡死脚本。建议统一使用findOne(2000)这样带超时的版本。坑三同一文本出现多个控件用text(关闭).findOne()如果匹配到多个结果会默认返回第一个。更稳妥的是用text(关闭).findOne(2000)拿到控件后先打印它的bounds确认位置再点击。坑四控件树过于庞大导致查找缓慢如果页面元素太多findOne()可能会耗时几秒钟。优化方式是限定查找范围比如只用操作栏区域的父布局查找var container id(operation_bar).findOne(2000); if (container ! null) { var likeBtn container.findOne(text(点赞)); if (likeBtn ! null) likeBtn.click(); }这个层级限定放技能以后查找速度提升非常明显。5.4 坐标定位与控件定位的配合策略我的脚本里实际采用“三层定位策略”第一层控件定位——有文本、ID或描述时优先用控件。第二层相对坐标定位——在父容器区域内部计算相对位置避免全屏幕坐标漂移。第三层绝对坐标兜底——实在找不到控件直接按预设坐标点击并用下一次循环的状态检测判断点击是否生效。这套策略的好处在于既保证定位精准度又在极端情况下不阻塞主流程。6. 异常处理与运行稳定性优化6.1 常见异常类型归纳写脚本时把异常大概分为四类异常类型表现触发原因网络异常视频加载失败画面卡住Wi-Fi不稳、弱网控件未加载弹窗没出现、按钮找不到App启动慢、渲染延迟页面跳转跳出App到了其他页面误触外链、广告跳转崩溃闪退脚本连接断开App内存溢出、系统回收6.2 超时机制与异常恢复针对网络异常视频播放时如果长时间没有新内容出现滑动后固定等待一次3到5秒如果没有检测到VideoView更新就再滑动一次。误触外链跳转了广告页检测到浏览器页面或应用商店页面就执行back()返回。function handleAppSwitchOut() { var currentPackage currentPackage(); if (currentPackage ! com.shua.bao) { // 不在刷宝App内可能是误触广告跳走了 console.log(检测到跳出App当前包名: currentPackage); back(); sleep(2000); // 如果还在外部继续返回 for (var i 0; i 3; i) { if (currentPackage() ! com.shua.bao) { back(); sleep(1500); } else { break; } } } }用currentPackage()实时判断当前前台运行的App包名一旦发现不是目标App立即连续返回。这是处理广告跳转最直接有效的方式。6.3 运行时长控制与自动停止刷宝短视频这类平台长时间高频操作容易触发风控所以脚本设定了两个安全机制最大视频数限制默认刷200个视频自动停止不无限运行。运行时长上限超过60分钟直接强制退出。var startTime new Date().getTime(); var maxDuration 60 * 60 * 1000; // 60分钟 if (new Date().getTime() - startTime maxDuration) { console.log(运行超时自动停止); exit(); }这两个限制主要是为了让脚本运行更“常态化”——一个真人也不可能一天24小时每分每秒都在刷同一个App。6.4 意外情况的兜底回归桌面极端情况下脚本卡在一个未知页面找不到出路。这时候兜底方案是强制回到桌面然后重新打开App。function rebootApp() { home(); sleep(2000); app.launchApp(刷宝短视频); sleep(5000); }这个方案虽然粗暴但是在App崩溃、白屏、死循环页面的情况下很有效。代价是会中断积分积累节奏但总比脚本卡死强。7. 运行效果与数据复盘7.1 第一版脚本的实测数据第一版脚本在实机上跑了一个多小时记录的结果刷了约180个视频中途因弹窗干扰卡顿4次脚本自动恢复3次手动干预1次弹窗处理成功率约75%有些弹窗文案不在预设列表里漏处理了积分收益比纯手动刷略少但胜在稳定自动运行全程没有闪退、没有触发App的异常提醒7.2 需要继续优化的三个方向复盘之后发现弹窗处理成功率不高的原因主要是文案覆盖不全新增弹窗第一次出现时脚本不认得。优化方向有三个增加弹窗文案库把所有能想到的按钮文字都加进去引入OCR识别兜底——用截图OCR识别弹窗文字再处理理论上能覆盖更多未知弹窗加入随机策略——减少固定节奏让它更像真人在操作OCR方案在AutoJS上可以调用第三方OCR库但实现复杂度和额外延迟会上升实际操作时要衡量收益。我最后采取的是“文案库坐标兜底点击”的组合方案尽量找到点击按钮的通用位置提升未知弹窗的关闭率。8. 对AutoJS学习的一些真实建议8.1 从模仿到改造学习路径分享如果读者朋友是零基础入AutoJS我的建议是先不要直接上手写完整脚本而是先把别人写好的脚本看明白拆解它的结构理解每个API的实际用途然后按照自己的需求去改。我在写刷宝短视频脚本之前也看了好几套其他人的脚本——有的做微信自动回复有的做电商App自动签到。虽然应用场景不同但底层能力都是那几套控件查找、手势模拟、条件判断。只要掌握这三种能力基本就掌握了AutoJS的核心。8.2 调试技巧打印日志与控制台AutoJS的console.log()会在控制台面板输出日志写脚本时多打印日志能大幅提升排错效率。配合console.clear()清理日志让关键信息更突出。调试时我喜欢在关键节点打印当前界面包名、Activity名称、找到的控件信息console.log(当前包名: currentPackage()); console.log(当前Activity: currentActivity()); console.log(控件位置: JSON.stringify(bounds));这些信息能让你快速定位是定位失败、点击失败还是页面状态判断出错。8.3 注意账号与设备的安全边界写这类App自动化脚本时有一点必须注意账号安全和设备风控。频繁操作的账号可能被平台限制部分功能严重时会影响账号正常使用。所以脚本运行速度不要太快运行时长要有限制并且尽量使用不常用的账号做测试。当脚本做好之后也可以考虑增加多设备分发的玩法比如旧手机专门跑短视频任务主力设备正常使用。但这种部署方式需要额外的设备管理工具不在AutoJS的范围内。如果自己感兴趣可以使用AutoJS的定时任务功能让每一台手机在指定时间自动启动脚本配合一些任务调度逻辑就能实现无人值守的批量运行。注意自动化脚本的风控规避不能作为主要目标核心还是学习自动化技术本身。只要节奏适当、行为合理脚本在大多数主流应用上都能正常运行。9. 展示一些调试过程中保留下来的Tips最后分享几个调试过程中的小技巧这些在官方文档里不一定找得到Tip 1用floating()和edge()把日志窗口挪到屏幕边缘。自动脚本运行时会挡住一部分点击区域把日志窗口拖到角落能减少干扰。Tip 2尽量用click()而不是press()。press()有时候需要传入坐标点数组坐标算错就会误触而click()配合控件更方便。Tip 3设置脚本的异常退出回调。用try...catch...finally确保脚本在异常时也能清理现场比如关闭屏幕常亮try { mainLoop(); } catch (e) { console.error(脚本出错: e); device.keepScreenOn(false); } finally { console.log(脚本已退出); }Tip 4把脚本的版本号和最后修改时间放在文件开头注释里。脚本过程一旦多起来没有版本控制的脚本会很快失控。Tip 5养成每次运行前先auto.waitFor()的习惯。有的手机重启后无障碍服务不会自动重连不等待直接操作会出现大量空点击。这些缝缝补补的经验积累下来就是我写AutoJS脚本最大的收获。技术本身不复杂复杂的是在不同环境里让它稳定跑起来这需要时间和场景的打磨。