onebot适配器如何获得用户上传的文件

我想要实现在qq中获取用户上传的文件
这是我目前的代码

async addRole(role: string,session) {
    session.send(`请上传${role}的音频文件`)
    let quoteId ;
    const input = await session.prompt((session) => {
      quoteId = session.messageId
      console.log(session)
      return h.select(session.elements, 'file')
    }, { timeout: 100000 })
    console.log("file:",input)
    session.send(`已收到文件`)
    if (isNullable(input)) return `${quoteId ? h.quote(quoteId) : ''}输入超时,已取消。`
  }

上传文件后控制台的输出是:

file: [
  Element {
    type: 'file',
    attrs: {
      src: 'silver.wav',
      file: 'silver.wav',
      path: '',
      fileId: '74fa1218f95b09df4de35ea1c783c368_c6452956-7a68-11ef-bf38-8307ae91f46d',
      fileSize: '4856778'
    },
    children: []
  }
]

path中的值为空,这个应该是因为qq不会自动下载文件。
所以现在问题是如何能让qq自动下载该文件
我查找了onebot适配器的api
https://github.com/koishijs/koishi-plugin-adapter-onebot?tab=readme-ov-file

这里的api似乎只有一个 onebot.downloadFile()与这个相关,我看了这个api文档

这个api似乎是下载网络文件,但是我还是将fileid传进去尝试了

但获得了如下报错

到这里就没有头绪了。有没有人救救我

3 个赞

试水试水

2 个赞

我在 go-cqhttp 文档中也没有找到下载聊天文件的 API。不过,LLOneBotNapCat 都支持一个 /get_file API,你可以使用以下方法直接向 OneBot 实现发送请求:

const { retcode, data, message } = await session.onebot._request("get_file", { fileId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" })

此时,如果请求正常,文件应该已经保存到 data.file 所示的路径。

3 个赞