hamibot 写个代码下载zip文件到Download目录,下载前判断文件是否存在,下载后进行解压,判断是否成功。
出现错误:
09:45:52.852/E: TypeError: 对象 TypeError: 对象 com.stardust.autojs.runtime.api.Files@d7eca11 不存在方法 getPath. 不存在方法 getMessage. (697bf8d3a5c74cc1dda30e07.js#77)
TypeError: 对象 TypeError: 对象 com.stardust.autojs.runtime.api.Files@d7eca11 不存在方法 getPath. 不存在方法 getMessage.
at 697bf8d3a5c74cc1dda30e07.js:77:0
能否指定解压文件到 /sdcard/Download/hid/ ?即hid文件夹如果没有,就创建hid文件夹再解压
回答
以下是实现下载并解压Zip文件的Hamibot脚本代码:
// 文档地址 https://docs.hamibot.com/
// 配置参数
var downloadUrl = "https://example.com/file.zip"; // 替换为实际下载地址
var fileName = "download.zip";
var downloadPath = "/sdcard/Download/" + fileName;
var extractPath = "/sdcard/Download/";
// 检查文件是否已存在
if (files.exists(downloadPath)) {
toastLog("文件已存在,跳过下载");
} else {
// 下载文件
toastLog("开始下载文件...");
var response = http.get(downloadUrl);
if (response.statusCode == 200) {
// 保存文件
files.writeBytes(downloadPath, response.body.bytes());
toastLog("文件下载完成: " + downloadPath);
} else {
toastLog("下载失败,HTTP状态码: " + response.statusCode);
hamibot.exit();
}
}
// 解压文件
toastLog("开始解压文件...");
try {
var zipFile = new java.util.zip.ZipFile(downloadPath);
var entries = zipFile.entries();
while (entries.hasMoreElements()) {
var entry = entries.nextElement();
var entryPath = extractPath + entry.getName();
if (entry.isDirectory()) {
// 创建目录
files.createWithDirs(entryPath);
} else {
// 创建文件目录
var parentDir = files.getPath(entryPath).getParent();
if (parentDir != null && !files.exists(parentDir)) {
files.createWithDirs(parentDir);
}
// 解压文件
var inputStream = zipFile.getInputStream(entry);
var outputStream = new java.io.FileOutputStream(entryPath);
var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
var length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
}
zipFile.close();
toastLog("文件解压成功: " + extractPath);
// 验证解压结果(检查至少有一个文件被解压)
var extractedFiles = files.listDir(extractPath);
if (extractedFiles && extractedFiles.length > 0) {
toastLog("解压验证成功,找到 " + extractedFiles.length + " 个文件/目录");
} else {
toastLog("解压验证失败,未找到解压文件");
}
} catch (e) {
toastLog("解压失败: " + e.getMessage());
}
使用说明:
- 将
downloadUrl变量替换为实际的Zip文件下载地址 - 脚本会自动检查文件是否已存在,避免重复下载
- 下载完成后会自动解压到Download目录
- 脚本会验证解压结果并输出成功或失败信息
注意事项:
- 确保Hamibot有存储权限
- 如果下载大文件,可能需要增加超时时间
- 解压路径会根据Zip文件内的目录结构保持原样
补充回答 1
在Hamibot中,files.getPath() 方法并不存在,正确的API是 files.path(relativePath),但它返回字符串而不是Path对象。此外,错误对象应使用 e.message 属性而不是 e.getMessage() 方法。以下是修正后的代码,使用Java的File类来处理路径操作,并确保兼容性:
// 文档地址 https://docs.hamibot.com/
// 配置参数
var downloadUrl = "https://example.com/file.zip"; // 替换为实际下载地址
var fileName = "download.zip";
var downloadPath = "/sdcard/Download/" + fileName;
var extractPath = "/sdcard/Download/";
// 检查文件是否已存在
if (files.exists(downloadPath)) {
toastLog("文件已存在,跳过下载");
} else {
// 下载文件
toastLog("开始下载文件...");
var response = http.get(downloadUrl);
if (response.statusCode == 200) {
// 保存文件
files.writeBytes(downloadPath, response.body.bytes());
toastLog("文件下载完成: " + downloadPath);
} else {
toastLog("下载失败,HTTP状态码: " + response.statusCode);
hamibot.exit();
}
}
// 解压文件
toastLog("开始解压文件...");
try {
var zipFile = new java.util.zip.ZipFile(downloadPath);
var entries = zipFile.entries();
while (entries.hasMoreElements()) {
var entry = entries.nextElement();
var entryPath = extractPath + entry.getName();
if (entry.isDirectory()) {
// 创建目录
files.ensureDir(entryPath);
} else {
// 获取父目录
var parentDir = new java.io.File(entryPath).getParent();
if (parentDir != null && !files.exists(parentDir)) {
files.ensureDir(parentDir);
}
// 解压文件
var inputStream = zipFile.getInputStream(entry);
var outputStream = new java.io.FileOutputStream(entryPath);
var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
var length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
}
zipFile.close();
toastLog("文件解压成功: " + extractPath);
// 验证解压结果(检查解压目录是否有内容)
var extractedFiles = files.listDir(extractPath);
if (extractedFiles && extractedFiles.length > 0) {
toastLog("解压验证成功,找到 " + extractedFiles.length + " 个文件/目录");
} else {
toastLog("解压验证失败,未找到解压文件");
}
} catch (e) {
toastLog("解压失败: " + e.message);
}
错误修正说明:
files.getPath()问题:原代码使用了不存在的files.getPath()方法。修正后使用new java.io.File(entryPath).getParent()来获取父目录路径(返回字符串),然后使用files.ensureDir()确保目录存在。e.getMessage()问题:原代码使用了e.getMessage(),但在JavaScript中错误对象应使用e.message属性。- 目录处理:使用
files.ensureDir()来创建目录,它会自动创建所有必要的父目录,确保路径存在。
使用注意事项:
- 将
downloadUrl替换为实际的Zip文件URL。 - 确保Hamibot有存储权限和网络权限。
- 如果下载大文件,可能需要在
http.get()中设置超时或使用分块下载,但当前代码已简化。 - 解压部分使用Java的ZipFile类,兼容Rhino引擎。
如果仍有问题,请检查网络连接或文件权限。
补充回答 2
当然可以。以下是修改后的代码,指定解压到 /sdcard/Download/hid/ 目录,并在解压前确保该目录存在:
// 文档地址 https://docs.hamibot.com/
// 配置参数
var downloadUrl = "https://example.com/file.zip"; // 替换为实际下载地址
var fileName = "download.zip";
var downloadPath = "/sdcard/Download/" + fileName;
var extractPath = "/sdcard/Download/hid/"; // 指定解压到hid目录
// 确保hid目录存在
files.ensureDir(extractPath);
// 检查文件是否已存在
if (files.exists(downloadPath)) {
toastLog("文件已存在,跳过下载");
} else {
// 下载文件
toastLog("开始下载文件...");
var response = http.get(downloadUrl);
if (response.statusCode == 200) {
// 保存文件
files.writeBytes(downloadPath, response.body.bytes());
toastLog("文件下载完成: " + downloadPath);
} else {
toastLog("下载失败,HTTP状态码: " + response.statusCode);
hamibot.exit();
}
}
// 解压文件
toastLog("开始解压文件到hid目录...");
try {
var zipFile = new java.util.zip.ZipFile(downloadPath);
var entries = zipFile.entries();
while (entries.hasMoreElements()) {
var entry = entries.nextElement();
var entryPath = extractPath + entry.getName();
if (entry.isDirectory()) {
// 创建目录
files.ensureDir(entryPath);
} else {
// 获取父目录
var parentDir = new java.io.File(entryPath).getParent();
if (parentDir != null && !files.exists(parentDir)) {
files.ensureDir(parentDir);
}
// 解压文件
var inputStream = zipFile.getInputStream(entry);
var outputStream = new java.io.FileOutputStream(entryPath);
var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
var length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
}
zipFile.close();
toastLog("文件解压成功: " + extractPath);
// 验证解压结果(检查hid目录是否有内容)
var extractedFiles = files.listDir(extractPath);
if (extractedFiles && extractedFiles.length > 0) {
toastLog("解压验证成功,hid目录中找到 " + extractedFiles.length + " 个文件/目录");
} else {
toastLog("解压验证失败,hid目录中未找到解压文件");
}
} catch (e) {
toastLog("解压失败: " + e.message);
}
主要修改:
- 将
extractPath改为/sdcard/Download/hid/,指定解压到hid目录 - 添加了
files.ensureDir(extractPath)确保hid目录存在 - 更新了日志消息以反映路径变化
- 验证解压结果时检查的是hid目录
这样修改后,如果hid目录不存在,files.ensureDir(extractPath) 会自动创建该目录及其所有父级目录,然后所有文件都会被解压到 /sdcard/Download/hid/ 目录下。