fix: prefer newest OTP messages
This commit is contained in:
@@ -5,7 +5,9 @@ MailProvider 抽象层
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import itertools
|
||||
import email.utils
|
||||
import logging
|
||||
import random
|
||||
import re
|
||||
@@ -113,6 +115,34 @@ def _extract_code(content: str) -> Optional[str]:
|
||||
return None
|
||||
|
||||
|
||||
def _message_timestamp(msg: Dict[str, Any]) -> float:
|
||||
candidates = [
|
||||
msg.get("createdAt"),
|
||||
msg.get("created_at"),
|
||||
msg.get("receivedAt"),
|
||||
msg.get("received_at"),
|
||||
msg.get("updatedAt"),
|
||||
msg.get("updated_at"),
|
||||
msg.get("date"),
|
||||
]
|
||||
for raw in candidates:
|
||||
text = str(raw or "").strip()
|
||||
if not text:
|
||||
continue
|
||||
try:
|
||||
normalized = text.replace("Z", "+00:00")
|
||||
return datetime.datetime.fromisoformat(normalized).timestamp()
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
parsed = email.utils.parsedate_to_datetime(text)
|
||||
if parsed is not None:
|
||||
return parsed.timestamp()
|
||||
except Exception:
|
||||
pass
|
||||
return 0.0
|
||||
|
||||
|
||||
# ==================== 抽象基类 ====================
|
||||
|
||||
class MailProvider(ABC):
|
||||
@@ -254,6 +284,8 @@ class MailTmProvider(MailProvider):
|
||||
messages = data if isinstance(data, list) else (
|
||||
data.get("hydra:member") or data.get("messages") or []
|
||||
)
|
||||
if isinstance(messages, list):
|
||||
messages = sorted(messages, key=_message_timestamp, reverse=True)
|
||||
|
||||
for msg in messages:
|
||||
if not isinstance(msg, dict):
|
||||
@@ -497,6 +529,8 @@ class DuckMailProvider(MailProvider):
|
||||
if resp.status_code == 200:
|
||||
data = resp.json()
|
||||
messages = data.get("hydra:member") or data.get("member") or data.get("data") or []
|
||||
if isinstance(messages, list):
|
||||
messages = sorted(messages, key=_message_timestamp, reverse=True)
|
||||
for msg in (messages if isinstance(messages, list) else []):
|
||||
if not isinstance(msg, dict):
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user