From bc18dcdb03255c9fdebae5420abd7c9d0c0f8e60 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 28 Nov 2025 19:24:20 +0800 Subject: [PATCH 1/4] fix: refactor login confirmation logic and improve session handling --- efb_wechat_comwechat_slave/ComWechat.py | 27 +++++++++++-------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index bd36687..e2810bb 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -141,6 +141,12 @@ def on_friend_msg(msg : Dict): if msg["type"] == "eventnotify": return + if self.wxid is None and sender == "weixin" and msg["wxid"] == "weixin" and msg["message"]: + xml = etree.fromstring(msg["message"]) + if xml.xpath('string(/sysmsg/@type)') == "SafeModuleCfg": + self.confirm_login() + return + name = self.get_name_by_wxid(sender) chat = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( @@ -404,23 +410,13 @@ def login_prompt(self): ) if not file: - is_login = self.is_login() - if is_login: - msg.text = "登录成功" - else: - msg.text = "登录失败,未知错误,请使用 /extra 重新尝试登录" + self.confirm_login() else: - msg.commands = MessageCommands([ - MessageCommand( - name=("Confirm"), - callable_name="confirm_login", - ), - ]) msg.type = MsgType.Image msg.path = Path(file.name) msg.file = file msg.mime = 'image/png' - self.send_efb_msgs(msg, chat=chat, author=author) + self.send_efb_msgs(msg, chat=chat, author=author) def confirm_login(self): chat = self.user_auth_chat @@ -435,7 +431,7 @@ def confirm_login(self): self.GetGroupListBySql() msg.text = "登录成功" else: - msg.text = "登录失败,请使用重新登录" + msg.text = "登录失败,请重新登录" self.send_efb_msgs(msg, chat=chat, author=author) @efb_utils.extra(name="Get QR Code", @@ -617,6 +613,7 @@ def scheduled_job(self): self.GetContactListBySql() if count % 1800 == 3: if getattr(coordinator, 'master', None) is not None and not self.is_login(): + self.wxid = None self.system_msg(content) #获取全部联系人 @@ -649,8 +646,8 @@ def send_message(self, msg : Message) -> Message: self.GetGroupListBySql() else: content = { - "name": self.channel_name, - "sender": self.channel_name, + "name": self.user_auth_chat.name, + "sender": self.user_auth_chat.uid, "message": "尚未登录,请发送 /extra 扫码登录" } self.system_msg(content) From c490e2672cfb8377631bebdb3526156eec8dd6a1 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 28 Nov 2025 19:42:08 +0800 Subject: [PATCH 2/4] refactor: extract login initialization into after_login method --- efb_wechat_comwechat_slave/ComWechat.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index e2810bb..4459732 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -99,7 +99,6 @@ def __init__(self, instance_id: InstanceID = None): def update_contacts_wrapper(func): def wrapper(*args, **kwargs): if not self.friends and not self.groups: - self.get_me() self.GetContactListBySql() self.GetGroupListBySql() return func(*args, **kwargs) @@ -426,14 +425,17 @@ def confirm_login(self): uid=MessageID(str(int(time.time()))), ) if self.is_login(): - self.get_me() - self.GetContactListBySql() - self.GetGroupListBySql() + self.after_login() msg.text = "登录成功" else: msg.text = "登录失败,请重新登录" self.send_efb_msgs(msg, chat=chat, author=author) + def after_login(self): + self.get_me() + self.GetContactListBySql() + self.GetGroupListBySql() + @efb_utils.extra(name="Get QR Code", desc="重新扫码登录") def reauth(self, _: str = "") -> str: @@ -641,9 +643,7 @@ def send_message(self, msg : Message) -> Message: if self.wxid is None: if self.is_login(): - self.get_me() - self.GetContactListBySql() - self.GetGroupListBySql() + self.after_login() else: content = { "name": self.user_auth_chat.name, From d54f6a89eab149c1e1f4769ffcd3fad98b448304 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Fri, 28 Nov 2025 20:20:55 +0800 Subject: [PATCH 3/4] fix: confirm login before any messages --- efb_wechat_comwechat_slave/ComWechat.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 4459732..71e796f 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -97,11 +97,12 @@ def __init__(self, instance_id: InstanceID = None): )) def update_contacts_wrapper(func): - def wrapper(*args, **kwargs): - if not self.friends and not self.groups: - self.GetContactListBySql() - self.GetGroupListBySql() - return func(*args, **kwargs) + def wrapper(msg): + if self.wxid is None: + if self.confirm_login(): + return func(msg) + else: + return func(msg) return wrapper @self.bot.on("self_msg") @@ -140,12 +141,6 @@ def on_friend_msg(msg : Dict): if msg["type"] == "eventnotify": return - if self.wxid is None and sender == "weixin" and msg["wxid"] == "weixin" and msg["message"]: - xml = etree.fromstring(msg["message"]) - if xml.xpath('string(/sysmsg/@type)') == "SafeModuleCfg": - self.confirm_login() - return - name = self.get_name_by_wxid(sender) chat = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( From b4b5d7809b42eb6326c718c399cc7d63dd53f587 Mon Sep 17 00:00:00 2001 From: jiz4oh Date: Mon, 8 Dec 2025 15:23:53 +0800 Subject: [PATCH 4/4] refactor: simplify login flow and remove unused qr code fields --- efb_wechat_comwechat_slave/ComWechat.py | 46 ++++++++++++------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/efb_wechat_comwechat_slave/ComWechat.py b/efb_wechat_comwechat_slave/ComWechat.py index 71e796f..69146dc 100644 --- a/efb_wechat_comwechat_slave/ComWechat.py +++ b/efb_wechat_comwechat_slave/ComWechat.py @@ -81,9 +81,6 @@ def __init__(self, instance_id: InstanceID = None): self.db: DatabaseManager = DatabaseManager(self) self.bot = WeChatRobot() - self.qr_file = None - - self.qrcode_timeout = self.config.get("qrcode_timeout", 10) self.wxid = None self.base_path = self.config["base_path"] if "base_path" in self.config else self.bot.get_base_path() self.load() @@ -389,29 +386,11 @@ def save_qr_code(qr_code): tmp_file.write(qr_code) tmp_file.flush() except: - print("[red]获取二维码失败[/red]", flush=True) + print("[red]获取二维码失败[/red]") tmp_file.close() return None return tmp_file - def login_prompt(self): - file = self.get_qrcode() - chat = self.user_auth_chat - author = self.user_auth_chat.other - msg = Message( - type=MsgType.Text, - uid=MessageID(str(int(time.time()))), - ) - - if not file: - self.confirm_login() - else: - msg.type = MsgType.Image - msg.path = Path(file.name) - msg.file = file - msg.mime = 'image/png' - self.send_efb_msgs(msg, chat=chat, author=author) - def confirm_login(self): chat = self.user_auth_chat author = self.user_auth_chat.other @@ -434,8 +413,27 @@ def after_login(self): @efb_utils.extra(name="Get QR Code", desc="重新扫码登录") def reauth(self, _: str = "") -> str: - self.login_prompt() - return "扫码成功之后,请点击 confirm 进行下一步" + file = self.get_qrcode() + chat = self.user_auth_chat + author = self.user_auth_chat.other + msg = Message( + type=MsgType.Text, + uid=MessageID(str(int(time.time()))), + ) + + if not file: + if self.is_login(): + self.after_login() + return "登录成功" + else: + return "获取二维码失败,请稍后再试" + else: + msg.type = MsgType.Image + msg.path = Path(file.name) + msg.file = file + msg.mime = 'image/png' + self.send_efb_msgs(msg, chat=chat, author=author) + return "请扫描二维码登录" @efb_utils.extra(name="Force Logout", desc="强制退出")