mirror of
https://github.com/LLOneBot/LLOneBot.git
synced 2024-11-22 01:56:33 +00:00
Merge branch 'dev' of github.com:linyuchen/LiteLoaderQQNT-OneBotApi into dev
This commit is contained in:
commit
dc559ce36c
103
src/onebot11/action/go-cqhttp/DownloadFile.ts
Normal file
103
src/onebot11/action/go-cqhttp/DownloadFile.ts
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
import BaseAction from "../BaseAction";
|
||||||
|
import {ActionName} from "../types";
|
||||||
|
import fs from "fs";
|
||||||
|
import {join as joinPath} from "node:path";
|
||||||
|
import {calculateFileMD5, DATA_DIR} from "../../../common/utils";
|
||||||
|
|
||||||
|
interface Payload {
|
||||||
|
thread_count?: number
|
||||||
|
url?: string
|
||||||
|
base64?: string
|
||||||
|
name?: string
|
||||||
|
headers?: string | string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FileResponse {
|
||||||
|
file: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const localPath = joinPath(DATA_DIR, "file_cache")
|
||||||
|
export default class GoCQHTTPDownloadFile extends BaseAction<Payload, FileResponse> {
|
||||||
|
actionName = ActionName.GoCQHTTP_DownloadFile
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
if (!fs.existsSync(localPath)) {
|
||||||
|
fs.mkdirSync(localPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async _handle(payload: Payload): Promise<FileResponse> {
|
||||||
|
let name = payload.name || "";
|
||||||
|
const isRandomName = !payload.name
|
||||||
|
|
||||||
|
if (isRandomName) {
|
||||||
|
do {
|
||||||
|
name = this.generateRandomString(10);
|
||||||
|
// 使用循环防止极低概率的情况下随机出已有的文件, 导致覆盖
|
||||||
|
} while (fs.existsSync(joinPath(localPath, name)));
|
||||||
|
}
|
||||||
|
|
||||||
|
const filePath = joinPath(localPath, name);
|
||||||
|
|
||||||
|
if (payload.base64) {
|
||||||
|
fs.writeFileSync(filePath, payload.base64, 'base64')
|
||||||
|
} else if (payload.url) {
|
||||||
|
const headers = this.getHeaders(payload.headers);
|
||||||
|
|
||||||
|
const result = await fetch(payload.url, {headers})
|
||||||
|
if (! result.ok) throw new Error(`下载文件失败: ${result.statusText}`)
|
||||||
|
|
||||||
|
const blob = await result.blob();
|
||||||
|
let buffer = await blob.arrayBuffer();
|
||||||
|
fs.writeFileSync(filePath, Buffer.from(buffer), 'binary');
|
||||||
|
} else {
|
||||||
|
throw new Error("不存在任何文件, 无法下载")
|
||||||
|
}
|
||||||
|
if (fs.existsSync(filePath)) {
|
||||||
|
|
||||||
|
if (isRandomName) {
|
||||||
|
// 默认实现要名称未填写时文件名为文件 md5
|
||||||
|
const md5 = await calculateFileMD5(filePath);
|
||||||
|
const newPath = joinPath(localPath, md5);
|
||||||
|
fs.renameSync(filePath, newPath);
|
||||||
|
return { file: newPath }
|
||||||
|
}
|
||||||
|
return { file: filePath }
|
||||||
|
} else {
|
||||||
|
throw new Error("文件写入失败, 检查权限")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generateRandomString(length: number): string {
|
||||||
|
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
let randomString = '';
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
const randomIndex = Math.floor(Math.random() * characters.length);
|
||||||
|
randomString += characters.charAt(randomIndex);
|
||||||
|
}
|
||||||
|
return randomString;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaders(headersIn?: string | string[]): any {
|
||||||
|
const headers = {};
|
||||||
|
if (typeof headersIn == 'string') {
|
||||||
|
headersIn = headersIn.split('[\\r\\n]');
|
||||||
|
}
|
||||||
|
if (Array.isArray(headersIn)) {
|
||||||
|
for (const headerItem of headersIn) {
|
||||||
|
const spilt = headerItem.indexOf('=');
|
||||||
|
if (spilt < 0) {
|
||||||
|
headers[headerItem] = "";
|
||||||
|
} else {
|
||||||
|
const key = headerItem.substring(0, spilt);
|
||||||
|
headers[key] = headerItem.substring(0, spilt + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!headers['Content-Type']) {
|
||||||
|
headers['Content-Type'] = 'application/octet-stream';
|
||||||
|
}
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
}
|
@ -36,6 +36,7 @@ import GoCQHTTPUploadGroupFile from "./go-cqhttp/UploadGroupFile";
|
|||||||
import {GetConfigAction, SetConfigAction} from "./llonebot/Config";
|
import {GetConfigAction, SetConfigAction} from "./llonebot/Config";
|
||||||
import GetGroupAddRequest from "./llonebot/GetGroupAddRequest";
|
import GetGroupAddRequest from "./llonebot/GetGroupAddRequest";
|
||||||
import SetQQAvatar from './llonebot/SetQQAvatar'
|
import SetQQAvatar from './llonebot/SetQQAvatar'
|
||||||
|
import GoCQHTTPDownloadFile from "./go-cqhttp/DownloadFile";
|
||||||
|
|
||||||
export const actionHandlers = [
|
export const actionHandlers = [
|
||||||
new Debug(),
|
new Debug(),
|
||||||
@ -72,6 +73,7 @@ export const actionHandlers = [
|
|||||||
new GoCQHTTPSendGroupForwardMsg(),
|
new GoCQHTTPSendGroupForwardMsg(),
|
||||||
new GoCQHTTPSendPrivateForwardMsg(),
|
new GoCQHTTPSendPrivateForwardMsg(),
|
||||||
new GoCQHTTPGetStrangerInfo(),
|
new GoCQHTTPGetStrangerInfo(),
|
||||||
|
new GoCQHTTPDownloadFile(),
|
||||||
new GetGuildList(),
|
new GetGuildList(),
|
||||||
new GoCQHTTPMarkMsgAsRead(),
|
new GoCQHTTPMarkMsgAsRead(),
|
||||||
new GoCQHTTPUploadGroupFile(),
|
new GoCQHTTPUploadGroupFile(),
|
||||||
|
@ -54,4 +54,5 @@ export enum ActionName {
|
|||||||
GetGuildList = "get_guild_list",
|
GetGuildList = "get_guild_list",
|
||||||
GoCQHTTP_MarkMsgAsRead = "mark_msg_as_read",
|
GoCQHTTP_MarkMsgAsRead = "mark_msg_as_read",
|
||||||
GoCQHTTP_UploadGroupFile = "upload_group_file",
|
GoCQHTTP_UploadGroupFile = "upload_group_file",
|
||||||
|
GoCQHTTP_DownloadFile = "download_file",
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user