交互处理全分支观测日志;点击者标识兜底 user_openid
This commit is contained in:
1 parent
3fed0b0db1
commit
37e44a512d
1 file changed
+21
-7
+21
-7
@@ -342,13 +342,24 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState:
|
|||||||
except ApiError as e:
|
except ApiError as e:
|
||||||
logger.debug(f"回应互动失败(可能为重复推送): {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
|
return
|
||||||
parsed = captcha.parse_button_data(inter.button_data)
|
parsed = captcha.parse_button_data(inter.button_data)
|
||||||
if parsed is None:
|
if parsed is None:
|
||||||
|
logger.warning(f"按钮数据无法解析,已忽略: {inter.button_data!r}")
|
||||||
return
|
return
|
||||||
token, value = parsed
|
token, value = parsed
|
||||||
key = pending_key(inter.group_openid, inter.group_member_openid)
|
key = pending_key(inter.group_openid, clicker)
|
||||||
|
|
||||||
record = state.get(key)
|
record = state.get(key)
|
||||||
owner = state.get_by_token(token)
|
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:
|
if owner is not None and not is_subject:
|
||||||
await _handle_foreign_click(
|
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,
|
event_id=event.event_id,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if record is None:
|
if record is None:
|
||||||
if state.is_verified_recently(key, cfg.verified_trust_days):
|
if state.is_verified_recently(key, cfg.verified_trust_days):
|
||||||
|
logger.info(f"已通过成员点击旧按钮,礼貌回复 (…{clicker[-6:]})")
|
||||||
await _reply_text(api, inter.group_openid, "你已经通过验证啦,不用再答题~",
|
await _reply_text(api, inter.group_openid, "你已经通过验证啦,不用再答题~",
|
||||||
event_id=event.event_id)
|
event_id=event.event_id)
|
||||||
else:
|
else:
|
||||||
# 旧题/已失效按钮,礼貌忽略不计处罚
|
# 旧题/已失效按钮,礼貌忽略不计处罚
|
||||||
|
logger.info(f"点击已失效按钮,礼貌回复 (…{clicker[-6:]})")
|
||||||
await _reply_text(api, inter.group_openid, "这道题不是给你的~",
|
await _reply_text(api, inter.group_openid, "这道题不是给你的~",
|
||||||
event_id=event.event_id,
|
event_id=event.event_id,
|
||||||
mention=inter.group_member_openid)
|
mention=clicker)
|
||||||
return
|
return
|
||||||
if not is_subject:
|
if not is_subject:
|
||||||
|
logger.info(f"被试者点击自己的旧题,提示换题 (…{clicker[-6:]})")
|
||||||
await _reply_text(api, inter.group_openid, "这题已经被换掉啦,请回答最新一题",
|
await _reply_text(api, inter.group_openid, "这题已经被换掉啦,请回答最新一题",
|
||||||
event_id=event.event_id)
|
event_id=event.event_id)
|
||||||
return
|
return
|
||||||
|
|
||||||
if value == record.answer:
|
if value == record.answer:
|
||||||
try:
|
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:
|
except ApiError as e:
|
||||||
logger.warning(f"解除禁言失败(已通过验证,请手动解禁): {e}")
|
logger.warning(f"解除禁言失败(已通过验证,请手动解禁): {e}")
|
||||||
state.pop(key)
|
state.pop(key)
|
||||||
state.mark_verified(key)
|
state.mark_verified(key)
|
||||||
await _reply_text(api, inter.group_openid, "验证通过,已解除禁言,欢迎加入本群!",
|
await _reply_text(api, inter.group_openid, "验证通过,已解除禁言,欢迎加入本群!",
|
||||||
event_id=event.event_id)
|
event_id=event.event_id)
|
||||||
logger.info(f"成员 …{inter.group_member_openid[-6:]} 验证通过")
|
logger.info(f"成员 …{clicker[-6:]} 验证通过")
|
||||||
else:
|
else:
|
||||||
cap = captcha.generate(cfg.captcha_options)
|
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),
|
await _reply_captcha(api, inter.group_openid, captcha.retry_markdown(cap),
|
||||||
cap.keyboard(), event_id=event.event_id or "")
|
cap.keyboard(), event_id=event.event_id or "")
|
||||||
except ApiError as e:
|
except ApiError as e:
|
||||||
logger.warning(f"换题发送失败 (…{inter.group_member_openid[-6:]}): {e}")
|
logger.warning(f"换题发送失败 (…{clicker[-6:]}): {e}")
|
||||||
|
|
||||||
# ---------- 退群:清理 ----------
|
# ---------- 退群:清理 ----------
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user