50 lines
1.1 KiB
Python
50 lines
1.1 KiB
Python
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()}')
|