From 37e44a512d768a9bf401c71c2d80d5d04df64705 Mon Sep 17 00:00:00 2001 From: snowy-yang <102860110+snowy-yang@users.noreply.github.com> Date: Mon, 5 Oct 2026 19:40:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=A4=84=E7=90=86=E5=85=A8?= =?UTF-8?q?=E5=88=86=E6=94=AF=E8=A7=82=E6=B5=8B=E6=97=A5=E5=BF=97=EF=BC=9B?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E8=80=85=E6=A0=87=E8=AF=86=E5=85=9C=E5=BA=95?= =?UTF-8?q?=20user=5Fopenid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- authbot/handlers.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/authbot/handlers.py b/authbot/handlers.py index eb8d1a7..2522d57 100644 --- a/authbot/handlers.py +++ b/authbot/handlers.py @@ -342,13 +342,24 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState: except ApiError as e: logger.debug(f"回应互动失败(可能为重复推送): {e}") - if inter.chat_type != 1 or not inter.group_openid or not inter.group_member_openid: + # 个别事件可能缺 group_member_openid 而只有 user_openid,先记日志再兜底 + clicker = inter.group_member_openid or inter.user_openid + logger.info( + f"按钮点击: chat_type={inter.chat_type} " + f"点击者=…{(clicker or '?')[-6:]} data={inter.button_data[:32]!r}" + ) + if inter.chat_type != 1 or not inter.group_openid or not clicker: + logger.warning( + f"忽略非常规互动: chat_type={inter.chat_type}, " + f"group={inter.group_openid}, clicker={clicker}" + ) return parsed = captcha.parse_button_data(inter.button_data) if parsed is None: + logger.warning(f"按钮数据无法解析,已忽略: {inter.button_data!r}") return token, value = parsed - key = pending_key(inter.group_openid, inter.group_member_openid) + key = pending_key(inter.group_openid, clicker) record = state.get(key) owner = state.get_by_token(token) @@ -357,36 +368,39 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState: # 点的是别人的当前题:无论点击者自己什么身份,计入乱点处罚 if owner is not None and not is_subject: await _handle_foreign_click( - api, cfg, foreign_clicks, inter.group_openid, inter.group_member_openid, + api, cfg, foreign_clicks, inter.group_openid, clicker, event_id=event.event_id, ) return if record is None: if state.is_verified_recently(key, cfg.verified_trust_days): + logger.info(f"已通过成员点击旧按钮,礼貌回复 (…{clicker[-6:]})") await _reply_text(api, inter.group_openid, "你已经通过验证啦,不用再答题~", event_id=event.event_id) else: # 旧题/已失效按钮,礼貌忽略不计处罚 + logger.info(f"点击已失效按钮,礼貌回复 (…{clicker[-6:]})") await _reply_text(api, inter.group_openid, "这道题不是给你的~", event_id=event.event_id, - mention=inter.group_member_openid) + mention=clicker) return if not is_subject: + logger.info(f"被试者点击自己的旧题,提示换题 (…{clicker[-6:]})") await _reply_text(api, inter.group_openid, "这题已经被换掉啦,请回答最新一题", event_id=event.event_id) return if value == record.answer: try: - await set_member_mute(api, inter.group_openid, inter.group_member_openid, None) + await set_member_mute(api, inter.group_openid, clicker, None) except ApiError as e: logger.warning(f"解除禁言失败(已通过验证,请手动解禁): {e}") state.pop(key) state.mark_verified(key) await _reply_text(api, inter.group_openid, "验证通过,已解除禁言,欢迎加入本群!", event_id=event.event_id) - logger.info(f"成员 …{inter.group_member_openid[-6:]} 验证通过") + logger.info(f"成员 …{clicker[-6:]} 验证通过") else: cap = captcha.generate(cfg.captcha_options) # 换题但保留原截止时间:限时自进群起算 @@ -402,7 +416,7 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState: await _reply_captcha(api, inter.group_openid, captcha.retry_markdown(cap), cap.keyboard(), event_id=event.event_id or "") except ApiError as e: - logger.warning(f"换题发送失败 (…{inter.group_member_openid[-6:]}): {e}") + logger.warning(f"换题发送失败 (…{clicker[-6:]}): {e}") # ---------- 退群:清理 ----------