使用findImage方法的时候,需要寻找的图片应该存放在什么位置
我有多张需要找的图片使用images。load方法怎么实现遍历我要找的图片
保存失败:{"code":1050,"message":"请求额度不足,前往控制台获取更多 https://hamibot.com/account/quotas","documentation_url":"https://docs.hamibot.com/rest/overview"}
回答
使用 findImage 方法时,需要寻找的模板图片通常存放在设备的内部存储目录中,例如 /sdcard/ 目录下。你需要确保脚本有权限读取该路径,并且路径填写正确。
通过 images.read() 函数加载本地图片,然后传入 findImage 进行匹配。路径必须是绝对路径。
以下是一个完整的代码示例:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 读取存放在 /sdcard/ 目录下的模板图片
var template = images.read('/sdcard/模板图片.png');
// 判断图片是否加载成功
if (!template) {
toastLog('图片加载失败,请检查路径');
hamibot.exit();
}
// 截图并找图
var p = findImage(captureScreen(), template, {
threshold: 0.8
});
if (p) {
toastLog('找到啦:' + p);
} else {
toastLog('没找到');
}
hamibot.exit();
注意事项:
- 图片路径必须完整,例如
/sdcard/xxx.png。 - 确保图片文件确实存在于指定路径,否则
images.read()会返回 null。 - 对屏幕截图进行找图时,需要申请屏幕截图权限
requestScreenCapture()。 - 找图相似度
threshold可根据实际情况调整,范围 0~1,默认 0.9。
补充回答 1
使用 images.load 方法遍历多张网络图片时,你需要将图片的 URL 地址存储在一个数组中,然后通过循环逐个加载并进行找图操作。由于 images.load 加载的是网络图片,需要注意网络稳定性,并且每次加载后的 Image 对象必须手动回收以避免内存泄漏。
以下是一个完整的代码示例,展示如何遍历 URL 数组并查找图片:
// 文档地址 https://docs.hamibot.com/
auto.waitFor();
if (!requestScreenCapture()) {
toastLog('没有授予 Hamibot 屏幕截图权限');
hamibot.exit();
}
sleep(1000);
// 定义需要寻找的图片 URL 数组
var imageUrls = [
"https://example.com/image1.png",
"https://example.com/image2.png",
"https://example.com/image3.png"
];
var found = false;
var screen = captureScreen();
// 遍历 URL 数组
for (var i = 0; i < imageUrls.length; i++) {
var url = imageUrls[i];
// 加载网络图片
var template = images.load(url);
// 判断图片是否加载成功
if (template) {
toastLog('正在查找第 ' + (i + 1) + ' 张图片...');
// 在屏幕截图中查找模板
var p = findImage(screen, template, {
threshold: 0.8
});
if (p) {
toastLog('找到图片:' + url + ' 位置:' + p);
found = true;
// 回收模板图片
template.recycle();
break; // 找到后退出循环
} else {
toastLog('未找到第 ' + (i + 1) + ' 张图片');
}
// 回收模板图片,非常重要
template.recycle();
} else {
toastLog('图片加载失败:' + url);
}
}
// 屏幕截图不需要回收,但模板图片必须回收
if (!found) {
toastLog('所有图片均未找到');
}
hamibot.exit();
关键点说明:
- 内存回收:
images.load返回的 Image 对象占用内存,使用完毕后必须调用recycle()方法回收,否则容易导致脚本内存溢出崩溃。 - 空值检查:网络加载可能失败,
images.load失败时返回 null,使用前必须判断对象是否存在。 - 截图复用:示例中只截取了一次屏幕
captureScreen(),在循环中复用这张截图进行找图,效率比每次循环都截图更高。 - 网络延迟:加载网络图片受网速影响,如果图片较多或较大,建议适当增加超时处理或考虑先将图片下载到本地使用
images.read读取,这样更稳定且速度更快。
补充回答 2
这个错误表明你的 REST API 请求额度 已耗尽。错误码 1050 specifically 指向请求额度不足。
错误原因
Hamibot 对 REST API 的调用次数有限制。每个账户每月有一定的免费请求额度,当该额度用尽时,涉及 API 调用的操作(如保存脚本配置、触发远程运行等)会失败并返回此错误。
额度规则
- 免费额度:每月 100 次。
- 重置时间:每月 1 号 00:00:00 自动重置。
- 用途:每次调用 REST API 接口消耗 1 次额度。
解决方案
-
购买额度
前往控制台购买额外的请求额度。
地址:https://hamibot.cn/account/quotas -
等待重置
如果不紧急,可以等待到下个月 1 号,免费额度会自动刷新。 -
检查使用情况
你可以通过 API 查询当前额度使用情况,确认剩余次数。示例代码:
// 文档地址 https://docs.hamibot.com/ var res = http.request('https://api.hamibot.com/v1/usage', { method: 'GET', headers: { authorization: '你的令牌(hmp 开头)', }, }); log(res.body.json());响应示例:
{ "limit": 800, // 配额数量 "remaining": 0, // 剩余次数(若为 0 则会报错) "used": 100, // 已用次数 "reset": "2026-04-01 00:00:00" // 刷新时间 }
建议前往控制台查看具体订阅计划,根据需求增加配额以避免影响自动化任务运行。