From a26b494f7f721124ed76b566b21c2b9ee9a57f02 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Thu, 12 Jun 2025 10:57:16 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BE=AE=E4=BF=A1=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AF=AD=E9=9F=B3=E7=9A=84=E6=94=B6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes: #1794 --- .../platform/sources/wecom/wecom_adapter.py | 25 ++++++++++++++++++- .../platform/sources/wecom/wecom_event.py | 24 ++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/astrbot/core/platform/sources/wecom/wecom_adapter.py b/astrbot/core/platform/sources/wecom/wecom_adapter.py index 528a8cab8..e229038d7 100644 --- a/astrbot/core/platform/sources/wecom/wecom_adapter.py +++ b/astrbot/core/platform/sources/wecom/wecom_adapter.py @@ -303,6 +303,7 @@ class WecomPlatformAdapter(Platform): abm.session_id = external_userid abm.type = MessageType.FRIEND_MESSAGE abm.message_id = msg.get("msgid", uuid.uuid4().hex[:8]) + abm.message_str = "" if msgtype == "text": text = msg.get("text", {}).get("content", "").strip() abm.message = [Plain(text=text)] @@ -316,7 +317,29 @@ class WecomPlatformAdapter(Platform): with open(path, "wb") as f: f.write(resp.content) abm.message = [Image(file=path, url=path)] - abm.message_str = "[图片]" + elif msgtype == "voice": + media_id = msg.get("voice", {}).get("media_id", "") + resp: Response = await asyncio.get_event_loop().run_in_executor( + None, self.client.media.download, media_id + ) + + temp_dir = os.path.join(get_astrbot_data_path(), "temp") + path = os.path.join(temp_dir, f"weixinkefu_{media_id}.amr") + with open(path, "wb") as f: + f.write(resp.content) + + try: + from pydub import AudioSegment + + path_wav = os.path.join(temp_dir, f"weixinkefu_{media_id}.wav") + audio = AudioSegment.from_file(path) + audio.export(path_wav, format="wav") + except Exception as e: + logger.error(f"转换音频失败: {e}。如果没有安装 ffmpeg 请先安装。") + path_wav = path + return + + abm.message = [Record(file=path_wav, url=path_wav)] else: logger.warning(f"未实现的微信客服消息事件: {msg}") return diff --git a/astrbot/core/platform/sources/wecom/wecom_event.py b/astrbot/core/platform/sources/wecom/wecom_event.py index 1c1c09c91..e8078a9ac 100644 --- a/astrbot/core/platform/sources/wecom/wecom_event.py +++ b/astrbot/core/platform/sources/wecom/wecom_event.py @@ -120,6 +120,30 @@ class WecomPlatformEvent(AstrMessageEvent): self.get_self_id(), response["media_id"], ) + elif isinstance(comp, Record): + record_path = await comp.convert_to_file_path() + # 转成amr + temp_dir = os.path.join(get_astrbot_data_path(), "temp") + record_path_amr = os.path.join(temp_dir, f"{uuid.uuid4()}.amr") + pydub.AudioSegment.from_wav(record_path).export( + record_path_amr, format="amr" + ) + + with open(record_path_amr, "rb") as f: + try: + response = self.client.media.upload("voice", f) + except Exception as e: + logger.error(f"微信客服上传语音失败: {e}") + await self.send( + MessageChain().message(f"微信客服上传语音失败: {e}") + ) + return + logger.info(f"微信客服上传语音返回: {response}") + kf_message_api.send_voice( + user_id, + self.get_self_id(), + response["media_id"], + ) else: logger.warning(f"还没实现这个消息类型的发送逻辑: {comp.type}。") else: