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.
114 lines
2.4 KiB
114 lines
2.4 KiB
from hashlib import md5, sha1, sha384
|
|
import math, random, time,requests
|
|
|
|
def MD5(s):
|
|
m = md5()
|
|
m.update(str.encode(s, encoding="utf-8"))
|
|
return m.hexdigest()
|
|
|
|
def SHA1(s):
|
|
sha = sha1()
|
|
sha.update(str.encode(s, encoding="utf-8"))
|
|
return sha.hexdigest()
|
|
|
|
|
|
def SHA384(s):
|
|
sha = sha384()
|
|
sha.update(str.encode(s, encoding="utf-8"))
|
|
return sha.hexdigest()
|
|
|
|
|
|
def I(nonce="03423d9c06bd4bbb45b5fb9059a9ed4f"):
|
|
return MD5(nonce)
|
|
|
|
|
|
def j(timeStamp):
|
|
return SHA1(timeStamp)
|
|
|
|
|
|
def P(nonce, client_id):
|
|
return MD5(nonce + client_id)
|
|
|
|
|
|
def S(time):
|
|
s = "EOi^0N5sWWHhkrF2A0gekY9U20BgnAcr"
|
|
res = SHA1(s + str(time))
|
|
return res[len(res)-16:len(res) - 1]
|
|
|
|
def o(e, f):
|
|
b = e
|
|
t = f
|
|
n = ""
|
|
r1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
while b:
|
|
o = b % 36
|
|
l = b / 36
|
|
n = r1[o] + n
|
|
b = round(math.floor(l))
|
|
return ("0000000000000000" + n)[-t:]
|
|
|
|
|
|
def get_trace_id(e):
|
|
return o(e, 9) + o(random.randint(0, 78364164095), 7)
|
|
|
|
|
|
def get_uuid(t):
|
|
e = int(time.time() * 1000)
|
|
# e = 1700013194061
|
|
template = "xxxxxxxxxxxxxyxxxxyxxxxxxxxxxxxx" if t else "xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxx"
|
|
uuid = ""
|
|
i = -1
|
|
uuids = []
|
|
while i < len(template) - 1:
|
|
i += 1
|
|
if template[i] == "-":
|
|
uuids.append(uuid)
|
|
uuid = ""
|
|
continue
|
|
elif template[i] == "4":
|
|
uuid += template[i]
|
|
continue
|
|
|
|
n = (e + 16 * random.random()) % 16
|
|
e = e // 16
|
|
|
|
char = format(int(n) if template[i] == 'x' else 3 & int(n) | 8, "x")
|
|
uuid += char
|
|
uuids.append(uuid)
|
|
return "-".join(uuids)
|
|
|
|
|
|
def get_header_nonce():
|
|
return get_uuid(True)
|
|
|
|
|
|
def server(key):
|
|
url = f"http://127.0.0.1:3000/hn/get_signature?nonce={key}"
|
|
res = requests.get(url)
|
|
return res.text
|
|
|
|
|
|
def build_headers():
|
|
times = int(time.time() * 1000)
|
|
nonce = get_header_nonce()
|
|
sid = f"S_{get_trace_id(times - 300)}"
|
|
traceid = get_trace_id(times)
|
|
client_id = get_uuid(False)
|
|
s = S(times)
|
|
|
|
M = f'{I(nonce)}!{j(str(times))}!{P(nonce, client_id)}!{server(s)}'
|
|
|
|
h = {
|
|
"x-b3-traceid": traceid,
|
|
"x-client-id": client_id,
|
|
"x-client-nonce": nonce,
|
|
"x-client-sign": SHA384(M),
|
|
"x-client-time": str(times),
|
|
"x-client-sid": sid
|
|
}
|
|
# print(h)
|
|
return h
|
|
|
|
|
|
if __name__ == '__main__':
|
|
build_headers()
|