const contactName = hamibot.env.contactName || "文件传输助手";

function buildMessage() {
if (hamibot.env.messageText) {
return hamibot.env.messageText;
}

const title = hamibot.env.title || "新订单通知";
const orderNo = hamibot.env.orderNo || "无订单号";
const startAddress = hamibot.env.startAddress || "无地址信息";
const endAddress = hamibot.env.endAddress || "无地址信息";
const desc = hamibot.env.desc || "无描述";
const payAmount = hamibot.env.payAmount || "0";
const url = hamibot.env.url || "";

这个是我的脚本部分源码,我想要在运行脚本的时候传递参数,也就是post请求这里,https://api.hamibot.com/v1/scripts/69e072303969746367d33ece/run请求这个接口,携带的数据是{
"devices": [
{
"_id": "69e07fc1f91f4f25291b1c46",
"name": "朴茂豆芽"
}
]
},我想把这些参数都给添加上,应该怎么携带参数呢,

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

{
"devices": [
{
"_id": "69e07fc1f91f4f25291b1c46",
"name": "朴茂豆芽"
}
],
"vars": {
"contactName": "小助手",
"title": "新订单通知",
"orderNo": "ORD20240115001",
"startAddress": "北京市朝阳区",
"endAddress": "上海市浦东新区",
"desc": "加急订单,请尽快处理",
"payAmount": "299.00",
"url": "https://example.com/order/123"
}
}我明明也是这样请求的呀,为啥还是直接发送的🌟订单通知:新订单通知
🐾订单号: 无订单号
🚩起点: 无地址信息
🏠终点: 无地址信息
💬描述: 无描述
💰赏金: 0元
🔗详情:
快递外卖代取、跑腿万能代办,就上小程序【潍院服务站】而且还是给文件传输助手发的,这是源码你看看const contactName = hamibot.env.contactName || "文件传输助手";

function buildMessage() {
if (hamibot.env.messageText) {
return hamibot.env.messageText;
}

const title = hamibot.env.title || "新订单通知";
const orderNo = hamibot.env.orderNo || "无订单号";
const startAddress = hamibot.env.startAddress || "无地址信息";
const endAddress = hamibot.env.endAddress || "无地址信息";
const desc = hamibot.env.desc || "无描述";
const payAmount = hamibot.env.payAmount || "0";
const url = hamibot.env.url || "";

return [
    `🌟订单通知:${title}`,
    `🐾订单号: ${orderNo}`,
    `🚩起点: ${startAddress}`,
    `🏠终点: ${endAddress}`,
    `💬描述: ${desc}`,
    `💰赏金: ${payAmount}元`,
    `🔗详情: ${url}`,
    "快递外卖代取、跑腿万能代办,就上小程序【潍院服务站】"
].join("\n");

}

const messageText = buildMessage();

// === 第一步:强制启动微信 ===
if (!app.launch("com.tencent.mm")) {
toastLog("启动微信失败");
exit();
}

// === 第二步:直接点击聊天列表中的联系人 ===
console.log("开始查找聊天列表中的联系人...", contactName);
let chatItem = text(contactName).findOne(5000) ||
desc(contactName).findOne(5000) ||
className("android.widget.TextView").textContains(contactName).findOne(5000);

if (chatItem) {
chatItem.click();
let bounds = chatItem.bounds();
click(bounds.centerX(), bounds.centerY());
toastLog("点击联系人成功");
} else {

第 2 条补充
·
4 天前

另外在脚本开发这里,有一个配置模式,我想在配置模式里面就直接传参数,[
{
"orderNo": "2025040212536541564565",
"startAddress": "武珈山",
"endAddress": "终点地址",
"title": "新订单通知",
"desc": "快递代取",
"url": "https://wxxxx.xxx.com/fr45tg",
"payAmount": "5",
"schoolId": "kBjDRGWEHJjGk_cN"
}
]我是这样写的,function getContactName() {
return hamibot.env.contactName || "文件传输助手";
}

function buildMessage() {
if (hamibot.env.messageText) {
return hamibot.env.messageText;
}

const title = hamibot.env.title || "新订单通知";
const orderNo = hamibot.env.orderNo || "无订单号";
const startAddress = hamibot.env.startAddress || "无地址信息";
const endAddress = hamibot.env.endAddress || "无地址信息";
const desc = hamibot.env.desc || "无描述";
const payAmount = hamibot.env.payAmount || "0";
const url = hamibot.env.url || "";

return [
    `🌟订单通知:${title}`,
    `🐾订单号: ${orderNo}`,
    `🚩起点: ${startAddress}`,
    `🏠终点: ${endAddress}`,
    `💬描述: ${desc}`,
    `💰赏金: ${payAmount}元`,
    `🔗详情: ${url}`,
    "快递外卖代取、跑腿万能代办,就上小程序【潍院服务站】"
].join("\n");

}

function backToWechatHome() {
toastLog("开始返回微信主页面");

for (let i = 0; i < 5; i++) {
    if (text("微信").exists() && text("通讯录").exists() && text("发现").exists() && text("我").exists()) {
        toastLog("已返回微信主页面");
        return true;
    }

    back();
    sleep(800);
}

toastLog("未能完全返回微信主页面,请手动检查");
return false;

}

function main() {
sleep(500);

const contactName = getContactName();
const messageText = buildMessage();

这样对嘛,执行脚本的时候能拿到参数嘛

回答

Hamibot AI
1
· 4 天前

你需要在请求体中添加 vars 字段来传递脚本参数,这些参数会通过 hamibot.env 在脚本中获取到。

正确的请求格式

{
  "devices": [
    {
      "_id": "69e07fc1f91f4f25291b1c46",
      "name": "朴茂豆芽"
    }
  ],
  "vars": {
    "contactName": "客户张三",
    "title": "新订单通知",
    "orderNo": "ORD20240115001",
    "startAddress": "北京市朝阳区",
    "endAddress": "上海市浦东新区",
    "desc": "加急订单,请尽快处理",
    "payAmount": "299.00",
    "url": "https://example.com/order/123"
  }
}

完整代码示例

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

http.request('https://api.hamibot.com/v1/scripts/69e072303969746367d33ece/run', {
    method: 'POST',
    contentType: 'application/json',
    headers: {
        authorization: '你的令牌(hmp 开头)',
    },
    body: JSON.stringify({
        devices: [{
            _id: '69e07fc1f91f4f25291b1c46',
            name: '朴茂豆芽'
        }],
        vars: {
            // 联系人名称
            contactName: '客户张三',
            
            // 消息相关
            title: '新订单通知',
            messageText: '',  // 如果填写,buildMessage会直接返回这个
            
            // 订单信息
            orderNo: 'ORD20240115001',
            startAddress: '北京市朝阳区',
            endAddress: '上海市浦东新区',
            desc: '加急订单,请尽快处理',
            payAmount: '299.00',
            url: 'https://example.com/order/123'
        }
    }),
});

参数对应关系

API 参数 脚本中获取 说明
vars.contactName hamibot.env.contactName 联系人名称
vars.messageText hamibot.env.messageText 完整消息文本(优先级最高)
vars.title hamibot.env.title 消息标题
vars.orderNo hamibot.env.orderNo 订单号
vars.startAddress hamibot.env.startAddress 起始地址
vars.endAddress hamibot.env.endAddress 目的地址
vars.desc hamibot.env.desc 订单描述
vars.payAmount hamibot.env.payAmount 支付金额
vars.url hamibot.env.url 链接地址

动态构建请求示例

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

function runScriptWithOrder(orderData) {
    var deviceId = '69e07fc1f91f4f25291b1c46';
    var deviceName = '朴茂豆芽';
    var scriptId = '69e072303969746367d33ece';
    var token = '你的令牌';
    
    // 构建 vars 参数
    var vars = {
        contactName: orderData.contactName || '文件传输助手',
        title: orderData.title || '新订单通知',
        orderNo: orderData.orderNo || '',
        startAddress: orderData.startAddress || '',
        endAddress: orderData.endAddress || '',
        desc: orderData.desc || '',
        payAmount: orderData.payAmount || '0',
        url: orderData.url || ''
    };
    
    // 如果提供了完整消息,优先使用
    if (orderData.messageText) {
        vars.messageText = orderData.messageText;
    }
    
    var response = http.request('https://api.hamibot.com/v1/scripts/' + scriptId + '/run', {
        method: 'POST',
        contentType: 'application/json',
        headers: {
            authorization: token,
        },
        body: JSON.stringify({
            devices: [{
                _id: deviceId,
                name: deviceName
            }],
            vars: vars
        }),
    });
    
    log('响应码: ' + response.statusCode);
    return response;
}

// 使用示例
runScriptWithOrder({
    contactName: '客户李四',
    title: '紧急订单',
    orderNo: 'ORD20240115002',
    startAddress: '深圳市南山区',
    endAddress: '广州市天河区',
    desc: '冷链运输,温度要求2-8度',
    payAmount: '1580.00'
});

注意事项

  • vars 中的所有值都会转为字符串传递到脚本
  • 如果 messageText 有值,buildMessage() 会直接返回它,忽略其他字段
  • 确保字段名与脚本中 hamibot.env.xxx 完全一致

参考文档:https://docs.hamibot.com/

ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot AI
1
· 4 天前

问题出在 脚本执行时机hamibot.env 的值在脚本开始运行时就已经确定了,而你的 const messageText = buildMessage()const contactName = ... 都在脚本顶部立即执行,这时候 hamibot.env 可能还没有被正确注入。

根本原因

Hamibot 的 hamibot.env 注入有延迟,直接在脚本顶部用 const 读取会拿到空值,导致全部使用了默认值。

解决方案

将参数读取移到函数内部,延迟到实际使用时再获取:

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

// ❌ 错误:顶部立即读取,可能拿不到值
// const contactName = hamibot.env.contactName || "文件传输助手";
// const messageText = buildMessage();

// ✅ 正确:封装成函数,使用时再读取
function getContactName() {
    return hamibot.env.contactName || "文件传输助手";
}

function buildMessage() {
    // 在函数内部读取,确保 hamibot.env 已注入
    if (hamibot.env.messageText) {
        return hamibot.env.messageText;
    }

    const title = hamibot.env.title || "新订单通知";
    const orderNo = hamibot.env.orderNo || "无订单号";
    const startAddress = hamibot.env.startAddress || "无地址信息";
    const endAddress = hamibot.env.endAddress || "无地址信息";
    const desc = hamibot.env.desc || "无描述";
    const payAmount = hamibot.env.payAmount || "0";
    const url = hamibot.env.url || "";

    return [
        `🌟订单通知:${title}`,
        `🐾订单号: ${orderNo}`,
        `🚩起点: ${startAddress}`,
        `🏠终点: ${endAddress}`,
        `💬描述: ${desc}`,
        `💰赏金: ${payAmount}元`,
        `🔗详情: ${url}`,
        "快递外卖代取、跑腿万能代办,就上小程序【潍院服务站】"
    ].join("\n");
}

// === 主流程 ===
function main() {
    // 延迟一点确保 env 注入完成
    sleep(500);
    
    const contactName = getContactName();
    const messageText = buildMessage();
    
    console.log("联系人:", contactName);
    console.log("消息内容:", messageText);
    
    // === 第一步:强制启动微信 ===
    if (!app.launch("com.tencent.mm")) {
        toastLog("启动微信失败");
        exit();
    }
    
    // === 第二步:直接点击聊天列表中的联系人 ===
    console.log("开始查找聊天列表中的联系人...", contactName);
    let chatItem = text(contactName).findOne(5000) ||
                   desc(contactName).findOne(5000) ||
                   className("android.widget.TextView").textContains(contactName).findOne(5000);
    
    if (chatItem) {
        chatItem.click();
        let bounds = chatItem.bounds();
        click(bounds.centerX(), bounds.centerY());
        toastLog("点击联系人成功");
    } else {
        toastLog("未找到联系人: " + contactName);
        exit();
    }
    
    // ... 后续发送消息代码
}

main();

关键修改点

修改项 说明
constfunction 用函数包装参数读取,延迟执行
main() 函数包裹 所有逻辑放入 main,顶部只放函数定义
sleep(500) 启动时短暂延迟,确保 hamibot.env 注入完成
使用时再调用 buildMessage()getContactName() 在 main 中调用

备选方案:强制延迟读取

如果上述方案仍有问题,可以用更激进的方式:

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

// 强制等待 env 注入
function waitForEnv(timeout) {
    timeout = timeout || 3000;
    var start = new Date().getTime();
    while (new Date().getTime() - start < timeout) {
        // 检查任意一个预期参数是否存在
        if (hamibot.env.contactName !== undefined) {
            return true;
        }
        sleep(100);
    }
    return false;
}

function main() {
    // 等待 env 注入
    var hasEnv = waitForEnv(3000);
    console.log("Env 注入状态:", hasEnv);
    console.log("contactName:", hamibot.env.contactName);
    
    // 后续逻辑...
}

main();

调试建议

在脚本开头添加调试输出,确认参数是否传入:

function main() {
    sleep(500);
    
    // 调试:打印所有 env 参数
    console.log("=== hamibot.env 调试 ===");
    for (var key in hamibot.env) {
        console.log(key + ": " + hamibot.env[key]);
    }
    console.log("========================");
    
    // 后续逻辑...
}

这样可以在日志中确认 vars 是否真正传递到了设备端。

参考文档:https://docs.hamibot.com/

ℹ️ 内容由 AI 生成,可能不准确,请注意核实
Hamibot AI
1
· 4 天前

不对。

配置模式里的 JSON 数组不会自动映射到 hamibot.env。你需要在配置中定义表单字段,而不是直接写 JSON 数组。

正确的配置方式

在脚本开发的配置模式中,应该这样定义:

[
  {
    "label": "订单号",
    "name": "orderNo",
    "type": "text",
    "default": ""
  },
  {
    "label": "起点地址",
    "name": "startAddress",
    "type": "text",
    "default": ""
  },
  {
    "label": "终点地址",
    "name": "endAddress",
    "type": "text",
    "default": ""
  },
  {
    "label": "标题",
    "name": "title",
    "type": "text",
    "default": "新订单通知"
  },
  {
    "label": "描述",
    "name": "desc",
    "type": "text",
    "default": ""
  },
  {
    "label": "链接",
    "name": "url",
    "type": "text",
    "default": ""
  },
  {
    "label": "金额",
    "name": "payAmount",
    "type": "text",
    "default": "0"
  },
  {
    "label": "联系人",
    "name": "contactName",
    "type": "text",
    "default": "文件传输助手"
  }
]

你的代码需要调整

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

function getContactName() {
    return hamibot.env.contactName || "文件传输助手";
}

function buildMessage() {
    // 所有参数都从 hamibot.env 读取
    const title = hamibot.env.title || "新订单通知";
    const orderNo = hamibot.env.orderNo || "无订单号";
    const startAddress = hamibot.env.startAddress || "无地址信息";
    const endAddress = hamibot.env.endAddress || "无地址信息";
    const desc = hamibot.env.desc || "无描述";
    const payAmount = hamibot.env.payAmount || "0";
    const url = hamibot.env.url || "";

    return [
        `🌟订单通知:${title}`,
        `🐾订单号: ${orderNo}`,
        `🚩起点: ${startAddress}`,
        `🏠终点: ${endAddress}`,
        `💬描述: ${desc}`,
        `💰赏金: ${payAmount}元`,
        `🔗详情: ${url}`,
        "快递外卖代取、跑腿万能代办,就上小程序【潍院服务站】"
    ].join("\n");
}

function main() {
    sleep(500);
    
    // 调试:打印所有参数
    log("=== 参数检查 ===");
    log("contactName: " + hamibot.env.contactName);
    log("orderNo: " + hamibot.env.orderNo);
    log("title: " + hamibot.env.title);
    // ... 其他参数
    
    const contactName = getContactName();
    const messageText = buildMessage();
    
    log("最终联系人: " + contactName);
    log("最终消息: " + messageText);
    
    // 后续逻辑...
}

main();

关键区别

方式 用途 参数获取
配置模式 脚本开发时预设默认值 hamibot.env.xxx
API 的 vars 运行时动态传入 hamibot.env.xxx

两种方式的参数最终都通过 hamibot.env 获取,但来源不同:

  • 配置模式:用户在 Hamibot 客户端手动填写
  • API 的 vars:通过 HTTP 请求实时传入

你的需求建议

如果你想每次运行时传不同的订单数据,应该:

  1. 配置模式留空或设默认值
  2. 通过 API 调用时传入 vars
// API 调用示例
http.request('https://api.hamibot.com/v1/scripts/xxx/run', {
    method: 'POST',
    headers: { authorization: '你的令牌' },
    body: JSON.stringify({
        devices: [{ _id: '设备ID', name: '设备名' }],
        vars: {
            orderNo: '2025040212536541564565',
            startAddress: '武珈山',
            endAddress: '终点地址',
            title: '新订单通知',
            desc: '快递代取',
            url: 'https://wxxxx.xxx.com/fr45tg',
            payAmount: '5',
            contactName: '小助手'
        }
    })
});

参考文档:https://docs.hamibot.com/

ℹ️ 内容由 AI 生成,可能不准确,请注意核实