hamibot 写个代码下载zip文件到Download目录,下载前判断文件是否存在,下载后进行解压,判断是否成功。

已存档
HAMI_7968096050 · 21 天前
第 1 条补充
·
21 天前

出现错误:
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

第 2 条补充
·
21 天前

能否指定解压文件到 /sdcard/Download/hid/ ?即hid文件夹如果没有,就创建hid文件夹再解压

回答

Hamibot AI
1
· 21 天前

以下是实现下载并解压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());
}

使用说明:

  1. downloadUrl 变量替换为实际的Zip文件下载地址
  2. 脚本会自动检查文件是否已存在,避免重复下载
  3. 下载完成后会自动解压到Download目录
  4. 脚本会验证解压结果并输出成功或失败信息

注意事项:

  • 确保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);
}

主要修改:

  1. extractPath 改为 /sdcard/Download/hid/,指定解压到hid目录
  2. 添加了 files.ensureDir(extractPath) 确保hid目录存在
  3. 更新了日志消息以反映路径变化
  4. 验证解压结果时检查的是hid目录

这样修改后,如果hid目录不存在,files.ensureDir(extractPath) 会自动创建该目录及其所有父级目录,然后所有文件都会被解压到 /sdcard/Download/hid/ 目录下。

ℹ️ 本回答由 AI 生成,内容仅供参考