环境说明
使用官方原版 Hamibot 1.6.7,Windows 网页后台发布脚本,安卓手机登录同一账号测试;
分为两个脚本:
守护大脚本:负责轮询读取/sdcard/Download/wla_command.json通讯文件,接收启停指令后拉起业务子脚本;
业务子脚本:网页发布为公开脚本,短识别码uzSy5,长市场 ID 6a4520ea0a9d685af56dd98f。
操作现象
通讯链路正常:守护可以完整读取、解析 json 文件内的启动 / 停止指令,指令识别无报错;
子脚本手动运行正常:手机脚本市场下载完成后,手动点击「运行」能正常打印日志、执行逻辑;
守护代码使用files.getInternalFilesDir()拼接scripts/长ID.js完整本地路径,调用files.exists()判断结果永远为 false;
使用files.listDir()遍历scripts目录,无任何文件输出,目录为空;
执行engines.execScriptFile(拼接好的本地完整路径),直接报错「云端脚本未同步,路径不存在」,拉起失败。
疑问与推测
网页公开下载到本地的市场脚本,是否不会持久化写入/data/user/0/com.hamibot.hamibot/files/scripts/目录?
files.exists、files.listDir 文件 API 是否无法读取市场下载脚本的私有缓存分区?仅能读取手动新建的本地脚本?
市场发布下载的脚本,是否不能使用execScriptFile本地文件接口拉起,只能通过短识别码engines.execScript("uzSy5", 传参)方式启动?
手动点击市场「运行」能执行,是走云端临时缓存,并非读取本地持久化文件?

HAMI_6893877807 · 6 小时前

回答

Hamibot AI
1
· 6 小时前

你的推测基本正确。市场下载的脚本并不会存放在 scripts 目录中,这是导致 files.exists() 返回 false、files.listDir() 遍历为空、engines.execScriptFile() 报错的直接原因。

目录结构说明

  • 本地脚本(你在网页端或脚本管理页面手动创建的脚本)会持久化保存在:
    /data/data/com.hamibot.hamibot/files/scripts/
    因此 files.listDir(files.getInternalFilesDir() + "/scripts/") 能列出它们,execScriptFile 也能正常执行。

  • 市场脚本(从公开市场下载的脚本)并不会写入 scripts 目录,而是存放在另一个私有目录中(例如 market 或类似隔离目录),它们的文件组织方式不同,且不面向用户直接进行文件操作。这也是为什么你用 files.getInternalFilesDir() + "/scripts/" + 长ID.js 拼接出来的路径永远不存在。

为什么手动点击「运行」可以执行?

手动点击“运行”时,Hamibot 内部会识别该脚本是市场脚本,走的是市场脚本的专属加载通道,直接从其私有缓存/存储位置加载执行,而不是去 scripts 目录下寻找文件。所以它能够正常运行,而你用 execScriptFile 尝试访问 scripts 目录下的同名文件注定失败。

正确的拉起方式

你已经在问题中提到了正确的方法:使用短识别码通过 engines.execScript() 启动。这是官方推荐且最可靠的方式,无需关心文件具体存储位置,也能在任何授权设备上正常执行(只要该脚本已下载在本地)。

// 文档地址 https://docs.hamibot.com/
var result = engines.execScript("uzSy5", { key: "value" });

如果你需要传递参数,第二个参数传入一个对象即可,被调脚本通过 engines.myArguments() 接收。

总结

  • 市场脚本 ≠ 本地 scripts 目录下的文件,不要用 files.existsexecScriptFile 去操作它们。
  • 守护脚本拉起市场子脚本,直接用 engines.execScript("uzSy5"),简单可靠,无需拼接路径。

如果你还有其他疑问,可以继续问我。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实