From abcac895b43c4576fe02719e6e5c7afd5e906702 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sun, 27 Apr 2025 17:29:17 +0800 Subject: [PATCH 01/25] feat: add retry download capability for media messages --- efb_wechat_comwechat_slave/ComWechat.py | 73 +++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 9f0a4b4..90c2f23 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -11,8 +11,8 @@ import re import json -from ehforwarderbot.chat import SystemChat, PrivateChat , SystemChatMember, ChatMember, SelfChatMember import hashlib +from ehforwarderbot.chat import SystemChat, PrivateChat , GroupChat, SystemChatMember, ChatMember, SelfChatMember from typing import Tuple, Optional, Collection, BinaryIO, Dict, Any , Union , List from datetime import datetime from cachetools import TTLCache @@ -31,9 +31,9 @@ from .ChatMgr import ChatMgr from .CustomTypes import EFBGroupChat, EFBPrivateChat, EFBGroupMember, EFBSystemUser -from .MsgDeco import qutoed_text +from .MsgDeco import qutoed_text, efb_image_wrapper, efb_file_wrapper, efb_voice_wrapper, efb_video_wrapper from .MsgProcess import MsgProcess -from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION +from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION, load_local_file_to_temp from rich.console import Console from rich import print as rprint @@ -511,14 +511,32 @@ def handle_file_msg(self): for path in list(self.file_msg.keys()): flag = False msg = self.file_msg[path][0] - author = self.file_msg[path][1] - chat = self.file_msg[path][2] + author: ChatMember = self.file_msg[path][1] + chat : Chat= self.file_msg[path][2] + commands = [] if os.path.exists(path): flag = True elif (int(time.time()) - msg["timestamp"]) > self.time_out: msg_type = msg["type"] msg['message'] = f"[{msg_type} 下载超时,请在手机端查看]" msg["type"] = "text" + chattype = "Unknown" + if isinstance(chat, GroupChat): + chattype = "group" + elif isinstance(chat, PrivateChat): + chattype = "private" + commands.append( + MessageCommand( + name=("Retry"), + callable_name="retry_download", + kwargs={ + "msgid": msg["msgid"], + "msgtype": msg_type, + "chattype": chattype, + "chatuid": chat.uid, + }, + ) + ) flag = True elif msg["type"] == "voice": sql = f'SELECT Buf FROM Media WHERE Reserved0 = {msg["msgid"]}' @@ -532,8 +550,10 @@ def handle_file_msg(self): flag = True if flag: + m = MsgProcess(msg, chat) + m.commands = MessageCommands(commands) del self.file_msg[path] - self.send_efb_msgs(MsgProcess(msg, chat), author=author, chat=chat, uid=msg['msgid']) + self.send_efb_msgs(m, author=author, chat=chat, uid=msg['msgid']) if len(self.delete_file): for k in list(self.delete_file.keys()): @@ -546,6 +566,47 @@ def handle_file_msg(self): pass del self.delete_file[file_path] + def retry_download(self, msgid, msgtype, chattype, chatuid): + try: + res = self.bot.GetCdn(msgid=msgid) + if res["msg"] == 1: + path = res["path"].replace("\\","/").replace("C:/users/user/My Documents/WeChat Files/", self.dir ) + count = 1 + while True: + if os.path.exists(path): + break + elif count > self.time_out: + self.logger.warning(f"Timeout when retrying download {msgid}.") + return + count += 1 + time.sleep(1) + + file = load_local_file_to_temp(path) + if msgtype == "image": + efb_msgs = efb_image_wrapper(file) + elif msgtype == "share": + efb_msgs = efb_file_wrapper(file, os.path.basename(path)) + elif msgtype == "voice": + efb_msgs = efb_voice_wrapper(file , file.name + ".ogg") + elif msgtype == "video": + efb_msgs = efb_video_wrapper(file) + if chattype == "group": + c = ChatMgr.build_efb_chat_as_group(EFBGroupChat( + uid = chatuid, + )) + elif chattype == "private": + c = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( + uid = chatuid + )) + else: + self.logger.warning(f"Unknown chat type {chattype} when retrying download {msgid}.") + return + master_message = coordinator.master.get_message_by_id(chat=c, msg_id=msgid) + efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs + self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) + except Exception as e: + self.logger.warning(f"Error occurred when retrying download {msgid}. {e}") + def process_friend_request(self , v3 , v4): self.logger.debug(f"process_friend_request:{v3} {v4}") res = self.bot.VerifyApply(v3 = v3 , v4 = v4) From 288cbab0e4d1355f3a1c6f8f26307928993693b9 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sun, 27 Apr 2025 22:07:13 +0800 Subject: [PATCH 02/25] feat: add /retry command to allow manual retry of timed out messages --- efb_wechat_comwechat_slave/ComWechat.py | 106 +++++++++++++++--------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 90c2f23..bcaede3 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -552,6 +552,7 @@ def handle_file_msg(self): if flag: m = MsgProcess(msg, chat) m.commands = MessageCommands(commands) + m.vendor_specific["wechat_msgtype"] = msg_type del self.file_msg[path] self.send_efb_msgs(m, author=author, chat=chat, uid=msg['msgid']) @@ -567,45 +568,48 @@ def handle_file_msg(self): del self.delete_file[file_path] def retry_download(self, msgid, msgtype, chattype, chatuid): - try: - res = self.bot.GetCdn(msgid=msgid) - if res["msg"] == 1: - path = res["path"].replace("\\","/").replace("C:/users/user/My Documents/WeChat Files/", self.dir ) - count = 1 - while True: - if os.path.exists(path): - break - elif count > self.time_out: - self.logger.warning(f"Timeout when retrying download {msgid}.") - return - count += 1 - time.sleep(1) + file = self.GetMsgCdn(msgid) + efb_msgs = self._build_media_msg(msgtype, file) + if not efb_msgs: + return f"[msg type {msg_type} 非法]" + efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs + if chattype == "group": + c = ChatMgr.build_efb_chat_as_group(EFBGroupChat( + uid = chatuid, + )) + elif chattype == "private": + c = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( + uid = chatuid + )) + else: + return f"[chat type {chattype} 非法]" + master_message = coordinator.master.get_message_by_id(chat=c, msg_id=msgid) + self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) + return "下载成功" + + def retry_download_target(self, target: Message = None): + file = self.GetMsgCdn(target.uid) + msgtype = target.vendor_specific.get("wechat_msgtype", None) + efb_msgs = self._build_media_msg(msgtype, file) + if not efb_msgs: + return + efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs - file = load_local_file_to_temp(path) - if msgtype == "image": - efb_msgs = efb_image_wrapper(file) - elif msgtype == "share": - efb_msgs = efb_file_wrapper(file, os.path.basename(path)) - elif msgtype == "voice": - efb_msgs = efb_voice_wrapper(file , file.name + ".ogg") - elif msgtype == "video": - efb_msgs = efb_video_wrapper(file) - if chattype == "group": - c = ChatMgr.build_efb_chat_as_group(EFBGroupChat( - uid = chatuid, - )) - elif chattype == "private": - c = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( - uid = chatuid - )) - else: - self.logger.warning(f"Unknown chat type {chattype} when retrying download {msgid}.") - return - master_message = coordinator.master.get_message_by_id(chat=c, msg_id=msgid) - efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs - self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) - except Exception as e: - self.logger.warning(f"Error occurred when retrying download {msgid}. {e}") + author = target.author + chat = target.chat + self.send_efb_msgs(efb_msgs, uid=msgid, author=author, chat=chat, edit=True, edit_media=True) + + def _build_media_msg(self, msgtype, file): + if msgtype == "image": + return efb_image_wrapper(file) + elif msgtype == "share": + return efb_file_wrapper(file, os.path.basename(path)) + elif msgtype == "voice": + return efb_voice_wrapper(file , file.name + ".ogg") + elif msgtype == "video": + return efb_video_wrapper(file) + else: + return def process_friend_request(self , v3 , v4): self.logger.debug(f"process_friend_request:{v3} {v4}") @@ -777,6 +781,13 @@ def send_message(self, msg : Message) -> Message: res = self.bot.SendAt(chatroom_id = chat_uid, wxids = users, msg = message) else: self.bot.SendText(wxid = chat_uid , msg = msg.text) + elif msg.text.startswith('/retry'): + if isinstance(msg.target, Message): + self.retry_download_target(target=msg.target) + return msg + else: + message = "回复超时消息时使用" + self.system_msg({'sender':chat_uid, 'message':message}) elif msg.text.startswith('/sendcard'): user_nickname = msg.text[10::].split(' ', 1) if len(user_nickname) == 2: @@ -912,6 +923,25 @@ def get_name_by_wxid(self, wxid): name = wxid return name + def GetMsgCdn(self, msgid): + try: + res = self.bot.GetCdn(msgid=msgid) + if res["msg"] == 1: + path = res["path"].replace("\\","/").replace("C:/users/user/My Documents/WeChat Files/", self.dir ) + count = 1 + while True: + if os.path.exists(path): + break + elif count > self.time_out: + self.logger.warning(f"Timeout when retrying download {msgid}.") + return + count += 1 + time.sleep(1) + + return load_local_file_to_temp(path) + except Exception as e: + self.logger.warning(f"Error occurred when retrying download {msgid}. {e}") + #定时更新 Start def GetContactListBySql(self): self.groups = [] From 802c0a7169f1b45c85209385f5feb1f1d46f4a10 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Mon, 28 Apr 2025 09:17:49 +0800 Subject: [PATCH 03/25] fix: handle file failed --- efb_wechat_comwechat_slave/ComWechat.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index bcaede3..14c5161 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -491,7 +491,8 @@ def handle_msg(self , msg : Dict[str, Any] , author : 'ChatMember' , chat : 'Cha msg["filepath"] = f'''{self.dir}{msg["filepath"]}''' self.file_msg[msg["filepath"]] = ( msg , author , chat ) return - except: + except Exception as e: + self.logger.warning(f"Failed to process file msg: {e}") ... if msg["type"] == "voice": @@ -514,10 +515,10 @@ def handle_file_msg(self): author: ChatMember = self.file_msg[path][1] chat : Chat= self.file_msg[path][2] commands = [] + msg_type = msg["type"] if os.path.exists(path): flag = True elif (int(time.time()) - msg["timestamp"]) > self.time_out: - msg_type = msg["type"] msg['message'] = f"[{msg_type} 下载超时,请在手机端查看]" msg["type"] = "text" chattype = "Unknown" @@ -551,7 +552,8 @@ def handle_file_msg(self): if flag: m = MsgProcess(msg, chat) - m.commands = MessageCommands(commands) + if commands: + m.commands = MessageCommands(commands) m.vendor_specific["wechat_msgtype"] = msg_type del self.file_msg[path] self.send_efb_msgs(m, author=author, chat=chat, uid=msg['msgid']) From 166ada6d59bde82190b8828971632260cacff3cf Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 30 Apr 2025 13:37:01 +0800 Subject: [PATCH 04/25] fix: fix missing path --- efb_wechat_comwechat_slave/ComWechat.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 14c5161..af8f86d 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -33,7 +33,7 @@ from .CustomTypes import EFBGroupChat, EFBPrivateChat, EFBGroupMember, EFBSystemUser from .MsgDeco import qutoed_text, efb_image_wrapper, efb_file_wrapper, efb_voice_wrapper, efb_video_wrapper from .MsgProcess import MsgProcess -from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION, load_local_file_to_temp +from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION, load_local_file_to_temp, convert_silk_to_mp3 from rich.console import Console from rich import print as rprint @@ -570,8 +570,10 @@ def handle_file_msg(self): del self.delete_file[file_path] def retry_download(self, msgid, msgtype, chattype, chatuid): - file = self.GetMsgCdn(msgid) - efb_msgs = self._build_media_msg(msgtype, file) + path = self.GetMsgCdn(msgid) + file = load_local_file_to_temp(path) + filename = os.path.basename(path) + efb_msgs = self._build_media_msg(msgtype, file, filename) if not efb_msgs: return f"[msg type {msg_type} 非法]" efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs @@ -590,9 +592,11 @@ def retry_download(self, msgid, msgtype, chattype, chatuid): return "下载成功" def retry_download_target(self, target: Message = None): - file = self.GetMsgCdn(target.uid) + path = self.GetMsgCdn(target.uid) + file = load_local_file_to_temp(path) + filename = os.path.basename(path) msgtype = target.vendor_specific.get("wechat_msgtype", None) - efb_msgs = self._build_media_msg(msgtype, file) + efb_msgs = self._build_media_msg(msgtype, file, filename) if not efb_msgs: return efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs @@ -601,13 +605,13 @@ def retry_download_target(self, target: Message = None): chat = target.chat self.send_efb_msgs(efb_msgs, uid=msgid, author=author, chat=chat, edit=True, edit_media=True) - def _build_media_msg(self, msgtype, file): + def _build_media_msg(self, msgtype, file, filename = None): if msgtype == "image": return efb_image_wrapper(file) elif msgtype == "share": - return efb_file_wrapper(file, os.path.basename(path)) + return efb_file_wrapper(file, filename or file.name) elif msgtype == "voice": - return efb_voice_wrapper(file , file.name + ".ogg") + return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") elif msgtype == "video": return efb_video_wrapper(file) else: @@ -940,7 +944,7 @@ def GetMsgCdn(self, msgid): count += 1 time.sleep(1) - return load_local_file_to_temp(path) + return path except Exception as e: self.logger.warning(f"Error occurred when retrying download {msgid}. {e}") From bcc15bd6d7541dddaebbdaeb187bd577ca2dc659 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 30 Apr 2025 13:45:29 +0800 Subject: [PATCH 05/25] feat: add log --- efb_wechat_comwechat_slave/ComWechat.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index af8f86d..8d9db36 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -615,6 +615,7 @@ def _build_media_msg(self, msgtype, file, filename = None): elif msgtype == "video": return efb_video_wrapper(file) else: + self.logger.warn(f"[msg type {msgtype} 非法]") return def process_friend_request(self , v3 , v4): @@ -939,11 +940,12 @@ def GetMsgCdn(self, msgid): if os.path.exists(path): break elif count > self.time_out: - self.logger.warning(f"Timeout when retrying download {msgid}.") + self.logger.warning(f"Timeout when retrying download {msgid} at {path}.") return count += 1 time.sleep(1) + self.logger.debug(f"Download {path} successfully.") return path except Exception as e: self.logger.warning(f"Error occurred when retrying download {msgid}. {e}") From 42230b76ae86641540c06abd4e51d086059bd92d Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 30 Apr 2025 13:53:58 +0800 Subject: [PATCH 06/25] fix: properly process failed retry --- efb_wechat_comwechat_slave/ComWechat.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 8d9db36..c613229 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -571,6 +571,8 @@ def handle_file_msg(self): def retry_download(self, msgid, msgtype, chattype, chatuid): path = self.GetMsgCdn(msgid) + if not path: + return "下载失败" file = load_local_file_to_temp(path) filename = os.path.basename(path) efb_msgs = self._build_media_msg(msgtype, file, filename) @@ -593,6 +595,8 @@ def retry_download(self, msgid, msgtype, chattype, chatuid): def retry_download_target(self, target: Message = None): path = self.GetMsgCdn(target.uid) + if not path: + return file = load_local_file_to_temp(path) filename = os.path.basename(path) msgtype = target.vendor_specific.get("wechat_msgtype", None) From b0ea18f2e30b499bcf1f3d5ceb88bd143975e75c Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 30 Apr 2025 14:03:14 +0800 Subject: [PATCH 07/25] fix: remove unsupported share type --- efb_wechat_comwechat_slave/ComWechat.py | 26 ++++++++++--------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index c613229..69a2143 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -571,13 +571,9 @@ def handle_file_msg(self): def retry_download(self, msgid, msgtype, chattype, chatuid): path = self.GetMsgCdn(msgid) - if not path: - return "下载失败" - file = load_local_file_to_temp(path) - filename = os.path.basename(path) - efb_msgs = self._build_media_msg(msgtype, file, filename) + efb_msgs = self._build_media_msg(msgtype, path) if not efb_msgs: - return f"[msg type {msg_type} 非法]" + return f"[下载失败]" efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs if chattype == "group": c = ChatMgr.build_efb_chat_as_group(EFBGroupChat( @@ -588,19 +584,15 @@ def retry_download(self, msgid, msgtype, chattype, chatuid): uid = chatuid )) else: - return f"[chat type {chattype} 非法]" + return f"[unsupported chat type: {chattype}]" master_message = coordinator.master.get_message_by_id(chat=c, msg_id=msgid) self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) return "下载成功" def retry_download_target(self, target: Message = None): path = self.GetMsgCdn(target.uid) - if not path: - return - file = load_local_file_to_temp(path) - filename = os.path.basename(path) msgtype = target.vendor_specific.get("wechat_msgtype", None) - efb_msgs = self._build_media_msg(msgtype, file, filename) + efb_msgs = self._build_media_msg(msgtype, path) if not efb_msgs: return efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs @@ -609,17 +601,19 @@ def retry_download_target(self, target: Message = None): chat = target.chat self.send_efb_msgs(efb_msgs, uid=msgid, author=author, chat=chat, edit=True, edit_media=True) - def _build_media_msg(self, msgtype, file, filename = None): + def _build_media_msg(self, msgtype, path): + if not path: + return + file = load_local_file_to_temp(path) + filename = os.path.basename(path) if msgtype == "image": return efb_image_wrapper(file) - elif msgtype == "share": - return efb_file_wrapper(file, filename or file.name) elif msgtype == "voice": return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") elif msgtype == "video": return efb_video_wrapper(file) else: - self.logger.warn(f"[msg type {msgtype} 非法]") + self.logger.warn(f"[unsupported type: {msgtype}]") return def process_friend_request(self , v3 , v4): From 7ecf2244cbf743243623f2fee75a533dba90501f Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Thu, 8 May 2025 09:14:15 +0800 Subject: [PATCH 08/25] feat: return the prompt after retry failed --- efb_wechat_comwechat_slave/ComWechat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 69a2143..e237bc9 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -31,7 +31,7 @@ from .ChatMgr import ChatMgr from .CustomTypes import EFBGroupChat, EFBPrivateChat, EFBGroupMember, EFBSystemUser -from .MsgDeco import qutoed_text, efb_image_wrapper, efb_file_wrapper, efb_voice_wrapper, efb_video_wrapper +from .MsgDeco import qutoed_text, efb_image_wrapper, efb_file_wrapper, efb_voice_wrapper, efb_video_wrapper, efb_text_simple_wrapper from .MsgProcess import MsgProcess from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION, load_local_file_to_temp, convert_silk_to_mp3 @@ -603,7 +603,7 @@ def retry_download_target(self, target: Message = None): def _build_media_msg(self, msgtype, path): if not path: - return + return efb_text_simple_wrapper(f"[重试 {msgtype} 失败,请在手机端查看,可通过 /retry 回复本条消息再次重试]") file = load_local_file_to_temp(path) filename = os.path.basename(path) if msgtype == "image": From 2f4511b0ebda251fafd0e9ac930e37e79f953673 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Thu, 8 May 2025 09:19:11 +0800 Subject: [PATCH 09/25] fix: add share type support --- efb_wechat_comwechat_slave/ComWechat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index e237bc9..27550d9 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -608,6 +608,8 @@ def _build_media_msg(self, msgtype, path): filename = os.path.basename(path) if msgtype == "image": return efb_image_wrapper(file) + elif msgtype == "share": + return efb_file_wrapper(file, filename or file.name) elif msgtype == "voice": return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") elif msgtype == "video": From 1ce2c1d814e6da3a9b2e61939f16ff08ebca6fab Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 30 May 2025 12:01:25 +0800 Subject: [PATCH 10/25] feat: add progress prompt on download media --- efb_wechat_comwechat_slave/ComWechat.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 27550d9..2353ab7 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -483,13 +483,13 @@ def handle_msg(self , msg : Dict[str, Any] , author : 'ChatMember' , chat : 'Cha msg["timestamp"] = int(time.time()) msg["filepath"] = msg["filepath"].replace("\\","/") msg["filepath"] = f'''{self.dir}{msg["filepath"]}''' - self.file_msg[msg["filepath"]] = ( msg , author , chat ) + self._send_file_msg(msg , author , chat ) return if msg["type"] == "video": msg["timestamp"] = int(time.time()) msg["filepath"] = msg["thumb_path"].replace("\\","/").replace(".jpg", ".mp4") msg["filepath"] = f'''{self.dir}{msg["filepath"]}''' - self.file_msg[msg["filepath"]] = ( msg , author , chat ) + self._send_file_msg(msg , author , chat ) return except Exception as e: self.logger.warning(f"Failed to process file msg: {e}") @@ -499,7 +499,7 @@ def handle_msg(self , msg : Dict[str, Any] , author : 'ChatMember' , chat : 'Cha file_path = re.search("clientmsgid=\"(.*?)\"", msg["message"]).group(1) + ".amr" msg["timestamp"] = int(time.time()) msg["filepath"] = f'''{self.dir}{msg["self"]}/{file_path}''' - self.file_msg[msg["filepath"]] = ( msg , author , chat ) + self._send_file_msg(msg , author , chat ) return self.send_efb_msgs(MsgProcess(msg, chat), author=author, chat=chat, uid=MessageID(str(msg['msgid']))) @@ -552,11 +552,13 @@ def handle_file_msg(self): if flag: m = MsgProcess(msg, chat) + m.edit = True + m.edit_media = True if commands: m.commands = MessageCommands(commands) m.vendor_specific["wechat_msgtype"] = msg_type del self.file_msg[path] - self.send_efb_msgs(m, author=author, chat=chat, uid=msg['msgid']) + self.send_efb_msgs(m, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) if len(self.delete_file): for k in list(self.delete_file.keys()): @@ -569,6 +571,15 @@ def handle_file_msg(self): pass del self.delete_file[file_path] + def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): + self.file_msg[msg["filepath"]] = ( msg , author , chat ) + text = f"{msg['type']} is downloading, please wait..." + efb_msg = Message( + type=MsgType.Text, + text=text + ) + self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) + def retry_download(self, msgid, msgtype, chattype, chatuid): path = self.GetMsgCdn(msgid) efb_msgs = self._build_media_msg(msgtype, path) @@ -939,7 +950,7 @@ def GetMsgCdn(self, msgid): while True: if os.path.exists(path): break - elif count > self.time_out: + elif count > 12: # telegram 超过 15s 会报错 self.logger.warning(f"Timeout when retrying download {msgid} at {path}.") return count += 1 From 57fb760bb292d50b681267c71d00a68ec8d5b3f0 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 30 May 2025 12:40:08 +0800 Subject: [PATCH 11/25] fix: make sure edit message is exists --- efb_wechat_comwechat_slave/ComWechat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 2353ab7..1976122 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -572,13 +572,13 @@ def handle_file_msg(self): del self.delete_file[file_path] def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): - self.file_msg[msg["filepath"]] = ( msg , author , chat ) text = f"{msg['type']} is downloading, please wait..." efb_msg = Message( type=MsgType.Text, text=text ) self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) + self.file_msg[msg["filepath"]] = ( msg , author , chat ) def retry_download(self, msgid, msgtype, chattype, chatuid): path = self.GetMsgCdn(msgid) From 8f72902944309305101b36553f1302f5074c6e47 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 30 May 2025 16:02:03 +0800 Subject: [PATCH 12/25] fix: fix name 'msgid' is not defined --- efb_wechat_comwechat_slave/ComWechat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 1976122..6ee39f8 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -610,7 +610,7 @@ def retry_download_target(self, target: Message = None): author = target.author chat = target.chat - self.send_efb_msgs(efb_msgs, uid=msgid, author=author, chat=chat, edit=True, edit_media=True) + self.send_efb_msgs(efb_msgs, uid=target.uid, author=author, chat=chat, edit=True, edit_media=True) def _build_media_msg(self, msgtype, path): if not path: From d422a966bbe546ba80e7e4a519a97b67434dec7d Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 30 May 2025 16:12:48 +0800 Subject: [PATCH 13/25] feat: try to guess msgtype --- efb_wechat_comwechat_slave/ComWechat.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 6ee39f8..a36c1c6 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -602,7 +602,16 @@ def retry_download(self, msgid, msgtype, chattype, chatuid): def retry_download_target(self, target: Message = None): path = self.GetMsgCdn(target.uid) - msgtype = target.vendor_specific.get("wechat_msgtype", None) + if target.type == MsgType.Image: + msgtype = "image" + elif target.type == MsgType.File: + msgtype = "share" + elif target.type == MsgType.Voice: + msgtype = "voice" + elif target.type == MsgType.Video: + msgtype = "video" + else: + msgtype = target.vendor_specific.get("wechat_msgtype", None) efb_msgs = self._build_media_msg(msgtype, path) if not efb_msgs: return From 8f052f5f1e479615f0752ba7063cda6678d6840d Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Mon, 2 Jun 2025 00:32:45 +0800 Subject: [PATCH 14/25] fix: respect original filename --- efb_wechat_comwechat_slave/ComWechat.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index a36c1c6..5684c10 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -627,13 +627,13 @@ def _build_media_msg(self, msgtype, path): file = load_local_file_to_temp(path) filename = os.path.basename(path) if msgtype == "image": - return efb_image_wrapper(file) + return efb_image_wrapper(file, filename=filename) elif msgtype == "share": - return efb_file_wrapper(file, filename or file.name) + return efb_file_wrapper(file, filename=filename) elif msgtype == "voice": return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") elif msgtype == "video": - return efb_video_wrapper(file) + return efb_video_wrapper(file, filename=filename) else: self.logger.warn(f"[unsupported type: {msgtype}]") return From a3fabd7d33bc589fae881549dc66c15b01dc39a5 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sat, 19 Jul 2025 17:20:26 +0800 Subject: [PATCH 15/25] feat: remove progress feature on download media cause it's easier to reach rate limit on telegram --- efb_wechat_comwechat_slave/ComWechat.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 5684c10..46bbfd5 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -572,12 +572,12 @@ def handle_file_msg(self): del self.delete_file[file_path] def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): - text = f"{msg['type']} is downloading, please wait..." - efb_msg = Message( - type=MsgType.Text, - text=text - ) - self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) + # text = f"{msg['type']} is downloading, please wait..." + # efb_msg = Message( + # type=MsgType.Text, + # text=text + # ) + # self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) self.file_msg[msg["filepath"]] = ( msg , author , chat ) def retry_download(self, msgid, msgtype, chattype, chatuid): From a25a5b7faa2966c081b718d1d241a5eb422193ce Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 13 Aug 2025 19:49:07 +0800 Subject: [PATCH 16/25] refactor: remove unnecessary codes --- efb_wechat_comwechat_slave/ComWechat.py | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 46bbfd5..e095c4f 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -521,11 +521,6 @@ def handle_file_msg(self): elif (int(time.time()) - msg["timestamp"]) > self.time_out: msg['message'] = f"[{msg_type} 下载超时,请在手机端查看]" msg["type"] = "text" - chattype = "Unknown" - if isinstance(chat, GroupChat): - chattype = "group" - elif isinstance(chat, PrivateChat): - chattype = "private" commands.append( MessageCommand( name=("Retry"), @@ -533,7 +528,6 @@ def handle_file_msg(self): kwargs={ "msgid": msg["msgid"], "msgtype": msg_type, - "chattype": chattype, "chatuid": chat.uid, }, ) @@ -580,23 +574,14 @@ def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): # self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) self.file_msg[msg["filepath"]] = ( msg , author , chat ) - def retry_download(self, msgid, msgtype, chattype, chatuid): + def retry_download(self, msgid, msgtype, chatuid): path = self.GetMsgCdn(msgid) + chat = self.get_chat(chatuid) efb_msgs = self._build_media_msg(msgtype, path) if not efb_msgs: return f"[下载失败]" efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs - if chattype == "group": - c = ChatMgr.build_efb_chat_as_group(EFBGroupChat( - uid = chatuid, - )) - elif chattype == "private": - c = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( - uid = chatuid - )) - else: - return f"[unsupported chat type: {chattype}]" - master_message = coordinator.master.get_message_by_id(chat=c, msg_id=msgid) + master_message = coordinator.master.get_message_by_id(chat=chat, msg_id=msgid) self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) return "下载成功" From d799d6c7e5e1684d50602397e191c3d75a2449c0 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sat, 22 Nov 2025 10:34:06 +0800 Subject: [PATCH 17/25] refactor: extract media message building logic to MsgDeco --- efb_wechat_comwechat_slave/ComWechat.py | 53 +++++++------------------ efb_wechat_comwechat_slave/MsgDeco.py | 21 ++++++++++ 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 2b5500e..116f22a 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -31,9 +31,8 @@ from .ChatMgr import ChatMgr from .CustomTypes import EFBGroupChat, EFBPrivateChat, EFBGroupMember, EFBSystemUser -from .MsgDeco import qutoed_text, efb_image_wrapper, efb_file_wrapper, efb_voice_wrapper, efb_video_wrapper, efb_text_simple_wrapper +from .MsgDeco import qutoed_text, rebuild_media_msg from .MsgProcess import MsgProcess, MsgWrapper -from .Utils load_local_file_to_temp, convert_silk_to_mp3 from .Utils import download_file , load_config , load_temp_file_to_local , WC_EMOTICON_CONVERSION from .db import DatabaseManager from .Constant import QUOTE_MESSAGE @@ -607,55 +606,33 @@ def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): # self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) self.file_msg[msg["filepath"]] = ( msg , author , chat ) - def retry_download(self, msgid, msgtype, chatuid): + def retry_download(self, msgid, chatuid, msgtype): path = self.GetMsgCdn(msgid) chat = self.get_chat(chatuid) - efb_msgs = self._build_media_msg(msgtype, path) + efb_msgs = rebuild_media_msg(msgtype, path) if not efb_msgs: - return f"[下载失败]" - efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs + return "[下载失败]" master_message = coordinator.master.get_message_by_id(chat=chat, msg_id=msgid) self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) return "下载成功" def retry_download_target(self, target: Message = None): path = self.GetMsgCdn(target.uid) - if target.type == MsgType.Image: - msgtype = "image" - elif target.type == MsgType.File: - msgtype = "share" - elif target.type == MsgType.Voice: - msgtype = "voice" - elif target.type == MsgType.Video: - msgtype = "video" - else: - msgtype = target.vendor_specific.get("wechat_msgtype", None) - efb_msgs = self._build_media_msg(msgtype, path) - if not efb_msgs: - return - efb_msgs = [efb_msgs] if isinstance(efb_msgs, Message) else efb_msgs - + msgtype = target.vendor_specific.get("wechat_msgtype", None) + if not msgtype: + if target.type == MsgType.Image: + msgtype = "image" + elif target.type == MsgType.File: + msgtype = "share" + elif target.type == MsgType.Voice: + msgtype = "voice" + elif target.type == MsgType.Video: + msgtype = "video" + efb_msgs = rebuild_media_msg(msgtype, path) author = target.author chat = target.chat self.send_efb_msgs(efb_msgs, uid=target.uid, author=author, chat=chat, edit=True, edit_media=True) - def _build_media_msg(self, msgtype, path): - if not path: - return efb_text_simple_wrapper(f"[重试 {msgtype} 失败,请在手机端查看,可通过 /retry 回复本条消息再次重试]") - file = load_local_file_to_temp(path) - filename = os.path.basename(path) - if msgtype == "image": - return efb_image_wrapper(file, filename=filename) - elif msgtype == "share": - return efb_file_wrapper(file, filename=filename) - elif msgtype == "voice": - return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") - elif msgtype == "video": - return efb_video_wrapper(file, filename=filename) - else: - self.logger.warn(f"[unsupported type: {msgtype}]") - return - def process_friend_request(self , v3 , v4): self.logger.debug(f"process_friend_request:{v3} {v4}") res = self.bot.VerifyApply(v3 = v3 , v4 = v4) diff --git a/efb_wechat_comwechat_slave/MsgDeco.py b/efb_wechat_comwechat_slave/MsgDeco.py index b73ca32..1a01375 100644 --- a/efb_wechat_comwechat_slave/MsgDeco.py +++ b/efb_wechat_comwechat_slave/MsgDeco.py @@ -1,5 +1,6 @@ from typing import Mapping, Tuple, List, Union, IO import magic +import os from lxml import etree from functools import partial from traceback import print_exc @@ -12,6 +13,7 @@ from .ChatMgr import ChatMgr from .CustomTypes import EFBGroupChat, EFBPrivateChat +from .Utils import * QUOTE_DIVIDER = " - - - - - - - - - - - - - - - " @@ -78,6 +80,25 @@ def parse_chat_history(xml, level: int = 1) -> list[dict]: res.append(data) return res +def rebuild_media_msg(msgtype, path): + if not path: + return efb_text_simple_wrapper(f"[重试 {msgtype} 失败,请在手机端查看,可通过 /retry 回复本条消息再次重试]") + filename = os.path.basename(path) + if msgtype == "image": + file = wechatimagedecode(filename) + return efb_image_wrapper(file) + elif msgtype == "share": + file = load_local_file_to_temp(path) + return efb_file_wrapper(file, filename=filename) + elif msgtype == "voice": + file = load_local_file_to_temp(path) + return efb_voice_wrapper(convert_silk_to_mp3(file) , file.name + ".ogg") + elif msgtype == "video": + file = load_local_file_to_temp(path) + return efb_video_wrapper(file, filename=filename) + else: + return + def efb_text_simple_wrapper(text: str, ats: Union[Mapping[Tuple[int, int], Union[Chat, ChatMember]], None] = None) -> Message: """ A simple EFB message wrapper for plain text. Emojis are presented as is (plain text). From 516b889ec3ad5c4538bc40f75c7cf5b0ad7bd780 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sat, 22 Nov 2025 10:57:05 +0800 Subject: [PATCH 18/25] feat: raise EFBMessageError instead --- efb_wechat_comwechat_slave/ComWechat.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 116f22a..8711ea1 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -804,8 +804,7 @@ def send_message(self, msg : Message) -> Message: msg.target.text = text self.send_efb_msgs(msg.target, edit=True) else: - text = f"无法转发{msgid},不是有效的微信消息" - self.system_msg({'sender': chat_uid, 'message': text, 'target': msg.target}) + raise EFBMessageError(f"无法转发{msgid},不是有效的微信消息") return msg elif msg.text.startswith('/at'): users_message = msg.text[4::].split(' ', 1) @@ -825,8 +824,7 @@ def send_message(self, msg : Message) -> Message: self.retry_download_target(target=msg.target) return msg else: - message = "回复超时消息时使用" - self.system_msg({'sender':chat_uid, 'message':message}) + raise EFBMessageError("回复超时消息时使用") elif msg.text.startswith('/sendcard'): user_nickname = msg.text[10::].split(' ', 1) if len(user_nickname) == 2: From c0f0e5ad3dcf78ed5aa4dd5c327901453d0eac6e Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Sat, 22 Nov 2025 11:03:53 +0800 Subject: [PATCH 19/25] fix: improve error handling in media retry download --- efb_wechat_comwechat_slave/ComWechat.py | 6 +++++- efb_wechat_comwechat_slave/MsgDeco.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 8711ea1..2b8a038 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -608,16 +608,20 @@ def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): def retry_download(self, msgid, chatuid, msgtype): path = self.GetMsgCdn(msgid) + if not path: + return "[下载失败]" chat = self.get_chat(chatuid) efb_msgs = rebuild_media_msg(msgtype, path) if not efb_msgs: - return "[下载失败]" + return f"[不支持的文件类型: {msgtype}]" master_message = coordinator.master.get_message_by_id(chat=chat, msg_id=msgid) self.send_efb_msgs(efb_msgs, uid=msgid, author=master_message.author, chat=master_message.chat, edit=True, edit_media=True) return "下载成功" def retry_download_target(self, target: Message = None): path = self.GetMsgCdn(target.uid) + if not path: + raise EFBMessageError("[重试失败,请在手机端查看,可通过 /retry 回复本条消息再次重试]") msgtype = target.vendor_specific.get("wechat_msgtype", None) if not msgtype: if target.type == MsgType.Image: diff --git a/efb_wechat_comwechat_slave/MsgDeco.py b/efb_wechat_comwechat_slave/MsgDeco.py index 1a01375..19e4611 100644 --- a/efb_wechat_comwechat_slave/MsgDeco.py +++ b/efb_wechat_comwechat_slave/MsgDeco.py @@ -82,7 +82,7 @@ def parse_chat_history(xml, level: int = 1) -> list[dict]: def rebuild_media_msg(msgtype, path): if not path: - return efb_text_simple_wrapper(f"[重试 {msgtype} 失败,请在手机端查看,可通过 /retry 回复本条消息再次重试]") + return filename = os.path.basename(path) if msgtype == "image": file = wechatimagedecode(filename) From f323420e137c88c7bcefb75c824a23c02be61b59 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 26 Nov 2025 08:49:25 +0800 Subject: [PATCH 20/25] fix: incorrect file path --- efb_wechat_comwechat_slave/MsgDeco.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/MsgDeco.py b/efb_wechat_comwechat_slave/MsgDeco.py index 19e4611..a587d54 100644 --- a/efb_wechat_comwechat_slave/MsgDeco.py +++ b/efb_wechat_comwechat_slave/MsgDeco.py @@ -85,7 +85,7 @@ def rebuild_media_msg(msgtype, path): return filename = os.path.basename(path) if msgtype == "image": - file = wechatimagedecode(filename) + file = wechatimagedecode(path) return efb_image_wrapper(file) elif msgtype == "share": file = load_local_file_to_temp(path) From 8698d0d0cda179aae910e060880dfaa1068e8dfe Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Tue, 2 Dec 2025 15:03:26 +0800 Subject: [PATCH 21/25] fix: msg["filepath"] may not exist when sending file message --- efb_wechat_comwechat_slave/ComWechat.py | 28 ++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 2b8a038..5ed4015 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -598,13 +598,27 @@ def handle_file_msg(self): del self.delete_file[file_path] def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): - # text = f"{msg['type']} is downloading, please wait..." - # efb_msg = Message( - # type=MsgType.Text, - # text=text - # ) - # self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) - self.file_msg[msg["filepath"]] = ( msg , author , chat ) + if not os.path.isfile(msg["filepath"]): + self.logger.warning(f"Wrong message {msg['msgid']} at {msg['filepath']}.") + text = f"download {msg['type']} failed" + efb_msg = Message( + type=MsgType.Text, + text=text, + commands = MessageCommands([ + MessageCommand( + name=("Retry"), + callable_name="retry_download", + kwargs={ + "msgid": msg["msgid"], + "msgtype": msg["type"], + "chatuid": chat.uid, + }, + ) + ]) + ) + self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) + else: + self.file_msg[msg["filepath"]] = ( msg , author , chat ) def retry_download(self, msgid, chatuid, msgtype): path = self.GetMsgCdn(msgid) From 4be21a87132ac4fe13a332386b7fe527614c39d2 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Tue, 2 Dec 2025 16:40:43 +0800 Subject: [PATCH 22/25] fix: remove unnecessary edit flags --- efb_wechat_comwechat_slave/ComWechat.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 5ed4015..4151041 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -578,8 +578,6 @@ def handle_file_msg(self): if flag: m = MsgProcess(msg, chat) - m.edit = True - m.edit_media = True if commands: m.commands = MessageCommands(commands) m.vendor_specific["wechat_msgtype"] = msg_type From ff8a5b58615ff575c5c74de41cccc9f55502f727 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Tue, 2 Dec 2025 17:18:22 +0800 Subject: [PATCH 23/25] fix: file download failure when filepath is directory --- efb_wechat_comwechat_slave/ComWechat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 4151041..c8395f0 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -596,7 +596,7 @@ def handle_file_msg(self): del self.delete_file[file_path] def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): - if not os.path.isfile(msg["filepath"]): + if msg["filepath"] == self.dir: self.logger.warning(f"Wrong message {msg['msgid']} at {msg['filepath']}.") text = f"download {msg['type']} failed" efb_msg = Message( From 6b725610fe66686fd0e1c09a402e4fbc7a1e5b2e Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Tue, 30 Dec 2025 21:35:23 +0800 Subject: [PATCH 24/25] fix(comwechat): use dynamic base path for CDN files Replace hardcoded Windows path with dynamic base path from bot instance to improve portability and fix path resolution for CDN downloads. f --- efb_wechat_comwechat_slave/ComWechat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index c8395f0..3ed0588 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -1015,7 +1015,7 @@ def GetMsgCdn(self, msgid): try: res = self.bot.GetCdn(msgid=msgid) if res["msg"] == 1: - path = res["path"].replace("\\","/").replace("C:/users/user/My Documents/WeChat Files/", self.dir ) + path = res["path"].replace(self.bot.get_base_path() + "\\", self.dir).replace("\\","/") count = 1 while True: if os.path.exists(path): From bc4b587ee3fb7490ee82abb2eb6408f90e5ec6c3 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Wed, 31 Dec 2025 18:59:05 +0800 Subject: [PATCH 25/25] feat: add download process as placeholder for media edits --- efb_wechat_comwechat_slave/ComWechat.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 3ed0588..6a794ca 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -578,6 +578,8 @@ def handle_file_msg(self): if flag: m = MsgProcess(msg, chat) + m.edit = True + m.edit_media = True if commands: m.commands = MessageCommands(commands) m.vendor_specific["wechat_msgtype"] = msg_type @@ -616,6 +618,13 @@ def _send_file_msg(self, msg: Message, author: ChatMember, chat: Chat): ) self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) else: + msg_type = msg['type'] + text = f"{msg_type} is downloading, please wait..." + efb_msg = Message( + type=MsgType.Text, + text=text + ) + self.send_efb_msgs(efb_msg, author=author, chat=chat, uid=MessageID(str(msg['msgid']))) self.file_msg[msg["filepath"]] = ( msg , author , chat ) def retry_download(self, msgid, chatuid, msgtype):