为什么要把数据类转换成字典对象,主要是为了开发中快速生成调用接口所需的 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
 
dotterel-summer
最后修改:2020 年 10 月 26 日
如果觉得我的文章对你有用,请随意赞赏