# -*- coding: utf-8 -*- # Author : Charley # Python : 3.8.10 # Date : 2025/4/15 10:29 import hashlib import json import random import time def return_new_url(url_): # 去掉查询参数部分(? 后面的内容) path_without_query = url_.split("?")[0] # 按 "/" 分割路径 path_parts = path_without_query.split("/") # 返回最后一部分 return path_parts[-1] def generate_random_string(): # 使用 random.random() 生成随机数并转换为 36 进制字符串,截取最后 10 个字符 part1 = ''.join(random.choices('0123456789abcdefghijklmnopqrstuvwxyz', k=10)) part2 = ''.join(random.choices('0123456789abcdefghijklmnopqrstuvwxyz', k=10)) return part1 + part2 # def sort_asc(t: dict): """ 定义一个函数 sort_asc,用于对字典 t 的键进行排序,并返回一个新的字典 o :param t: dict :return: sorted_dict """ # 按字母顺序对字典的键进行排序 sorted_keys = sorted(t.keys()) # print('排序后的参数为:', sorted_keys) # 创建一个新的有序字典 sorted_dict = {key: str(t[key]) for key in sorted_keys} return sorted_dict def get_sign(url_: str): """ 定义 get_sign 函数,用于生成 MD5 签名 :param url_: url :return: nonce, timestamp, md5_hash """ url_p = return_new_url(url_) # 生成随机字符串 n 和时间戳 a n = generate_random_string() # print('nonce的值为:', n) a = str(int(time.time() * 1000)) # 当前时间戳(毫秒) # f = { # 'timestamp': "1744693310566", # 时间戳 # 'nonce': "x0hs3t1hwyvsd5foi7dn", # 随机字符串 # 'salt': "1s2JTL0F9u8^=m6-dW]6yLU1T50ppr8m", # 固定盐值 # 'url': "getCardCollageInfoByIdByShare" # 路由标识 # } f = { 'timestamp': a, # 时间戳 'nonce': n, # 随机字符串 'salt': "1s2JTL0F9u8^=m6-dW]6yLU1T50ppr8m", # 固定盐值 'url': url_p # 路由标识 } # 对输入字典进行浅拷贝并排序 sorted_data = sort_asc(f) # print('排序后的参数为:', sorted_data) # 将排序后的字典转换为 JSON 字符串 json_string = json.dumps(sorted_data, separators=(',', ':')) # print('加密前的参数为:', json_string) # 使用 hashlib 创建 MD5 哈希 md5_hash = hashlib.md5(json_string.encode('utf-8')).hexdigest() return n, a, md5_hash # 主程序 if __name__ == "__main__": url = "https://app.cardplayd.com/app/system/shop/queryShopList" sign = get_sign(url) print('加密后的 sign 为:', sign) # 2b3865f7fc38e94ed0b9f673c3a6a104 # "x0hs3t1hwyvsd5foi7dn" "6531a8d9fb78f5d3969b853cf31fbcd9"