kyubotics / coolq-http-api

为 酷Q 提供通过 HTTP 或 WebSocket 接收事件和调用 API 的能力
https://cqhttp.cc/docs/
GNU General Public License v3.0
1.85k stars 308 forks source link

[寻求帮助]文件名不合法,无法发送图片 #311

Closed nazhendenb closed 4 years ago

nazhendenb commented 4 years ago

我知道这边已经有过一个类似的issue了 #307 但是我的问题没有被解决,请允许我再开一个issue

使用环境:Ubuntu18.04 coolq是pro版这点没问题,因为可以撤回别人消息 使用插件:"应用案例"中的订阅 RSSHub 更新并推送到 QQ 群

我查到的用docker volume挂载目录的方法是添加-v参数,但是按照官方教程, 在部署的时候已经把coolq数据文件夹挂载到wine环境里了,而我在安装插件的时候也已经把插件目录放在cool数据文件夹里了,我通过Xftp往里面上传文件也能在wine里面看到,所以现在是不用挂载的。

报错信息如下:

image

image

image

307 中提到"Wine 里面要用 Z:\home\user\coolq" 上面修改三次是因为我觉得目录要用反斜杠。

修改"return"目录也是原作者的想法,我已修改多次,原代码中的 return [CQ:image,file=Z:home\\user\\coolq\\rsshub2qq-master\\tmp\\1.jpg] "file="之后的部分不论怎么改(主要还是 Z:home/xxx 和root/coolq/xxx 分别对应wine里面的目录和Linux系统里的目录)都是"文件名不合法 无法发送" 或者"图片(缓存)不存在"无法发送

最后作者说救不了我,我才来这边打扰

ExerciseBook commented 4 years ago

我觉得是 Z:/

nazhendenb commented 4 years ago

我在coolq pro官方QQ群提问的时候有一位回答我:"1.只有cq http 才能这样发 2. wine里面目录不长这样" 上面描述的是关于目录(2.)的问题。
下面说一些我个人观察到的可能有用的东西: 我在Windows上测试的时候是发送成功了,而且日志也只有一条:"来源"是"HTTP API" 而不是图里的 "酷Q",这点值得关注,或许根本不是目录的问题,而是"来源"不被允许发送。检测脚本本体是在Linux运行的(命令 node index),coolq是在wine环境运行的,或许只有把脚本放在wine里运行(我不知道可行性如何)才能把来源变成"HTTP API"

ExerciseBook commented 4 years ago

我们从新理一下:

  1. 你那天在群里发的只有醋Q的错误那一行,我就保守一点把所有的情况都说清楚。因为原生醋Q是不支持路径发送的。具体见 docs.cqp.im ,懒得折腾的话可以用醋Q原生格式使用。
  2. 现在发现你的确是用的是 cqhttp 发送,因此你的这个酷Q🐎会先被 cqhttp 处理,但是由于 cqhttp 并不能成功处理你的 file 部分的内容 (因为格式根本就是错的),所以就直接原样传递给了 酷Q 。如果你的格式是对的,cqhttp 会将目标文件复制醋Q目录并转换为第一点中提到的格式。
  3. 日志中的来源若是插件指的是插件调用醋Q的数据。
ExerciseBook commented 4 years ago

307 中提到的加载虚拟路径的意思是把图片路径挂载到 酷Q/data/image 里,然后跳过 cqhttp 直接使用酷Q原生的写法来发图片(还能节省io操作)。

nazhendenb commented 4 years ago

307 中提到的加载虚拟路径的意思是把图片路径挂载到 酷Q/data/image 里,然后跳过 cqhttp 直接使用酷Q原生的写法来发图片(还能节省io操作)。

感谢大佬,已经成功了,之前我手残把 file=file:///xxxx中的file:删掉了,刚才看了HTTP API文档之后发现不能删。 然后路径要改成反斜杠并转义,比如 Z:\\home\\user\\coolq\\xxx
然后作者原代码是直接定义了一个参数随机生成了一个文件名,因为路径不一样(/root和Z:)不能直接引用参数,需要用正则表达式处理,我在这里给出作者的处理方案供参考:${imgPath.match(/\/tmp\/(\S*)/)[1]}

有空再探索一下加载虚拟路径的方案

Raven-tu commented 4 years ago

可以共享一下rss.js 文件参考一下吗?我也遇到了Linux无法发送图片的问题。谢谢

ExerciseBook commented 4 years ago

@Raven-tu 带点日志截图可好?

Raven-tu commented 4 years ago

@railannad @ExerciseBook 我遇到的情况和他一样,类似参考楼主的图。 之前参考楼主方法改成了

const cqimgpath = images.map(imgPath => { return [CQ:image,file=file:///Z:\\home\\user\\coolq\\rsshub2qq-master\\${imgPath.match(/\/tmp\/(\S*)/)[1]}] })

然而HTTP log里还是出现类似错误。 在coolq/data/image 也没有看到图片缓存。

文件拷贝失败,源路径:Z:\home\user\coolq\rsshub2qq-master\q3en8fwmu5e.jpg [2020-04-04 17:34:59.588] [W] [增强CQ码] 文件拷贝失败,源路径:Z:\home\user\coolq\rsshub2qq-master\udnxg50hrda.jpg [2020-04-04 17:34:59.589] [W] [增强CQ码] 文件拷贝失败,源路径:Z:\home\user\coolq\rsshub2qq-master\0sk286sq0sa.jpg

所以想让楼主共享一下他改完测成功可以发图的rss.js文件

ExerciseBook commented 4 years ago

你到 wine 环境里看看这个路径是否真的存在吧。

Raven-tu commented 4 years ago

@ExerciseBook 存在的在 docker里映射进去了。

ExerciseBook commented 4 years ago

俺滴意思是,能不能在 wine 环境里正常读到这个文件。 因为你懂的, linux 的权限管理还是比较蛋疼的。可能 wine 无权限读到那个文件。