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": "朴茂豆芽"
}
]
},我想把这些参数都给添加上,应该怎么携带参数呢,
{
"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 {
另外在脚本开发这里,有一个配置模式,我想在配置模式里面就直接传参数,[
{
"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();
这样对嘛,执行脚本的时候能拿到参数嘛
回答
你需要在请求体中添加 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完全一致
问题出在 脚本执行时机。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();
关键修改点
| 修改项 | 说明 |
|---|---|
const 改 function |
用函数包装参数读取,延迟执行 |
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 是否真正传递到了设备端。
不对。
配置模式里的 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 请求实时传入
你的需求建议
如果你想每次运行时传不同的订单数据,应该:
- 配置模式留空或设默认值
- 通过 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: '小助手'
}
})
});