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<GeneralCallResult>({
+            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<Payload, null> {
+    actionName = ActionName.SetQQAvatar
+
+    protected async _handle(payload: Payload): Promise<null> {
+        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",