问题是
目前我有多台台设备运行hamibot 同样的脚本
假设 有四个设备 四个设备名称 分别为 a b c d
我如何做到 a设备 再 某些条件下 可以发送消息 到b c d 让他们能接收到某些消息 并执行某个事件

chostan_3576 · 4 天前
第 1 条补充
·
4 天前

我有多台设备 有100台设备 并且有些设备我不知道名字我不能再代码中把名字写死 那我是否可以 通过hamibot 直接获取在线设备 再去获取设备的名字呢?并且他们是可以相互通知的 第一台设备 满足条件通知别的设备 第二台设备满足条件 通知别的设备 只要有设备满足条件就会通知别的设备!

第 2 条补充
·
4 天前

还有个问题 比如我又两个人同时运行设备 有两个账号 甲账号下有 abcd 手机 乙账号下有 fzny手机 当我a检测到了 我只想让甲账号的bcd执行 该如 脚本名字只是举列子 实际案例的话得通过hamibot 自己获取

回答

Hamibot AI
1
· 4 天前

你可以通过 Hamibot 的 HTTP API + 脚本间通信机制 实现设备之间的消息通知与联动控制。以下是具体实现方案:


✅ 核心思路

  1. 使用 http.request 向 Hamibot 云端 API 发起请求,调用目标设备上脚本的运行接口。
  2. 每个设备运行同一个或不同的脚本,但都具备“监听并响应外部触发”的能力。
  3. 设备 a 在满足条件时,通过 API 触发设备 b、c、d 上指定脚本的执行(可携带参数)。

🧩 前提准备

1. 获取你的 API 令牌

2. 确保目标设备在线

3. 准备要运行的脚本 ID

  • 在控制台找到你要在 b、c、d 上触发运行的脚本,复制其 脚本 ID(如 bfe67d643ababe0ab6fda054

💡 示例场景

设备 a 检测到某个事件发生(比如抢购开始),发送指令让 b、c、d 立即执行“抢购脚本”。


🔧 具体代码实现(JavaScript)

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

// 文档地址 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/

// 文档地址 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/

// 文档地址 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 参数,即你可以明确告诉系统“这个脚本只能在哪些设备上运行”。

步骤如下:

  1. 为每个账号生成独立的 API 令牌

    • 登录甲账号 → 进入 https://hamibot.com/account/tokens → 创建一个令牌(如 hmp_xxx_甲
    • 登录乙账号 → 同样创建另一个令牌(如 hmp_yyy_乙
  2. 在甲账号中编写检测逻辑脚本

    // 文档地址 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());
    }
    
  3. 确保你知道每个设备的 device_id

    • 进入 设备管理页
    • 点击对应设备 → “三个点” → “复制 ID”
    • 将 abcd 四台设备的 ID 分别记录下来
    • 在代码中只传入 b、c、d 的 ID
  4. 避免跨账号干扰

    • 使用哪个账号的 token,就只能操作该账号下的资源(脚本、设备等)
    • 所以乙账号的脚本和设备不会被甲账号误触,天然隔离

🔐 安全性说明

  • 不要将乙账号的 token 泄露给甲账号的脚本
  • 多账号之间默认不共享设备和脚本,除非主动分享(目前你不需分享)

📌 最佳实践建议

  • 把设备 ID 写成配置项或存储在变量中,便于维护
  • 可结合 GET /v1/devices 接口动态获取在线设备列表,再筛选出需要执行的设备
  • 如果有更复杂的调度需求,可以搭建一个简单的控制服务来协调多个账号的任务分发

通过这种方式,你可以精确控制“谁在什么时候让哪些设备执行”,完全满足你提到的“甲账号触发,只让 bcd 执行”的需求。

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