From 2742c249bfbca6d7a03692b5da5dd1149d65c1bf Mon Sep 17 00:00:00 2001 From: Ethan Date: Mon, 24 Feb 2025 20:09:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=AE=E4=BF=A1=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E4=B8=AD=E5=9B=BE=E7=89=87=E8=8E=B7=E5=8F=96=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=EF=BC=8C=E8=BE=83=E4=B9=8B=E5=89=8D=E7=9A=84=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=9B=BE=E7=89=87=E4=BB=85=E6=8F=90=E4=BE=9B=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E5=96=84=E4=B8=BA=E8=8E=B7=E5=8F=96=E5=BE=AE=E4=BF=A1=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E4=B8=AD=E5=AE=9E=E9=99=85=E5=9B=BE=E7=89=87=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=90=8E=E7=BB=AD=20ocr=20?= =?UTF-8?q?=E6=88=96=E8=80=85=20llm=20vision=20=E8=AF=86=E5=88=AB=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E5=9B=BE=E7=89=87=E5=86=85=E5=AE=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/platform/sources/gewechat.py | 50 +++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/pkg/platform/sources/gewechat.py b/pkg/platform/sources/gewechat.py index 557cf756..a2eeada8 100644 --- a/pkg/platform/sources/gewechat.py +++ b/pkg/platform/sources/gewechat.py @@ -28,7 +28,10 @@ from ...utils import image class GewechatMessageConverter(adapter.MessageConverter): - + + def __init__(self, config: dict): + self.config = config + @staticmethod async def yiri2target( message_chain: platform_message.MessageChain @@ -48,8 +51,8 @@ class GewechatMessageConverter(adapter.MessageConverter): return content_list - @staticmethod async def target2yiri( + self, message: dict, bot_account_id: str ) -> platform_message.MessageChain: @@ -74,10 +77,29 @@ class GewechatMessageConverter(adapter.MessageConverter): return platform_message.MessageChain(content_list) elif message["Data"]["MsgType"] == 3: - image_base64 = message["Data"]["ImgBuf"]["buffer"] - return platform_message.MessageChain( - [platform_message.Image(base64=f"data:image/jpeg;base64,{image_base64}")] - ) + image_xml = message["Data"]["Content"]["string"] + if not image_xml: + return platform_message.MessageChain([ + platform_message.Plain(text="[图片内容为空]") + ]) + + try: + base64_str, image_format = await image.get_gewechat_image_base64( + gewechat_url=self.config["gewechat_url"], + app_id=self.config["app_id"], + xml_content=image_xml + ) + + return platform_message.MessageChain([ + platform_message.Image( + base64=f"data:image/{image_format};base64,{base64_str}" + ) + ]) + except Exception as e: + print(f"处理图片消息失败: {str(e)}") + return platform_message.MessageChain([ + platform_message.Plain(text="[图片处理失败]") + ]) elif message["Data"]["MsgType"] == 49: # 支持微信聊天记录的消息类型,将 XML 内容转换为 MessageChain 传递 @@ -106,19 +128,23 @@ class GewechatMessageConverter(adapter.MessageConverter): ) class GewechatEventConverter(adapter.EventConverter): - + + def __init__(self, config: dict): + self.config = config + self.message_converter = GewechatMessageConverter(config) + @staticmethod async def yiri2target( event: platform_events.MessageEvent ) -> dict: pass - @staticmethod async def target2yiri( + self, event: dict, bot_account_id: str ) -> platform_events.MessageEvent: - message_chain = await GewechatMessageConverter.target2yiri(copy.deepcopy(event), bot_account_id) + message_chain = await self.message_converter.target2yiri(copy.deepcopy(event), bot_account_id) if not message_chain: return None @@ -172,8 +198,8 @@ class GeWeChatAdapter(adapter.MessagePlatformAdapter): ap: app.Application - message_converter: GewechatMessageConverter = GewechatMessageConverter() - event_converter: GewechatEventConverter = GewechatEventConverter() + message_converter: GewechatMessageConverter + event_converter: GewechatEventConverter listeners: typing.Dict[ typing.Type[platform_events.Event], @@ -186,6 +212,8 @@ class GeWeChatAdapter(adapter.MessagePlatformAdapter): self.quart_app = quart.Quart(__name__) + + @self.quart_app.route('/gewechat/callback', methods=['POST']) async def gewechat_callback(): data = await quart.request.json