回答
在 Hamibot 中调用 HTTP 上传图片到飞书,需要使用脚本的 http 模块进行 multipart/form-data 请求。以下是实现该功能的完整方案和代码示例。
前置准备
- 飞书权限:需要在飞书开放平台创建应用,获取
App ID和App Secret,并通过接口换取Access Token。 - 脚本权限:在 Hamibot 脚本配置中,确保开启了“网络权限”。
- 图片路径:确保脚本有权限访问图片所在路径(如
/sdcard/下的文件)。
脚本代码
以下代码兼容 Hamibot 的 JavaScript 引擎(Rhino 1.7.15),已避免使用箭头函数和新特性。
// 文档地址 https://docs.hamibot.com/
importClass(java.io.File);
function uploadImageToFeishu() {
// 替换为实际的飞书 Access Token
var accessToken = "你的飞书 Access Token";
// 替换为实际图片的绝对路径
var imagePath = "/sdcard/1.png";
// 飞书上传图片接口地址
var url = "https://open.feishu.cn/open-apis/im/v1/images";
// 检查文件是否存在
var imageFile = new File(imagePath);
if (!imageFile.exists()) {
log("文件不存在:" + imagePath);
return;
}
// 发送 multipart 请求
var res = http.postMultipart(url, {
"image_type": "message"
}, {
"image": imageFile
}, {
"headers": {
"Authorization": "Bearer " + accessToken
}
});
// 处理响应
if (res.statusCode == 200) {
log("上传成功");
var body = res.body.json();
log("图片 Key: " + body.data.image_key);
} else {
log("上传失败:" + res.statusCode);
log(res.body.string());
}
}
uploadImageToFeishu();
关键点说明
- http.postMultipart:这是 Hamibot 脚本中用于上传文件的标准方法。它会自动处理
Content-Type和边界(boundary),不需要手动设置。 - File 对象:使用
new File(path)创建文件对象传递给postMultipart,确保文件被正确读取。 - Authorization:飞书接口需要在 Header 中携带
Bearer格式的 Token。 - 兼容性:代码中使用
var声明变量,使用function定义函数,避免使用箭头函数=>和默认参数,确保在 Rhino 引擎下稳定运行。 - 错误处理:建议检查
statusCode是否为 200,并打印响应内容以便调试接口返回的错误信息。
常见问题
- 401 错误:检查 Access Token 是否过期,Token 通常有有效期,需要定期刷新。
- 403 错误:检查飞书应用是否配置了正确的权限(如“上传图片”权限)。
- 网络错误:确认 Hamibot 脚本设置中已勾选网络权限,且设备网络正常。
如果需要自动获取 Token,可以先调用飞书的 auth/v3/tenant_access_token/internal 接口,将获取到的 Token 变量传递给上传函数。
ℹ️ 本回答由 AI 生成,内容仅供参考