自动化脚本这条线:从按键精灵到三条挂机脚本线

从 2019 年到现在,脚本技术栈换过三次,要解决的问题一直是同一个:把重复动作交给脚本跑。这篇记环境怎么搭、三条线为什么不复用、坑分别是什么现象、怎么绕。

2019.10:先有代挂系统,后有脚本

心悦云代挂系统开始运营,那是一套面向 Telegram 用户的 QQ 防封代挂系统:用户把 QQ 挂上去保持在线,防封的逻辑由系统这边处理,脚本只是它伸出去的一只手。

2020.03 第一次单独写脚本:QQ 社群自动化,用按键精灵(记住坐标、按顺序点击的脚本工具)写的自动加人脚本,把加人、进群这类重复动作交给脚本跑。思路很直接:记住位置,点下去,等一会儿,点下一个。毛病也直接——坐标是录死的,换分辨率就废;界面挪一个按钮,整套动作要重录。

2021:微信端两款,加上一个站

2021.02 同期上线两款微信端产品。H5 交友盲盒是点开一次随机出一张别人的名片,想多出几次就得分享出去,走裂变拉新;扫雷小程序没有拉新成分,是个纯玩法,给用户一个每天回来一次的理由,走留存。2021.05 卡盟(前端下单卖各类刷量和代挂商品的站)、代刷、代挂、社区运营并到一个站里:前端下单、后端派单、社区沉淀用户,整条链路一个人跑通。麻烦的不是技术,是几种业务共用同一套订单号段和同一份库存,跑顺之前只能一单一单自己看。

2024:三条挂机线,各写一套代码

2024.01 快手挂机脚本上线,2024.02 全民K歌,2024.03 今日头条。全民K歌那条思路和快手完全一样,代码我整套重写了一遍。三条线各跑各的,互不影响。

不复用的理由有三个:

  • 动作形状不一样。三个软件里要跑的那件事,步骤数、等待时长、中途会弹什么东西全都不同,硬抽公共层,抽完剩下的有效代码没几行。
  • 改版节奏不一样。我动快手那套的时候,头条那套正在稳定跑。共用一层抽象,改一边就得回归两边,一个人做这件事一定拖。
  • 定位成本。各写一套,故障就在自己那几百行里找;共用一套,故障可能是另一条线的改动带出来的。

“互不影响”这句话不是设计出来的,是代码分开写才成立的。

环境:模拟器 + adb

脚本不跑在真机上,跑在电脑里的安卓模拟器里。MuMu 模拟器起一个实例,实例里装 AutoX.js(用 JavaScript 写安卓自动化脚本的工具),电脑和模拟器之间走 adb(安卓自带的调试通道)。大致四步:

  1. 模拟器设置里打开 ADB 调试,记下端口;
  2. 电脑上 adb connect 模拟器地址加端口,adb devices 确认这台实例在列表里;
  3. AutoX.js 那边同样连一次 adb,让它认到这台电脑;
  4. 脚本从电脑推上去跑,日志从 adb 拉回来看。

adb 的价值不是能跑,是能看见:点到了没有、控件找到没有、卡在第几步。

六个坑:现象和改法

  1. 色值判断不可靠。我原来靠“这个开关现在是绿色”判断任务完成没有,白天对,夜里错,换个主题色全错。原因是截图取到的是渲染后的像素,模拟器缩放和抗锯齿会让取样点偏色,深色模式还会把绿色本身换掉。改法:不从像素判状态,从控件属性读;属性实在读不到才退回颜色,取样点从图标边缘移到色块正中,判定从“相等”改成“在容差里”。
  2. setChecked 不生效。调设选中状态的接口不报错,屏幕上开关纹丝不动,下一步逻辑却以为已经开了,往下全乱。原因是这类开关的选中效果是控件自己画的,属性改了不等于交互状态变了。改法:不设状态,改成模拟手点一次——先读当前状态,不对才点,点完等一下再读一次;还不对就把这台判为界面异常直接跳过,不在同一个开关上连点。
  3. dialogs 选择弹层的写法。想让脚本弹一个“从几个频道里挑一个”的列表,弹层要么不出现,要么点了没回调。原因是这个接口在不同版本上参数写法不一致,列表数据和回调对象的顺序我记混过几次。改法:从安装包里把脚本模块解出来,对着真实签名写;写完固定成一处封装,三条线都调这一个函数,不再各自手写。
  4. 负坐标会让脚本直接死。跑到某一步整个进程停了,不报错不留日志。原因是控件在当前屏幕外或者压根没找到,算出来的坐标是负数,拿负数去点击,进程直接被打掉。改法:所有点击只走一个出口,坐标不合法就地拦下,当成“这一步没找到”处理。
  5. dump 会抢走无障碍焦点。为了看控件结构跑一次全量 dump,之后所有查找都返回空,前台应用也被切走,因为 dump 独占无障碍服务。改法:dump 只在手工排查时跑,跑完重启脚本;正式流程里绝不全量 dump,要控件信息就用有限查找。
  6. 编辑器回写会覆盖文件。电脑上明明改好了,第二天模拟器里跑的还是旧逻辑;或者我推上去新版本,编辑器一保存又把旧的写回来。原因是编辑器和模拟器目录双向同步,谁后保存谁赢。改法:只留一个写方向,电脑是唯一真源,同步关掉。

点击出口大致是这个形状:

// 示意:所有点击只走这一个出口,负坐标就地拦下
function safeClick(x, y) {
  if (x < 0 || y < 0 || x > device.width || y > device.height) {
    return false; // 当成“这一步没找到”,交给上层重试或跳过
  }
  click(x, y);
  return true;
}

状态判断做成三层回落:能读控件属性就用属性;读不到就取色块正中的颜色做容差比较;两样都判不了就不猜,跳过这一台,继续下一台。

今日头条那条线联调通过什么

2024.03 这条线全流程联调通过,含面板扩容、每日统计、多频道轮巡。面板扩容是把一次要处理的条目量往上放,放上去才发现等待时长不能写死:条目多了,固定等待要么浪费要么不够,改成按每一步实际到没到位来等。每日统计是每天跑完落一次完成条数,第二天开跑前先看昨天的数对不对,数不对就说明脚本在空跑。多频道轮巡是一个账号依次在几个频道里各跑一轮再回到起点,最怕中途弹出无关窗口把轮巡打断,所以每一轮开始先做一次界面归位。

三条线现在每周看一次日志,看完成数和昨日统计对不对得上。同一件事重复做,就一直有坑可记。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 共2条

请登录后发表评论

    • 头像按键精灵老手0
    • 头像程序猿阿凯0