回答
在 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。
- 即使如此,部分设备仍可能要求后台弹窗权限或忽略电池优化设置。
替代方案建议
- 最小化权限需求:如果只是轮询服务器状态,可写成纯 API 调用脚本,并部署在服务器上运行(配合 Hamibot 的 REST API 触发任务)。
- 使用 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 界面,请启用无障碍并参考 保持在线指南 提高稳定性。