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}") # ---------- 退群:清理 ----------