Back to Articles

安卓自动化签到方案:Auto.js 实战指南

📑 Table of Contents

    安卓自动化签到方案:Auto.js 实战指南

    *2026-03-19 移动开发 预计阅读 15 分钟*

    引言

    在移动互联网时代,各类 App 的签到任务成为许多用户日常的一部分。然而,每天手动打开多个 App 完成签到、观看视频、领取金币等操作耗时耗力。本文将介绍基于 Auto.js 的安卓自动化解决方案,帮助你实现”躺赚”金币。

    一、Auto.js 简介

    1.1 什么是 Auto.js

    Auto.js 是一款基于 无障碍服务 的安卓自动化工具,特点:

    • 无需 Root:依靠系统无障碍 API 实现自动化
    • JavaScript 语法:类似 Node.js,学习曲线低
    • 可视化编程:支持拖拽生成代码(Auto.js Pro)
    • 丰富的 API:模拟点击、滑动、输入、截图等

    1.2 Auto.js vs 其他方案

    工具 Root 需求 学习成本 稳定性 价格
    Auto.js ❌ 不需要 ⭐⭐⭐ ⭐⭐⭐⭐ 免费
    Tasker ❌ 不需要 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 付费
    ADB ❌ 不需要 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 免费
    Root 工具 ✅ 需要 ⭐⭐ ⭐⭐⭐⭐⭐ 免费

    推荐: Auto.js 适合大多数用户,平衡了功能和易用性。

    二、环境搭建

    2.1 安卓端配置

    1. 安装 Auto.js
      • 下载地址: https://github.com/kkevsekk1/Auto.js
      • 或使用增强版: AutoX.js (https://github.com/KeiQ-AutoX/AutoX.js)
    2. 开启权限
      • 设置 → 应用管理 → Auto.js
      • 开启”无障碍服务”
      • 开启”悬浮窗”
      • 关闭电池优化
    3. 允许安装应用
      • 设置 → 更多设置 → 允许安装未知来源应用

    2.2 电脑端配置

    1. 安装 Node.js (用于编写和测试)
    2. 安装 VS Code
    3. 安装插件:
      • Auto.js 语法高亮
      • JavaScript/TypeScript
    4. 连接设备(可选)
      # 手机和电脑同一 WiFi
      # Auto.js 内开启服务 → WiFi 连接
      # VS Code 会自动发现设备
      

    三、脚本结构设计

    3.1 项目组织

    my-autojs-project/
    ├── main.js              # 主入口
    ├── config.js            # 配置文件
    ├── utils/              # 工具函数
    │   ├── common.js
    │   ├── ad.js
    │   └── navigation.js
    ├── apps/               # App 模块
    │   ├── douyin.js
    │   ├── kuaishou.js
    │   ├── taobao.js
    │   └── ...
    ├── libs/               # 第三方库
    ├── logs/              # 日志(自动生成)
    └── README.md
    

    3.2 核心架构

    // main.js - 主控脚本
    auto.waitFor(); // 等待无障碍服务启用
    
    const apps = {
      douyin: require('./apps/douyin'),
      kuaishou: require('./apps/kuaishou'),
      taobao: require('./apps/taobao')
    };
    
    function runAll() {
      log('开始执行签到任务');
      
      for (let [name, script] of Object.entries(apps)) {
        try {
          log(`▶ ${name}`);
          script.run();
          log(`✓ ${name} 完成`);
        } catch (e) {
          logError(name, e);
        } finally {
          goHome(); // 返回桌面
          sleep(2000);
        }
      }
      
      sendNotification('签到完成', '所有任务已执行完毕');
    }
    
    // 配置定时任务
    schedule({
      hour: 7,    // 早上 7 点
      minute: 30,
      second: 0,
      day: null   // 每天
    }, runAll);
    
    // 或手动触发
    runAll();
    

    四、App 脚本示例

    4.1 抖音极速版

    // apps/douyin.js
    const CONFIG = require('../config');
    
    function run() {
      launchApp('com.ss.android.ugc.aweme.lite');
      waitForPackage('com.ss.android.ugc.aweme.lite');
      sleep(5000);
      
      // 关闭广告
      closeAd();
      
      // 进入"来赚钱"
      if (clickWhenExists(text('来赚钱'), 5000)) {
        sleep(3000);
        
        // 每日签到
        if (clickWhenExists(descContains('签到'), 3000)) {
          log('签到成功');
          sleep(2000);
          pressBack();
        }
        
        // 观看视频任务
        watchVideo(3);
        
        // 返回
        goHome();
      }
    }
    
    function closeAd() {
      const adTexts = ['跳过广告', '关闭', 'Skip'];
      for (let text of adTexts) {
        if (clickWhenExists(textContains(text), 2000)) {
          sleep(1000);
          return true;
        }
      }
      return false;
    }
    
    function watchVideo(count) {
      for (let i = 0; i < count; i++) {
        log(`观看视频 ${i + 1}/${count}`);
        sleep(15000); // 观看 15 秒
        swipe(500, 1500, 500, 500, 500); // 上滑
        sleep(2000);
      }
    }
    
    module.exports = { run };
    

    4.2 淘宝

    // apps/taobao.js
    const CONFIG = require('../config');
    
    function run() {
      launchApp('com.taobao.taobao');
      waitForPackage('com.taobao.taobao');
      sleep(6000);
      
      closeAd();
      
      // 签到(淘宝人生)
      if (clickWhenExists(text('淘宝人生'), 5000)) {
        sleep(3000);
        signIn();
        pressBack();
      }
      
      // 农场
      if (clickWhenExists(desc('芭芭农场'), 5000)) {
        farmTasks();
        pressBack();
      }
      
      goHome();
    }
    
    function signIn() {
      if (clickWhenExists(descContains('签到'), 3000)) {
        log('淘宝签到');
        sleep(2000);
        return true;
      }
      return false;
    }
    
    function farmTasks() {
      // 浇水、施肥等
      const tasks = [desc('浇水'), desc('施肥')];
      for (let task of tasks) {
        if (clickWhenExists(task, 2000)) {
          sleep(2000);
        }
      }
    }
    
    module.exports = { run };
    

    4.3 通用模块

    // utils/common.js - 通用函数
    function clickWhenExists(selector, timeout = 5000) {
      let start = Date.now();
      while (Date.now() - start < timeout) {
        if (selector.exists()) {
          selector.click();
          return true;
        }
        sleep(500);
      }
      return false;
    }
    
    function textContains(str) {
      return textMatches(new RegExp(str, 'i'));
    }
    
    function descContains(str) {
      return descMatches(new RegExp(str, 'i'));
    }
    
    function goHome() {
      pressBack();
      sleep(1000);
      pressBack();
      sleep(500);
      pressHome();
    }
    
    function randomDelay(min = 1000, max = 3000) {
      sleep(random(min, max));
    }
    
    function log(msg) {
      console.log(`[${new Date().toLocaleTimeString()}] ${msg}`);
    }
    
    module.exports = {
      clickWhenExists,
      textContains,
      descContains,
      goHome,
      randomDelay,
      log
    };
    

    五、配置文件详解

    // config.js
    const CONFIG = {
      // 全局参数
      global: {
        delay: {
          min: 1000,    // 最小延迟
          max: 3000     // 最大延迟
        },
        retry: {
          max: 3,       // 最大重试次数
          interval: 2000 // 重试间隔
        },
        timeout: {
          waitActivity: 10000,
          findElement: 5000
        }
      },
      
      // App 配置
      apps: {
        douyin: {
          package: 'com.ss.android.ugc.aweme.lite',
          mainActivity: '.main.MainActivity',
          tasks: ['checkin', 'watch', 'share'],
          watchMinutes: 30
        },
        kuaishou: {
          package: 'com.kuaishou.nebula',
          tasks: ['checkin', 'watch']
        },
        taobao: {
          package: 'com.taobao.taobao',
          tasks: ['checkin', 'farm', 'tree']
        }
      },
      
      // 通知配置
      notification: {
        enabled: true,
        title: '自动签到',
        sound: false
      },
      
      // 日志配置
      log: {
        enabled: true,
        path: '/sdcard/autojs/logs',
        keepDays: 30
      }
    };
    
    module.exports = CONFIG;
    

    六、调试与优化

    6.1 调试技巧

    // 1. 查看当前页面信息
    console.log('当前包名:', currentPackage());
    console.log('当前 Activity:', currentActivity());
    
    // 2. 截图分析
    let screenshot = captureScreen();
    images.save(screenshot, '/sdcard/screenshot.png');
    
    // 3. 打印 UI 层级
    // 使用 UI 自动测试工具查看控件树
    
    // 4. 逐步执行
    // 在 VS Code 中设置断点 → WiFi 连接设备 → 调试
    

    6.2 稳定性优化

    1. 使用图像识别
      // 更加稳定的识别方式
      let btn = findImage(buttonImage);
      if (btn) btn.click();
      
    2. 智能等待
      // 避免固定 sleep
      waitForComponent(text('签到'), 10000);
      
    3. 异常恢复
      try {
        // 你的代码
      } catch (e) {
        logError(e);
        restartApp(); // 重启应用
      }
      
    4. 模拟真人行为
      // 随机延迟
      randomDelay(1000, 5000);
      // 随机滑动轨迹
      gesture([
        [500, 1200],
        [500, 800],
        [500, 400]
      ], 1000);
      

    七、进阶功能

    7.1 OCR 文字识别

    // 使用 OCR 识别屏幕文字
    const ocr = require('com.starpie.autojs.ocr');
    
    function findTextOnScreen(targetText) {
      let screen = captureScreen();
      let results = ocr.recognizeText(screen);
      
      for (let item of results) {
        if (item.text.includes(targetText)) {
          return item.bounds; // 返回位置
        }
      }
      return null;
    }
    

    7.2 数据统计

    // 生成日报
    function generateReport() {
      const logs = readLogs();
      const stats = analyze(logs);
      
      let report = `=== 签到日报 ${new Date().toLocaleDateString()} ===\n`;
      report += `总任务数: ${stats.total}\n`;
      report += `成功: ${stats.success}\n`;
      report += `失败: ${stats.fail}\n`;
      report += `成功率: ${(stats.success/stats.total*100).toFixed(1)}%\n`;
      
      saveReport(report);
      sendNotification('签到报告', report);
    }
    

    7.3 多设备协同

    // 使用 WebSocket 与服务器通信
    const ws = new WebSocket('ws://your-server:8080');
    
    ws.on('message', (msg) => {
      if (msg === 'sync') {
        uploadLogs(); // 同步日志
      }
    });
    

    八、常见问题解决

    Q1: 找不到控件?

    A: 可能是 UI 更新,需要:

    1. 截图分析控件属性
    2. 改用图片识别
    3. 使用坐标点击(不推荐)
    // 用图像识别替代 text()
    let checkinBtn = findImage('签到按钮图片路径');
    if (checkinBtn) {
      checkinBtn.click();
    }
    

    Q2: 脚本运行一会儿就停止?

    A: 检查:

    1. 是否开启了”保持唤醒”选项
    2. 电池优化是否关闭
    3. 添加防休眠代码:
    device.keepScreenOn(); // 保持屏幕常亮
    // 或
    powerManagement.setWakeLock(true); // 保持 CPU 唤醒
    

    Q3: 某些 App 检测到自动化?

    A: 降低”人肉”度:

    1. 增加随机等待时间
    2. 使用真实滑动轨迹(贝塞尔曲线)
    3. 避免过于规律的操作间隔

    Q4: 如何降低封号风险?

    A:

    1. 使用小号测试
    2. 每个 App 间隔 1-2 小时
    3. 不要刷太快(模拟正常速度)
    4. 定期手动签到,打破规律

    九、持续更新策略

    9.1 版本管理

    # 使用 Git 管理脚本
    git init
    git add .
    git commit -m "feat: 新增抖音签到"
    git tag v1.0
    

    9.2 自动检测更新

    // 从服务器检查脚本版本
    function checkUpdate() {
      let remoteVersion = getRemoteVersion();
      if (remoteVersion > localVersion) {
        downloadNewScript();
        restartAutoJS();
      }
    }
    

    十、安全与隐私

    ⚠️ 重要提醒:

    1. 不要泄露账号密码: 脚本中不要硬编码密码
    2. 使用加密存储:
      const encrypted = encrypt('你的密码');
      // 或使用钥匙串 Keychain
      
    3. 权限最小化: 只申请必要的权限
    4. 定期清理日志: 避免敏感信息泄露

    总结

    Auto.js 为安卓自动化签到提供了强大的能力。通过合理的架构设计和稳定性优化,可以实现稳定、高效的自动签到系统。

    核心要点:

    • ✅ 使用模块化设计,每个 App 独立脚本
    • ✅ 加入异常处理和重试机制
    • ✅ 模拟真人操作,降低风控风险
    • ✅ 完善的日志系统,便于问题排查
    • ✅ 考虑使用图片识别替代文字定位

    下一步: 你可以根据实际需要,添加更多 App 的签到模块。建议先从 1-2 个简单的开始测试,逐步扩展功能。


    参考资源

    1. Auto.js 官方文档
    2. Auto.js GitHub
    3. AutoX.js 增强版
    4. Hamibot 云管理