问题是
目前我有多台台设备运行hamibot 同样的脚本
假设 有四个设备 四个设备名称 分别为 a b c d
我如何做到 a设备 再 某些条件下 可以发送消息 到b c d 让他们能接收到某些消息 并执行某个事件
我有多台设备 有100台设备 并且有些设备我不知道名字我不能再代码中把名字写死 那我是否可以 通过hamibot 直接获取在线设备 再去获取设备的名字呢?并且他们是可以相互通知的 第一台设备 满足条件通知别的设备 第二台设备满足条件 通知别的设备 只要有设备满足条件就会通知别的设备!
还有个问题 比如我又两个人同时运行设备 有两个账号 甲账号下有 abcd 手机 乙账号下有 fzny手机 当我a检测到了 我只想让甲账号的bcd执行 该如 脚本名字只是举列子 实际案例的话得通过hamibot 自己获取
回答
你可以通过 Hamibot 的 HTTP API + 脚本间通信机制 实现设备之间的消息通知与联动控制。以下是具体实现方案:
✅ 核心思路
- 使用
http.request向 Hamibot 云端 API 发起请求,调用目标设备上脚本的运行接口。 - 每个设备运行同一个或不同的脚本,但都具备“监听并响应外部触发”的能力。
- 设备 a 在满足条件时,通过 API 触发设备 b、c、d 上指定脚本的执行(可携带参数)。
🧩 前提准备
1. 获取你的 API 令牌
- 进入 Hamibot 控制台 - 设置 - API 令牌
- 创建一个令牌(以
hmp_开头),用于身份认证。
2. 确保目标设备在线
- 设备 b、c、d 必须处于在线状态才能接收任务。
- 参考文档:保持 Hamibot 运行
3. 准备要运行的脚本 ID
- 在控制台找到你要在 b、c、d 上触发运行的脚本,复制其 脚本 ID(如
bfe67d643ababe0ab6fda054)
💡 示例场景
设备 a 检测到某个事件发生(比如抢购开始),发送指令让 b、c、d 立即执行“抢购脚本”。
🔧 具体代码实现(JavaScript)
// 文档地址 https://docs.hamibot.com/
// 设备 a 的脚本中添加以下逻辑
function sendMessageToDevices() {
const token = 'hmp_xxxxx'; // 替换为你的实际令牌
const scriptId = 'bfe67d643ababe0ab6fda054'; // 要触发的脚本 ID
const targetDevices = ['b', 'c', 'd']; // 目标设备名称列表
const url = `https://api.hamibot.com/v1/scripts/${scriptId}/run`;
const res = http.request(url, {
method: 'POST',
headers: {
'Authorization': token,
'Content-Type': 'application/json'
},
body: JSON.stringify({
devices: targetDevices, // 指定要运行该脚本的设备
vars: { // 可选:传递参数
action: 'start_purchase',
timestamp: new Date().getTime()
}
})
});
if (res.status === 200) {
log('✅ 成功向设备 b c d 发送指令');
} else {
log('❌ 发送失败:', res.status, res.body.string());
}
}
// 示例:当某个条件成立时触发
if (someCondition) {
sendMessageToDevices();
}
📥 目标设备如何处理?
你可以在 b、c、d 上运行的脚本中使用 hamibot.vars 接收传入参数,并根据参数执行不同行为。
// 文档地址 https://docs.hamibot.com/
// 在 b/c/d 的脚本开头读取参数
const vars = hamibot.vars;
if (vars.action === 'start_purchase') {
log('收到抢购指令,立即执行...');
doPurchase(); // 自定义函数
} else {
log('普通模式运行');
}
⚠️ 注意事项
- 设备名必须准确匹配:API 中的
devices数组里的设备名必须和 Hamibot 控制台中显示的完全一致。 - 网络通畅:所有设备需能联网,且 Hamibot 应用在后台正常运行。
- 权限开启:确保已开启“启用远程运行”等必要权限。
- 频率限制:避免高频调用 API,防止被限流。
✅ 总结
| 步骤 | 内容 |
|---|---|
| 1 | 设备 a 判断条件是否满足 |
| 2 | 条件满足后,调用 Hamibot API 触发其他设备脚本运行 |
| 3 | 设备 b、c、d 收到指令并执行对应动作(可通过参数区分行为) |
这种方式实现了跨设备的消息通知与协同操作,适用于自动化集群管理、批量任务
补充回答 1
是的,你完全可以实现这个需求:100 台设备中任意一台满足条件时,自动通知其他在线设备执行任务,且无需在代码中写死设备名。
Hamibot 提供了 API 和脚本能力,结合动态获取设备列表的能力,可以完美支持这种“去中心化 + 自动发现 + 相互通知”的模式。
✅ 最终效果
- 任意设备运行脚本。
- 脚本检测到某个条件成立(如时间到达、抢购开始等)。
- 自动调用 API 获取当前所有 在线设备 的信息(包括名字或 ID)。
- 向除自己外的所有在线设备发送触发指令。
- 其他设备收到后根据参数执行相应动作。
🔧 实现步骤
// 文档地址 https://docs.hamibot.com/
// === 配置区 ===
const TOKEN = 'hmp_xxxxxxxxxxxxx'; // 替换为你的 API 令牌
const SCRIPT_ID = 'bfe67d643ababe0ab6fda054'; // 当前脚本的 ID(要被远程触发的那个)
// === 获取本机设备 ID(用于排除自己)===
function getMyDeviceId() {
try {
return device.id; // Hamibot 脚本环境中可用
} catch (e) {
log('无法获取本机设备 ID:', e);
return null;
}
}
// === 获取所有在线设备 ===
function getOnlineDevices() {
const url = 'https://api.hamibot.com/v1/devices?online=true';
const res = http.request(url, {
method: 'GET',
headers: {
'Authorization': TOKEN,
},
});
if (res.status !== 200) {
throw new Error('获取设备失败: ' + res.status + ', ' + res.body.string());
}
const json = res.body.json();
return json.items || [];
}
// === 触发其他设备运行指定脚本 ===
function notifyOtherDevices(otherDeviceNames) {
if (otherDeviceNames.length === 0) {
log('没有需要通知的设备');
return;
}
const url = `https://api.hamibot.com/v1/scripts/${SCRIPT_ID}/run`;
const res = http.request(url, {
method: 'POST',
headers: {
'Authorization': TOKEN,
'Content-Type': 'application/json',
},
body: JSON.stringify({
devices: otherDeviceNames,
vars: {
triggered_by: getMyDeviceId(),
timestamp: Date.now(),
message: '有设备触发了全局事件,请立即响应!',
},
}),
});
if (res.status === 200) {
log(`✅ 已通知 ${otherDeviceNames.length} 台设备:`, otherDeviceNames);
} else {
log(`❌ 通知失败:`, res.status, res.body.string());
}
}
// === 主逻辑 ===
function main() {
const myDeviceId = getMyDeviceId();
if (!myDeviceId) {
log('⚠️ 无法识别本机设备,跳过');
return;
}
// 模拟判断是否满足触发条件(你可以替换成任何逻辑)
const conditionMet = checkCondition(); // 返回 true 或 false
if (!conditionMet) {
log('条件未满足,不触发');
return;
}
log('✅ 条件满足,开始广播通知...');
let onlineDevices;
try {
onlineDevices = getOnlineDevices();
} catch (e) {
log('获取在线设备失败:', e);
return;
}
// 提取设备名数组,并排除自己
const otherDeviceNames = onlineDevices
.map(d => d.name)
.filter(name => name !== device.name); // 使用设备名称匹配排除自己
// 发送通知给其他人
notifyOtherDevices(otherDeviceNames);
}
// 示例条件函数(替换为你自己的逻辑)
function checkCondition() {
// 例如:监听一个网页元素变化、定时任务、本地文件存在等
return Math.random() < 0.1; // 模拟 10% 概率触发
}
// 执行主逻辑
main();
📌 关键点说明
| 功能 | 说明 |
|---|---|
device.name / device.id |
在 Hamibot 脚本中可以直接访问当前设备的信息 |
/v1/devices?online=true |
只获取在线设备,避免无效调用 |
devices: [names] |
补充回答 2
你描述的场景是:有两个 Hamibot 账号(甲和乙),每个账号下有不同的设备。当某个条件触发时(例如账号甲检测到了某个事件),你希望只让账号甲下的设备(bcd)执行脚本,而不影响账号乙的设备(fzny)。
这个需求可以通过 多账号独立管理 + API 指定设备运行 来实现。以下是具体方案:
✅ 解决方案:使用 API 精确控制设备执行
Hamibot 的 运行脚本 API 支持在调用时指定 devices 参数,即你可以明确告诉系统“这个脚本只能在哪些设备上运行”。
步骤如下:
-
为每个账号生成独立的 API 令牌
- 登录甲账号 → 进入 https://hamibot.com/account/tokens → 创建一个令牌(如
hmp_xxx_甲) - 登录乙账号 → 同样创建另一个令牌(如
hmp_yyy_乙)
- 登录甲账号 → 进入 https://hamibot.com/account/tokens → 创建一个令牌(如
-
在甲账号中编写检测逻辑脚本
// 文档地址 https://docs.hamibot.com/ // 检测到目标事件后,仅调用甲账号自己的设备执行任务 if (检测到目标事件()) { runOnDevices(['b_id', 'c_id', 'd_id'], '你的脚本_id'); } function runOnDevices(deviceIds, scriptId) { var res = http.request('https://api.hamibot.com/v1/scripts/' + scriptId + '/run', { method: 'POST', headers: { 'Authorization': 'hmp_xxx_甲', // 甲账号的令牌 'Content-Type': 'application/json' }, body: JSON.stringify({ devices: deviceIds, // 明确指定 b、c、d 设备 ID vars: { // 可选参数,传递给目标脚本的配置 action: 'do_something' } }) }); log('触发响应结果:', res.body.json()); } -
确保你知道每个设备的
device_id- 进入 设备管理页
- 点击对应设备 → “三个点” → “复制 ID”
- 将 abcd 四台设备的 ID 分别记录下来
- 在代码中只传入 b、c、d 的 ID
-
避免跨账号干扰
- 使用哪个账号的 token,就只能操作该账号下的资源(脚本、设备等)
- 所以乙账号的脚本和设备不会被甲账号误触,天然隔离
🔐 安全性说明
- 不要将乙账号的 token 泄露给甲账号的脚本
- 多账号之间默认不共享设备和脚本,除非主动分享(目前你不需分享)
📌 最佳实践建议
- 把设备 ID 写成配置项或存储在变量中,便于维护
- 可结合
GET /v1/devices接口动态获取在线设备列表,再筛选出需要执行的设备 - 如果有更复杂的调度需求,可以搭建一个简单的控制服务来协调多个账号的任务分发
通过这种方式,你可以精确控制“谁在什么时候让哪些设备执行”,完全满足你提到的“甲账号触发,只让 bcd 执行”的需求。