diff --git a/core/douyu/email_verifier.py b/core/douyu/email_verifier.py index 7b75295..e7fd5e8 100644 --- a/core/douyu/email_verifier.py +++ b/core/douyu/email_verifier.py @@ -144,25 +144,53 @@ class EmailVerifier: 检查邮件时间是否晚于验证码发送时间。 HTTP 接口返回的 HTML 中包含 "发信时间: Tue, 23 Jun 2026 01:06:09 +0800" + 但可能被 HTML 标签包裹,如 " Tue, 23 Jun 2026 01:06:09 +0800" """ - # 提取发信时间 from email.utils import parsedate_to_datetime - time_match = re.search(r'发信时间:\s*(.+?)[\r\n<]', content) + + # 先清理 HTML 标签,再提取时间 + clean = re.sub(r'<[^>]+>', ' ', content) + clean = re.sub(r'\s+', ' ', clean) + + # 匹配 RFC2822 格式时间:Day, DD Mon YYYY HH:MM:SS ±HHMM + time_match = re.search( + r'发信时间[::]?\s*' + r'((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s*\d{1,2}\s+' + r'(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+' + r'\d{4}\s+\d{2}:\d{2}:\d{2}\s*[+-]\d{4})', + clean, + ) if not time_match: - # 找不到时间,保守认为足够新 - logger.debug("邮件中未找到发信时间,保守纳入候选") - return True + # 也尝试匹配不带星期的时间格式:2026-06-23 01:31:38 + time_match2 = re.search( + r'发信时间[::]?\s*(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})', + clean, + ) + if time_match2: + time_str = time_match2.group(1).strip() + try: + from datetime import datetime + msg_time = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S') + if msg_time.timestamp() < after_timestamp - allow_old_seconds: + logger.debug(f"邮件时间 {time_str} 早于发送时间,跳过旧邮件") + return False + return True + except ValueError: + pass + # 找不到时间且无法解析,保守拒绝(避免使用旧验证码) + logger.debug("邮件中未找到可解析的发信时间,保守拒绝") + return False time_str = time_match.group(1).strip() try: - from datetime import datetime msg_time = parsedate_to_datetime(time_str) if msg_time and msg_time.timestamp() < after_timestamp - allow_old_seconds: + logger.debug(f"邮件时间 {time_str} 早于发送时间,跳过旧邮件") return False return True except (TypeError, ValueError): - logger.debug(f"无法解析邮件时间: {time_str},保守纳入候选") - return True + logger.debug(f"无法解析邮件时间: {time_str},保守拒绝") + return False def _extract_verification_code(self, text: str) -> Optional[str]: """从文本中提取6位验证码"""