import hashlib from pydantic import Field from pydantic import BaseModel, validator from settings import settings from ipaddress import IPv4Address FIELD_MAP = { 'ip': 'a01', 'os': 'a08', } def to_alias(k: str) -> str: return FIELD_MAP.get(k) or k class IP4(str): @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): IPv4Address(v) return str(v) class Base(BaseModel): # sign = md5(distinct_id+account_id+act+ts+salt) distinct_id: str = Field(..., title='访客 ID') game: str account_id: str act: str event_name: str = None # preset: dict properties: dict ts: int sign: str @validator('sign') def sign_validator(cls, v: str, values: dict): s = f'{values.get("distinct_id")}{values.get("account_id", "")}{values.get("act", "")}{values.get("ts", "")}{settings.SALT}' if hashlib.md5(s.encode()).hexdigest() == v: return v raise ValueError(f'打击违法犯罪行为{hashlib.md5(s.encode()).hexdigest()}')