diff --git a/onebot/src/main/kotlin/client/core/Bot.kt b/onebot/src/main/kotlin/client/core/Bot.kt index d183ad2c..64b60bed 100644 --- a/onebot/src/main/kotlin/client/core/Bot.kt +++ b/onebot/src/main/kotlin/client/core/Bot.kt @@ -19,6 +19,7 @@ import cn.evolvefield.onebot.sdk.response.misc.* import cn.evolvefield.onebot.sdk.util.* import cn.evolvefield.onebot.client.config.BotConfig import cn.evolvefield.onebot.client.handler.ActionHandler +import cn.evolvefield.onebot.sdk.response.ext.GetFileResp import com.google.gson.* import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge import org.java_websocket.WebSocket @@ -1428,4 +1429,19 @@ class Bot( val result = actionHandler.action(this, action, params) return result.withClass() } + + /** + * 获取群或好友文件信息 + * + * LLOnebot, NapCat + * @param fileId 文件ID + * @return [ActionData] of [GetFileResp] + */ + suspend fun extGetFile(fileId: String): ActionData { + val action = ActionPathEnum.EXT_GET_FILE + val params = JsonObject() + params.addProperty("file_id", fileId) + val result = actionHandler.action(this, action, params) + return result.withToken() + } } diff --git a/onebot/src/main/kotlin/sdk/enums/ActionPathEnum.kt b/onebot/src/main/kotlin/sdk/enums/ActionPathEnum.kt index ec472bc6..d7faeb32 100644 --- a/onebot/src/main/kotlin/sdk/enums/ActionPathEnum.kt +++ b/onebot/src/main/kotlin/sdk/enums/ActionPathEnum.kt @@ -291,5 +291,12 @@ enum class ActionPathEnum( /** * 获取群文件下载链接 */ - GET_GROUP_FILE_URL("get_group_file_url") + GET_GROUP_FILE_URL("get_group_file_url"), + + /** + * 获取文件下载链接 + * + * 属于 LLOnebot, NapCat 扩展 API + */ + EXT_GET_FILE("get_file"), } diff --git a/onebot/src/main/kotlin/sdk/response/ext/GetFileResp.kt b/onebot/src/main/kotlin/sdk/response/ext/GetFileResp.kt new file mode 100644 index 00000000..92ee0d7b --- /dev/null +++ b/onebot/src/main/kotlin/sdk/response/ext/GetFileResp.kt @@ -0,0 +1,20 @@ +package cn.evolvefield.onebot.sdk.response.ext + +import com.google.gson.annotations.SerializedName +import lombok.AllArgsConstructor +import lombok.Data +import lombok.NoArgsConstructor + +@Data +@AllArgsConstructor +@NoArgsConstructor +class GetFileResp { + @SerializedName("file") + var file: String = "" + @SerializedName("file_name") + var fileName: String = "" + @SerializedName("file_size") + var fileSize: Long = 0 + @SerializedName("base64") + var base64: String? = null +} diff --git a/overflow-core/src/main/kotlin/top/mrxiaom/overflow/internal/contact/data/RemoteFilesWrapper.kt b/overflow-core/src/main/kotlin/top/mrxiaom/overflow/internal/contact/data/RemoteFilesWrapper.kt index a6b09337..49de3afc 100644 --- a/overflow-core/src/main/kotlin/top/mrxiaom/overflow/internal/contact/data/RemoteFilesWrapper.kt +++ b/overflow-core/src/main/kotlin/top/mrxiaom/overflow/internal/contact/data/RemoteFilesWrapper.kt @@ -12,6 +12,7 @@ import top.mrxiaom.overflow.internal.message.data.WrappedFileMessage import top.mrxiaom.overflow.internal.utils.toMiraiFiles import top.mrxiaom.overflow.internal.utils.toMiraiFolders import top.mrxiaom.overflow.spi.FileService +import java.net.URLEncoder import java.util.stream.Stream internal class RemoteFilesWrapper( @@ -205,7 +206,13 @@ internal class FileWrapper( } override suspend fun getUrl(): String? { - return impl.getGroupFileUrl(contact.id, id, busid).data?.url + when (contact.bot.appName.lowercase()) { + "llonebot", "napcat" -> { + val file = contact.bot.impl.extGetFile(id).data + return file?.file?.run { "file:///${URLEncoder.encode(this, "UTF-8")}" } + } + else -> return impl.getGroupFileUrl(contact.id, id, busid).data?.url + } } override suspend fun moveTo(folder: AbsoluteFolder): Boolean {