为什么要把数据类转换成字典对象,主要是为了开发中快速生成调用接口所需的 Payload 或者说 Query String.
直接上代码示例:
# -*- coding: utf-8 -*-
from base64 import b64encode
from dataclasses import dataclass
from hashlib import md5
from random import choice, uniform
from time import time
from urllib.parse import urlencode
@dataclass
class Payload:
# 定义一个空数据类对象,用于移除非必要的属性及方法字段
@dataclass
class empty:
pass
_excluded_keys = empty.__dict__.keys()
def __init__(self):
""" 初始化 Request Params 的 Init 函数 """
self.clientId = str(uniform(0, 1))[2:10]
self.crt = int(time() * 1000)
self.night = 0
self.channel = choice(["hupuudapte", "store_tengxun_wzl2"])
self.sign = md5(str(time()).encode("utf-8")).hexdigest()
self._ssid = b64encode("<unknown ssid>".encode("utf-8")).decode("utf-8")
self._imei = md5(str(time() * 1000).encode("utf-8")).hexdigest()[8:24]
self.time_zone = "Asia/Shanghai"
self.bddid = str(uniform(0, 1))[2:13]
self.client = self._imei
self.android_id = self._imei
self.cid = self.clientId
def __iter__(self):
""" 返回类自身属性的迭代器的方法 """
return iter((key, value) for (key, value) in self.__dict__.items() if key not in self._excluded_keys)
@classmethod
def getQS(cls, params: dict):
""" 用于生成带 sign 验签的 Url Query String 的方法 """
dics, salt = dict(cls()), "HUPU_SALT_XXXXXXXXXXXXXXXXXXXXXX" # 初始化基础字典和 SALT
dics.update(params) # 合并参数字典
if "sign" in dics: # 尝试移除非法的 sign 键
dics.pop("sign")
qs_origin = urlencode(dict(sorted(dics.items()))) + salt # 生成初始 Url Query String
dics.update({"sign": md5(qs_origin.encode("utf-8")).hexdigest()}) # 更新验签 sign 的键值
return urlencode(dics) # 返回最终的 Url Query String