You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.6 KiB
49 lines
1.6 KiB
from functools import reduce
|
|
from hashlib import md5
|
|
import urllib.parse
|
|
import time
|
|
|
|
mixinKeyEncTab = [
|
|
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
|
|
33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
|
|
61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,
|
|
36, 20, 34, 44, 52
|
|
]
|
|
|
|
def getMixinKey(orig: str):
|
|
'对 imgKey 和 subKey 进行字符顺序打乱编码'
|
|
return reduce(lambda s, i: s + orig[i], mixinKeyEncTab, '')[:32]
|
|
|
|
def encWbi(params: dict, img_key: str, sub_key: str):
|
|
'为请求参数进行 wbi 签名'
|
|
mixin_key = getMixinKey(img_key + sub_key)
|
|
curr_time = 1702204169 # Fixed time for testing
|
|
params['wts'] = curr_time # 添加 wts 字段
|
|
params = dict(sorted(params.items())) # 按照 key 重排参数
|
|
# 过滤 value 中的 "!'()*" 字符
|
|
params = {
|
|
k : ''.join(filter(lambda chr: chr not in "!'()*", str(v)))
|
|
for k, v
|
|
in params.items()
|
|
}
|
|
query = urllib.parse.urlencode(params) # 序列化参数
|
|
print(f"Query: {query}")
|
|
print(f"Mixin Key: {mixin_key}")
|
|
wbi_sign = md5((query + mixin_key).encode()).hexdigest() # 计算 w_rid
|
|
params['w_rid'] = wbi_sign
|
|
return params
|
|
|
|
img_key = '7cd084941338484aae1ad9425b84077c'
|
|
sub_key = '4932caff0ff746eab6f01bf08b70ac45'
|
|
|
|
signed_params = encWbi(
|
|
params={
|
|
'foo': '114',
|
|
'bar': '514',
|
|
'baz': 1919810
|
|
},
|
|
img_key=img_key,
|
|
sub_key=sub_key
|
|
)
|
|
print(f"Result: {signed_params['w_rid']}")
|