wsgsig是由sig通过自定义base64_map的编码得到,sig是通过url提交的参数和一个固定字符MD5得到,不啰嗦直接放代码:
import hashlib
import time
from urllib.parse import urlparse, unquote
import execjs
def get_sig(url):
query = get_query(url)
query_dict = query_string_to_map(query)
map_string = sign_map_to_string(query_dict)
return str(len(map_string)) + "&sig=" + encrypt_to_md5("R4doMFFeMNlliIWM" + map_string)
def get_query(url):
parsed_url = urlparse(url)
return parsed_url.query
def query_string_to_map(query_str):
query_dict = {}
try:
for param in query_str.split('&'):
if param:
key, value = map(unquote, param.split('=', 1))
query_dict[key + value] = ''
except Exception as e:
print(e)
return query_dict
def sign_map_to_string(query_dict):
try:
sorted_params = sorted(query_dict.keys(), reverse=True)
result = ''
for param in sorted_params:
if not param.startswith("__x_") and param.lower() != "wsgsig":
result += param
result += query_dict[param]
return result
except Exception as e:
print(e)
def encrypt_to_md5(data):
return hashlib.md5(data.encode()).hexdigest()
def get_wsgsig(content):
js = """function i(t) {
for (var e = "ABCDEFG0123456789abcdefgHIJKLMN+/hijklmnOPQRSTopqrstUVWXYZuvwxyz", n = "" + t, i = void 0, r = void 0, o = 0, a = ""; n.charAt(0 | o) || (e = "=",
o % 1); a += e.charAt(63 & i >> 8 - o % 1 * 8)) {
if ((r = n.charCodeAt(o += .75)) > 255)
throw new Error("'base64' failed: The string to be encoded contains characters outside of the Latin1 range.");
i = i << 8 | r
}
return a
}
function r(t, e) {
for (var n = [], i = 0; i < e.length; i++)
n[i] = t[i % 4] ^ e.charCodeAt(i);
return n = Array.prototype.slice.apply(t).concat(n),
String.fromCharCode.apply(null, n)
};
function getWsgsig(T){
return encodeURIComponent("dd03-" + i(r(new Uint8Array(new Uint32Array([Math.floor(4294967296 * Math.random())]).buffer), T)).replace(/=*$/, ""));
};"""
ctx = execjs.compile(js)
result = ctx.call("getWsgsig", content)
return result
if __name__ == "__main__":
timestamp = str(int(time.time()))
url = "https://dorado.xiaojukeji.com/usce-api/carlib/getAllSeriesByBrand?nginx_cors=false&_t=" + timestamp + "&city_id=1&usce_channel=24448&usce_sub_channel=127395&grade_type_id=7&is_hxz=0&brand_id=1115&cityid=1&cityId=1&city-id=1"
sig = get_sig(url)
content = "ts=" + timestamp + "&v=1&os=web&av=02&kv=0000010001&vl=" + sig
wsgsig = get_wsgsig(content)
print(wsgsig)
print(url + "&wsgsig=" + wsgsig)