-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwbi.py
More file actions
57 lines (52 loc) · 2.02 KB
/
Copy pathwbi.py
File metadata and controls
57 lines (52 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import time
import hashlib
import urllib.parse
import json
from config import WBI_CACHE_FILE
MIXIN_KEY_ENC_TAB = [
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 get_mixin_key(orig: str) -> str:
return ''.join(orig[i] for i in MIXIN_KEY_ENC_TAB)[:32]
def enc_wbi(params: dict, img_key: str, sub_key: str) -> dict:
mixin_key = get_mixin_key(img_key + sub_key)
curr_time = int(time.time())
params['wts'] = curr_time
sorted_params = dict(sorted(params.items()))
filtered_params = {
k: ''.join(ch for ch in str(v) if ch not in "!'()*")
for k, v in sorted_params.items()
}
query = urllib.parse.urlencode(filtered_params)
wbi_sign = hashlib.md5((query + mixin_key).encode()).hexdigest()
params['w_rid'] = wbi_sign
return params
def get_wbi_keys_from_nav(session) -> tuple:
try:
resp = session.get('https://api.bilibili.com/x/web-interface/nav', timeout=5)
data = resp.json()
if data.get('code') != 0:
return None, None
img_url = data['data']['wbi_img']['img_url']
sub_url = data['data']['wbi_img']['sub_url']
img_key = img_url.split('/')[-1].split('.')[0]
sub_key = sub_url.split('/')[-1].split('.')[0]
with open(WBI_CACHE_FILE, 'w') as f:
json.dump({'img_key': img_key, 'sub_key': sub_key, 'timestamp': time.time()}, f)
return img_key, sub_key
except:
return None, None
def load_wbi_keys():
import os
if os.path.exists(WBI_CACHE_FILE):
try:
with open(WBI_CACHE_FILE, 'r') as f:
data = json.load(f)
if time.time() - data.get('timestamp', 0) < 86400:
return data.get('img_key'), data.get('sub_key')
except:
pass
return None, None