模拟点击如何随机偏移

已存档
090909 · 13 天前
第 1 条补充
·
10 天前

Hamibot 不开无障碍是否可以,怎么写

第 2 条补充
·
10 天前

不用无障碍定位元素怎么写代码

回答

Hamibot AI
1
· 13 天前

在 Hamibot 中进行模拟点击时,可以通过设置随机偏移来模拟更自然的人类操作,避免被目标应用或网站检测为自动化行为。你可以使用 click() 函数结合随机坐标偏移来实现。

以下是一个示例脚本,展示如何在指定坐标点击时添加随机偏移:

// 文档地址 https://docs.hamibot.com/

// 原始点击坐标
var x = 500;
var y = 800;

// 定义偏移范围(例如 ±50 像素)
var offsetRange = 50;

// 生成随机偏移量
var randomOffsetX = Math.floor(Math.random() * (offsetRange * 2 + 1)) - offsetRange;
var randomOffsetY = Math.floor(Math.random() * (offsetRange * 2 + 1)) - offsetRange;

// 计算最终点击位置
var finalX = x + randomOffsetX;
var finalY = y + randomOffsetY;

// 执行点击
click(finalX, finalY);

// 可选:输出实际点击坐标用于调试
console.log("实际点击坐标: (" + finalX + ", " + finalY + ")");

说明:

  • Math.random() 生成一个 [0, 1) 范围内的浮点数。
  • Math.floor() 向下取整,确保结果是整数坐标。
  • offsetRange 控制偏移的幅度,你可以根据屏幕尺寸和需求调整(如小屏设备可用 ±20,大屏可用 ±100)。
  • 最终点击坐标会围绕原始点 (x, y) 在设定范围内随机变动。

注意事项:

  • 确保偏移后的坐标仍在屏幕范围内,否则点击无效。可以加入边界检查逻辑:
    finalX = Math.max(0, Math.min(device.width, finalX));
    finalY = Math.max(0, Math.min(device.height, finalY));
    

这样就能实现带有随机偏移的模拟点击,提升脚本的拟人化程度。


补充回答 1

Hamibot 的绝大多数自动化脚本都需要启用无障碍服务(Accessibility Service),因为这是实现界面操作、控件查找和交互的核心依赖。如果你不开启无障碍服务,脚本将无法正常运行或完全无反应。

为什么必须使用无障碍?

  • 控件识别:通过 id、文本、类名等定位界面元素。
  • 自动点击、滑动、输入:模拟用户操作。
  • 监听页面变化:监听 Activity 切换或 UI 更新。

这些功能在 Android 系统中都依赖于无障碍服务才能实现。


不开无障碍能做什么?

虽然不开无障碍会极大限制能力,但仍有一些轻量级任务可以执行,前提是仅使用 JavaScript 原生逻辑 + 系统 API(如定时、网络请求),且不涉及任何界面自动化。

例如:

  • 定时执行一个 HTTP 请求(调用 REST API)
  • 数据计算与处理
  • 使用 http 模块发送消息到企业微信/钉钉/Webhook

示例代码(无需无障碍):

// 文档地址 https://docs.hamibot.com/

// 发送一个 GET 请求(不会触发界面操作)
const response = http.get('https://api.example.com/status');
if (response.statusCode === 200) {
  console.log('数据获取成功:', response.body.string());
} else {
  console.log('请求失败:', response.statusCode);
}

// 可结合定时任务,在固定时间发起请求

⚠️ 注意:

  • 此类脚本不能使用 click()setText()waitForActivity() 等 UI 自动化函数。
  • 必须确保没有调用需要无障碍权限的 API。
  • 即使如此,部分设备仍可能要求后台弹窗权限或忽略电池优化设置。

替代方案建议

  1. 最小化权限需求:如果只是轮询服务器状态,可写成纯 API 调用脚本,并部署在服务器上运行(配合 Hamibot 的 REST API 触发任务)。
  2. 使用 Web 技术栈替代:对于非手机端操作的任务,考虑 Node.js 或 Python 脚本更合适。

总结

  • 不开无障碍 = 无法做 UI 自动化
  • 若你的需求是“监控 + 通知”类任务,可用 http 模块实现无界面操作
  • 所有涉及 App 控件操作的功能都必须开启无障碍

如果你的需求是绕过无障碍完成自动化操作,目前在 Android 平台上没有稳定可行的通用方法,也不符合系统安全规范。建议按需开启必要权限,并参考 保持在线指南 提高服务稳定性。


补充回答 2

在 Hamibot 中,不开启无障碍服务的情况下无法定位和操作界面元素。所有基于控件的查找方法(如 id("xxx")text("提交")className("android.widget.Button") 等)都依赖于 Android 的无障碍服务来获取页面结构信息。如果未启用该服务,这些函数将无法工作,脚本会因找不到元素而失败或直接无响应。


为什么不能绕过无障碍定位元素?

  • Android 系统出于安全考虑,禁止应用在后台读取屏幕内容或控件树。
  • 无障碍服务是官方唯一允许自动化工具访问 UI 层次结构的机制。
  • Rhino 引擎运行的 JavaScript 脚本本身不具备穿透系统层级的能力。

因此,没有无障碍权限 = 无法使用任何基于控件的选择器 API


不依赖无障碍的替代方案

如果你的需求是“执行逻辑”而非“模拟点击”,可以编写仅使用 JavaScript 原生能力或调用外部接口的脚本:

✅ 可行示例:纯数据处理 + 网络请求

// 文档地址 https://docs.hamibot.com/

// 示例:定时检查某个接口状态,不涉及任何 UI 操作
function checkStatus() {
  try {
    const url = 'https://api.example.com/v1/task';
    const res = http.get(url);
    const data = res.body.json();

    if (data.status === 'completed') {
      console.log('任务已完成');
      // 可发送通知、邮件等
    } else {
      console.log('任务仍在进行中...');
    }
  } catch (e) {
    console.error('请求出错:', e.message);
  }
}

// 每 5 分钟检查一次
setInterval(checkStatus, 5 * 60 * 1000);

此类脚本可在关闭无障碍的情况下运行(但需确保没有其他依赖 UI 的代码),适用于:

  • 监控服务器状态
  • 同步远程数据
  • 触发 Webhook

替代技术建议

如果你希望减少对无障碍的依赖,可考虑以下路径:

目标 推荐方式
自动填写表单 使用浏览器扩展或 WebView 内自动化(如 Puppeteer)
定时任务调度 使用服务器端脚本 + Hamibot REST API 触发任务
快速点击 若为固定位置操作,可用 shell() 执行 ADB 命令(需 root 或已授权设备),但仍受限于系统限制

⚠️ 注意:即使使用 shell()runtime.exec() 调用底层命令,也无法绕过 Android 权限模型来实现跨应用控件识别。


总结

  • 你不能在 Hamibot 中不开启无障碍就定位 UI 元素
  • 所有 id()text()boundsInParent 等选择器均失效
  • 唯一可行的是脱离 UI 层面,转为使用网络请求与逻辑判断
  • 如确实需要无感知自动化,请评估是否可通过系统级集成(如定制 ROM、企业设备管理)实现

建议根据实际场景调整设计思路:若必须操作 App 界面,请启用无障碍并参考 保持在线指南 提高稳定性。

ℹ️ 本回答由 AI 生成,内容仅供参考