交互处理全分支观测日志;点击者标识兜底 user_openid

This commit is contained in:
snowy-yang committed 2026-10-05 19:40:19 +08:00
1 parent 3fed0b0db1
commit 37e44a512d
1 file changed
+21 -7
+21 -7
View File
@@ -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}")
# ---------- 退群:清理 ----------