Files

71 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Pure helpers for classifying and presenting collection skip reasons."""
from __future__ import annotations
ALIAS_UNMATCHED = "alias_unmatched"
LOGIN_REQUIRED = "login_required"
OTHER = "other"
SKIP_REASON_ORDER = (ALIAS_UNMATCHED, LOGIN_REQUIRED, OTHER)
SKIP_REASON_LABELS = {
ALIAS_UNMATCHED: "别名未匹配",
LOGIN_REQUIRED: "账号未登录",
OTHER: "其他原因",
}
def empty_skip_reason_counts():
return {reason: 0 for reason in SKIP_REASON_ORDER}
def classify_skip_reason(reason="", *, alias_matched=True):
"""Classify historical skip text without treating uncertain login checks as logout."""
if not alias_matched:
return ALIAS_UNMATCHED
text = str(reason or "").strip().lower()
if "别名未匹配" in text or "alias_unmatched" in text:
return ALIAS_UNMATCHED
if (
"账号未登录" in text
or "采集中途掉登录" in text
or "login_page" in text
or ("accounts.shopee." in text and "/seller/login" in text)
):
return LOGIN_REQUIRED
return OTHER
def skipped_stage_text(reason="", *, alias_matched=True):
reason_code = classify_skip_reason(reason, alias_matched=alias_matched)
return f"略过 · {SKIP_REASON_LABELS[reason_code]}"
def normalize_skip_reason_counts(counts=None, *, skipped_total=0):
normalized = empty_skip_reason_counts()
source = counts if isinstance(counts, dict) else {}
for reason in SKIP_REASON_ORDER:
try:
normalized[reason] = max(0, int(source.get(reason, 0) or 0))
except (TypeError, ValueError):
normalized[reason] = 0
total = max(0, int(skipped_total or 0))
accounted = sum(normalized.values())
if accounted < total:
normalized[OTHER] += total - accounted
return normalized
def format_skip_reason_summary(counts=None, *, skipped_total=0):
total = max(0, int(skipped_total or 0))
if total == 0:
return ""
normalized = normalize_skip_reason_counts(counts, skipped_total=total)
parts = [
f"{SKIP_REASON_LABELS[reason]}{normalized[reason]}"
for reason in SKIP_REASON_ORDER
if normalized[reason] > 0
]
return f"略过{total}:" + ",".join(parts)