From e348103e84af83ffc065012d50867309f096fc56 Mon Sep 17 00:00:00 2001 From: super1207 <1875159423@qq.com> Date: Fri, 15 Mar 2024 20:45:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E7=9A=84api=EF=BC=8Cset=5Fqq=5Favatar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ntqqapi/ntcall.ts | 12 ++++++ src/onebot11/action/index.ts | 2 + src/onebot11/action/llonebot/SetQQAvatar.ts | 44 +++++++++++++++++++++ src/onebot11/action/types.ts | 1 + 4 files changed, 59 insertions(+) create mode 100644 src/onebot11/action/llonebot/SetQQAvatar.ts diff --git a/src/ntqqapi/ntcall.ts b/src/ntqqapi/ntcall.ts index 89e99d7..e14801d 100644 --- a/src/ntqqapi/ntcall.ts +++ b/src/ntqqapi/ntcall.ts @@ -96,6 +96,8 @@ export enum NTQQApiMethod { CACHE_CHAT_CLEAR = 'nodeIKernelStorageCleanService/clearChatCacheInfo', OPEN_EXTRA_WINDOW = 'openExternalWindow', + + SET_QQ_AVATAR = 'nodeIKernelProfileService/setHeader' } enum NTQQApiChannel { @@ -894,4 +896,14 @@ export class NTQQApi { }, null] }); } + + static async setQQAvatar(filePath: string) { + return await callNTQQApi({ + methodName: NTQQApiMethod.SET_QQ_AVATAR, + args: [{ + path:filePath + }, null], + timeoutSecond: 10 // 10秒不一定够 + }); + } } \ No newline at end of file diff --git a/src/onebot11/action/index.ts b/src/onebot11/action/index.ts index b01359b..af557be 100644 --- a/src/onebot11/action/index.ts +++ b/src/onebot11/action/index.ts @@ -35,12 +35,14 @@ import CleanCache from "./CleanCache"; import GoCQHTTPUploadGroupFile from "./go-cqhttp/UploadGroupFile"; import {GetConfigAction, SetConfigAction} from "./llonebot/Config"; import GetGroupAddRequest from "./llonebot/GetGroupAddRequest"; +import SetQQAvatar from './llonebot/SetQQAvatar' export const actionHandlers = [ new Debug(), new GetConfigAction(), new SetConfigAction(), new GetGroupAddRequest(), + new SetQQAvatar(), // onebot11 new SendLike(), new GetMsg(), diff --git a/src/onebot11/action/llonebot/SetQQAvatar.ts b/src/onebot11/action/llonebot/SetQQAvatar.ts new file mode 100644 index 0000000..4c1ec28 --- /dev/null +++ b/src/onebot11/action/llonebot/SetQQAvatar.ts @@ -0,0 +1,44 @@ +import BaseAction from "../BaseAction"; +import {NTQQApi} from "../../../ntqqapi/ntcall"; +import {ActionName} from "../types"; +import { uri2local } from "../../utils"; +import * as fs from "node:fs"; +import { checkFileReceived } from "../../../common/utils"; +// import { log } from "../../../common/utils"; + +interface Payload { + file: string +} + +export default class SetAvatar extends BaseAction { + actionName = ActionName.SetQQAvatar + + protected async _handle(payload: Payload): Promise { + const {path, isLocal, errMsg} = (await uri2local(payload.file)) + if (errMsg){ + throw `头像${payload.file}设置失败,file字段可能格式不正确` + } + if (path) { + await checkFileReceived(path, 5000); // 文件不存在QQ会崩溃,需要提前判断 + const ret = await NTQQApi.setQQAvatar(path) + if (!isLocal){ + fs.unlink(path, () => {}) + } + if (!ret) { + throw `头像${payload.file}设置失败,api无返回` + } + // log(`头像设置返回:${JSON.stringify(ret)}`) + if (ret['result'] == 1004022) { + throw `头像${payload.file}设置失败,文件可能不是图片格式` + } else if(ret['result'] != 0) { + throw `头像${payload.file}设置失败,未知的错误,${ret['result']}:${ret['errMsg']}` + } + } else { + if (!isLocal){ + fs.unlink(path, () => {}) + } + throw `头像${payload.file}设置失败,无法获取头像,文件可能不存在` + } + return null + } +} \ No newline at end of file diff --git a/src/onebot11/action/types.ts b/src/onebot11/action/types.ts index 112b0c2..48db8fd 100644 --- a/src/onebot11/action/types.ts +++ b/src/onebot11/action/types.ts @@ -15,6 +15,7 @@ export interface InvalidCheckResult { export enum ActionName { GetGroupIgnoreAddRequest = "get_group_ignore_add_request", + SetQQAvatar = "set_qq_avatar", GetConfig = "get_config", SetConfig = "set_config", Debug = "llonebot_debug",