From a2038b86f144cabd8f62c7a8c5b8befe56711e74 Mon Sep 17 00:00:00 2001 From: fdc310 <82008029+fdc310@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:38:02 +0800 Subject: [PATCH] feat:add onebotv11 face send and accept but some face no name. (#1543) * feat:add onebotv11 face send and accept but some face no name. * add face annotation * add face_code_dict * add some face in image can't download,so pass on face * fix:Pass the face_id to face --- pkg/platform/sources/aiocqhttp.py | 74 +++++++++++++++++++++++++++++-- pkg/platform/types/message.py | 34 +++++++++++++- 2 files changed, 102 insertions(+), 6 deletions(-) diff --git a/pkg/platform/sources/aiocqhttp.py b/pkg/platform/sources/aiocqhttp.py index 71eac6f5..3f3ef512 100644 --- a/pkg/platform/sources/aiocqhttp.py +++ b/pkg/platform/sources/aiocqhttp.py @@ -63,6 +63,13 @@ class AiocqhttpMessageConverter(adapter.MessageConverter): msg_list.extend((await AiocqhttpMessageConverter.yiri2target(node.message_chain))[0]) elif isinstance(msg, platform_message.File): msg_list.append({"type":"file", "data":{'file': msg.url, "name": msg.name}}) + elif isinstance(msg, platform_message.Face): + if msg.face_type=='face': + msg_list.append(aiocqhttp.MessageSegment.face(msg.face_id)) + elif msg.face_type=='rps': + msg_list.append(aiocqhttp.MessageSegment.rps()) + elif msg.face_type=='dice': + msg_list.append(aiocqhttp.MessageSegment.dice()) else: @@ -72,9 +79,45 @@ class AiocqhttpMessageConverter(adapter.MessageConverter): @staticmethod async def target2yiri(message: str, message_id: int = -1,bot=None): - # print(message) + print(message) message = aiocqhttp.Message(message) + def get_face_name(face_id): + face_code_dict = { + "2": '好色', + "4": "得意", "5": "流泪", "8": "睡", "9": "大哭", "10": "尴尬", "12": "调皮", "14": "微笑", "16": "酷", + "21": "可爱", + "23": "傲慢", "24": "饥饿", "25": "困", "26": "惊恐", "27": "流汗", "28": "憨笑", "29": "悠闲", + "30": "奋斗", + "32": "疑问", "33": "嘘", "34": "晕", "38": "敲打", "39": "再见", "41": "发抖", "42": "爱情", + "43": "跳跳", + "49": "拥抱", "53": "蛋糕", "60": "咖啡", "63": "玫瑰", "66": "爱心", "74": "太阳", "75": "月亮", + "76": "赞", + "78": "握手", "79": "胜利", "85": "飞吻", "89": "西瓜", "96": "冷汗", "97": "擦汗", "98": "抠鼻", + "99": "鼓掌", + "100": "糗大了", "101": "坏笑", "102": "左哼哼", "103": "右哼哼", "104": "哈欠", "106": "委屈", + "109": "左亲亲", + "111": "可怜", "116": "示爱", "118": "抱拳", "120": "拳头", "122": "爱你", "123": "NO", "124": "OK", + "125": "转圈", + "129": "挥手", "144": "喝彩", "147": "棒棒糖", "171": "茶", "173": "泪奔", "174": "无奈", "175": "卖萌", + "176": "小纠结", "179": "doge", "180": "惊喜", "181": "骚扰", "182": "笑哭", "183": "我最美", + "201": "点赞", + "203": "托脸", "212": "托腮", "214": "啵啵", "219": "蹭一蹭", "222": "抱抱", "227": "拍手", + "232": "佛系", + "240": "喷脸", "243": "甩头", "246": "加油抱抱", "262": "脑阔疼", "264": "捂脸", "265": "辣眼睛", + "266": "哦哟", + "267": "头秃", "268": "问号脸", "269": "暗中观察", "270": "emm", "271": "吃瓜", "272": "呵呵哒", + "273": "我酸了", + "277": "汪汪", "278": "汗", "281": "无眼笑", "282": "敬礼", "284": "面无表情", "285": "摸鱼", + "287": "哦", + "289": "睁眼", "290": "敲开心", "293": "摸锦鲤", "294": "期待", "297": "拜谢", "298": "元宝", + "299": "牛啊", + "305": "右亲亲", "306": "牛气冲天", "307": "喵喵", "314": "仔细分析", "315": "加油", "318": "崇拜", + "319": "比心", + "320": "庆祝", "322": "拒绝", "324": "吃糖", "326": "生气" + } + return face_code_dict.get(face_id,'') + async def process_message_data(msg_data, reply_list): if msg_data["type"] == "image": image_base64, image_format = await image.qq_image_url_to_base64(msg_data["data"]['url']) @@ -118,8 +161,15 @@ class AiocqhttpMessageConverter(adapter.MessageConverter): elif msg.type == 'text': yiri_msg_list.append(platform_message.Plain(text=msg.data['text'])) elif msg.type == 'image': - image_base64, image_format = await image.qq_image_url_to_base64(msg.data['url']) - yiri_msg_list.append(platform_message.Image(base64=f'data:image/{image_format};base64,{image_base64}')) + emoji_id = msg.data.get("emoji_package_id", None) + if emoji_id: + face_id = emoji_id + face_name = msg.data.get("summary", '') + image_msg = platform_message.Face(face_id=face_id, face_name=face_name) + else: + image_base64, image_format = await image.qq_image_url_to_base64(msg.data['url']) + image_msg = platform_message.Image(base64=f'data:image/{image_format};base64,{image_base64}') + yiri_msg_list.append(image_msg) elif msg.type == 'forward': # 暂时不太合理 # msg_datas = await bot.get_msg(message_id=message_id) @@ -147,6 +197,18 @@ class AiocqhttpMessageConverter(adapter.MessageConverter): file_url = file_data.get('file_url') file_size = file_data.get('file_size') yiri_msg_list.append(platform_message.File(id=file_id, name=file_name,url=file_url,size=file_size)) + elif msg.type == 'face': + face_id = msg.data['id'] + face_name = msg.data['raw']['faceText'] + if not face_name: + face_name = get_face_name(face_id) + yiri_msg_list.append(platform_message.Face(face_id=int(face_id),face_name=face_name.replace('/',''))) + elif msg.type == 'rps': + face_id = msg.data['result'] + yiri_msg_list.append(platform_message.Face(face_type="rps",face_id=int(face_id),face_name='猜拳')) + elif msg.type == 'dice': + face_id = msg.data['result'] + yiri_msg_list.append(platform_message.Face(face_type='dice',face_id=int(face_id),face_name='骰子')) @@ -163,6 +225,8 @@ class AiocqhttpMessageConverter(adapter.MessageConverter): + + class AiocqhttpEventConverter(adapter.EventConverter): @staticmethod async def yiri2target(event: platform_events.MessageEvent, bot_account_id: int): @@ -170,7 +234,6 @@ class AiocqhttpEventConverter(adapter.EventConverter): @staticmethod async def target2yiri(event: aiocqhttp.Event,bot=None): - yiri_chain = await AiocqhttpMessageConverter.target2yiri(event.message, event.message_id,bot) @@ -289,8 +352,11 @@ class AiocqhttpAdapter(adapter.MessagePlatformAdapter): if event_type == platform_events.GroupMessage: self.bot.on_message('group')(on_message) + # self.bot.on_notice()(on_message) elif event_type == platform_events.FriendMessage: self.bot.on_message('private')(on_message) + # self.bot.on_notice()(on_message) + # print(event_type) async def on_websocket_connection(event: aiocqhttp.Event): for event in self.on_websocket_connection_event_cache: diff --git a/pkg/platform/types/message.py b/pkg/platform/types/message.py index 94756149..7dad4145 100644 --- a/pkg/platform/types/message.py +++ b/pkg/platform/types/message.py @@ -804,7 +804,7 @@ class File(MessageComponent): """文件识别 ID。""" name: str """文件名称。""" - size: int = '' + size: int = 0 """文件大小。""" url: str """文件路径""" @@ -812,6 +812,36 @@ class File(MessageComponent): def __str__(self): return f'[文件]{self.name}' +class Face(MessageComponent): + """系统表情 + 此处将超级表情骰子/划拳,一同归类于face + 当face_type为rps(划拳)时 face_id 对应的是手势 + 当face_type为dice(骰子)时 face_id 对应的是点数 + """ + type: str = 'Face' + """表情类型""" + face_type: str = 'face' + """表情id""" + face_id: int = 0 + """表情名""" + face_name: str = '' + + def __str__(self): + if self.face_type == 'face': + return f'[表情]{self.face_name}' + elif self.face_type == 'dice': + return f'[表情]{self.face_id}点的{self.face_name}' + elif self.face_type == 'rps': + return f'[表情]{self.face_name}({self.rps_data(self.face_id)})' + + + def rps_data(self,face_id): + rps_dict ={ + 1 : "布", + 2 : "剪刀", + 3 : "石头", + } + return rps_dict[face_id] # ================ 个人微信专用组件 ================ @@ -935,7 +965,7 @@ class WeChatFile(MessageComponent): """文件识别 ID。""" file_name: str = '' """文件名称。""" - file_size: int = '' + file_size: int = 0 """文件大小。""" file_path: str = '' """文件地址"""