回答
音乐下载失败通常由网络请求配置、存储权限或路径问题导致。按以下步骤排查并使用标准下载方案即可解决:
1. 常见原因排查
- 存储权限未开启:Hamibot 需要“存储”权限才能写入文件。请在系统设置中为 Hamibot 开启存储权限。Android 10+ 启用分区存储后,直接写入
/sdcard/可能受限,建议使用应用私有目录或确保已授予“所有文件访问权限”。 - 链接需要请求头:多数音乐源会校验
User-Agent、Referer或Cookie。缺少这些头信息会导致服务器返回 403 或 404。 - 目录不存在或路径非法:保存路径必须包含完整文件名及后缀(如
.mp3),且父目录需提前创建。 - 网络超时或重定向:部分链接会返回 302 跳转,需确保
http模块自动跟随重定向,或手动处理。
2. 标准下载代码(兼容 Rhino 1.7.15)
// 文档地址 https://docs.hamibot.com/
function downloadMusic(url, savePath) {
try {
// 自动创建父目录
files.ensureDir(savePath);
var response = http.get(url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Referer": "https://music.example.com" // 替换为实际音乐站域名
},
timeout: 15000
});
if (response.statusCode == 200) {
var bytes = response.body.bytes();
files.writeBytes(savePath, bytes);
toastLog("音乐下载成功:" + savePath);
return true;
} else {
console.error("下载失败,状态码:" + response.statusCode);
return false;
}
} catch (e) {
console.error("下载异常:" + e);
return false;
}
}
// 使用示例
var musicUrl = "https://example.com/song.mp3"; // 替换为有效直链
var savePath = files.join(files.getSdcardPath(), "Download", "music.mp3");
downloadMusic(musicUrl, savePath);
3. 最佳实践建议
- 防息屏断网:在脚本开头添加
device.keepScreenOn(),避免下载过程中屏幕关闭导致网络中断。 - 大文件处理:若音乐文件较大,建议分块写入或使用
response.body.string()配合流式处理,避免bytes()占用过多内存。 - 动态链接处理:若音乐 URL 带有时效性 token,需在每次下载前重新请求获取最新链接。
- 路径兼容:优先使用
files.join(files.cwd(), "downloads", "music.mp3")写入 Hamibot 工作目录,可避开 Android 分区存储限制。
按上述方案调整后,若仍提示失败,请提供 console.error 输出的具体错误信息及目标链接类型,我将进一步协助定位。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实