提交 9ffb3624 编写于 作者: W wizardforcel

优化 cookie 加载流程

上级 43f05463
...@@ -47,8 +47,7 @@ def login_handle(args): ...@@ -47,8 +47,7 @@ def login_handle(args):
info = api.get_user_info() info = api.get_user_info()
if info: log_info(info) if info: log_info(info)
else: log("用户信息获取失败") else: log("用户信息获取失败")
with open(os.path.join(bundle_dir, "cookies.json"), "w", encoding="utf-8") as f:
f.write(json.dumps(api.get_cookies(), ensure_ascii=False, indent=2))
def upload_handle(args): def upload_handle(args):
def core(index, block): def core(index, block):
...@@ -69,7 +68,7 @@ def upload_handle(args): ...@@ -69,7 +68,7 @@ def upload_handle(args):
for _ in range(10): for _ in range(10):
if terminate_flag.is_set(): if terminate_flag.is_set():
return return
response = api.image_upload(full_block, cookies) response = api.image_upload(full_block)
if response: if response:
if response['code'] == 0: if response['code'] == 0:
url = response['data']['image_url'] url = response['data']['image_url']
...@@ -109,12 +108,8 @@ def upload_handle(args): ...@@ -109,12 +108,8 @@ def upload_handle(args):
log(f"文件已于{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(history[first_4mb_sha1]['time']))}上传, 共有{len(history[first_4mb_sha1]['block'])}个分块") log(f"文件已于{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(history[first_4mb_sha1]['time']))}上传, 共有{len(history[first_4mb_sha1]['block'])}个分块")
log(f"META URL -> {api.meta_string(url)}") log(f"META URL -> {api.meta_string(url)}")
return url return url
try:
with open(os.path.join(bundle_dir, "cookies.json"), "r", encoding="utf-8") as f: # TODO: 判断 Cookie 是否有效
cookies = json.loads(f.read())
except:
log("Cookies加载失败, 请先登录")
return None
log(f"线程数: {args.thread}") log(f"线程数: {args.thread}")
done_flag = threading.Semaphore(0) done_flag = threading.Semaphore(0)
terminate_flag = threading.Event() terminate_flag = threading.Event()
...@@ -145,7 +140,7 @@ def upload_handle(args): ...@@ -145,7 +140,7 @@ def upload_handle(args):
meta = json.dumps(meta_dict, ensure_ascii=False).encode("utf-8") meta = json.dumps(meta_dict, ensure_ascii=False).encode("utf-8")
full_meta = encoder.encode(meta) full_meta = encoder.encode(meta)
for _ in range(10): for _ in range(10):
response = api.image_upload(full_meta, cookies) response = api.image_upload(full_meta)
if response and response['code'] == 0: if response and response['code'] == 0:
url = response['data']['image_url'] url = response['data']['image_url']
log("元数据上传完毕") log("元数据上传完毕")
......
...@@ -20,20 +20,10 @@ class Bilibili: ...@@ -20,20 +20,10 @@ class Bilibili:
meta_string = lambda self, url: ("bdex://" + re.findall(r"[a-fA-F0-9]{40}", url)[0]) if re.match(r"^http(s?)://i0.hdslb.com/bfs/album/[a-fA-F0-9]{40}.png$", url) else url meta_string = lambda self, url: ("bdex://" + re.findall(r"[a-fA-F0-9]{40}", url)[0]) if re.match(r"^http(s?)://i0.hdslb.com/bfs/album/[a-fA-F0-9]{40}.png$", url) else url
get_cookies = lambda self: self.cookies get_cookies = lambda self: self.cookies
get_uid = lambda self: self.get_cookies().get("DedeUserID", "")
def __init__(self): def __init__(self):
self.cookies = {} self.cookies = {}
self._session = requests.Session() self.load_cookies()
self._session.headers.update({'User-Agent': "Mozilla/5.0 BiliDroid/5.51.1 (bbcallen@gmail.com)"})
def _requests(self, method, url, decode_level=0, retry=0, timeout=10, **kwargs):
for _ in range(retry + 1):
try:
response = getattr(self._session, method.lower())(url, timeout=timeout, **kwargs)
return response.json() if decode_level == 2 else response.content if decode_level == 1 else response
except:
pass
def _solve_captcha(self, image): def _solve_captcha(self, image):
url = "https://bili.dev:2233/captcha" url = "https://bili.dev:2233/captcha"
...@@ -102,7 +92,7 @@ class Bilibili: ...@@ -102,7 +92,7 @@ class Bilibili:
captcha = None captcha = None
while True: while True:
response = self.login_once(username, password, captcha) response = self.login_once(username, password, captcha)
print(response, self.cookies) # print(response, self.cookies)
if not response or 'code' not in response: if not response or 'code' not in response:
log(f"当前IP登录过于频繁, 1分钟后重试") log(f"当前IP登录过于频繁, 1分钟后重试")
...@@ -127,6 +117,7 @@ class Bilibili: ...@@ -127,6 +117,7 @@ class Bilibili:
for cookie in response['data']['cookie_info']['cookies']: for cookie in response['data']['cookie_info']['cookies']:
self.cookies[cookie['name']] = cookie['value'] self.cookies[cookie['name']] = cookie['value']
log("登录成功") log("登录成功")
self.save_cookies()
return True return True
log(f"登录失败 {response}") log(f"登录失败 {response}")
...@@ -137,8 +128,7 @@ class Bilibili: ...@@ -137,8 +128,7 @@ class Bilibili:
def get_user_info(self): def get_user_info(self):
url = f"https://api.bilibili.com/x/space/myinfo?jsonp=jsonp" url = f"https://api.bilibili.com/x/space/myinfo?jsonp=jsonp"
headers = { headers = {
'Host': "api.bilibili.com", 'Referer': f"https://space.bilibili.com",
'Referer': f"https://space.bilibili.com/{self.get_uid()}/",
} }
response = request_retry("get", url, response = request_retry("get", url,
headers=headers, headers=headers,
...@@ -147,7 +137,6 @@ class Bilibili: ...@@ -147,7 +137,6 @@ class Bilibili:
if not response or response.get("code") != 0: if not response or response.get("code") != 0:
return False return False
print(response)
info = { info = {
'ban': False, 'ban': False,
...@@ -171,7 +160,16 @@ class Bilibili: ...@@ -171,7 +160,16 @@ class Bilibili:
info['uid'] = response['data']['mid'] info['uid'] = response['data']['mid']
return info return info
def save_cookies(self):
with open(os.path.join(bundle_dir, "cookies.json"), "w", encoding="utf-8") as f:
f.write(json.dumps(self.cookies, ensure_ascii=False, indent=2))
def load_cookies(self):
try:
with open(os.path.join(bundle_dir, "cookies.json"), "r", encoding="utf-8") as f:
self.cookies = json.loads(f.read())
except:
pass
def exist(self, sha1): def exist(self, sha1):
try: try:
...@@ -186,7 +184,7 @@ class Bilibili: ...@@ -186,7 +184,7 @@ class Bilibili:
return None return None
def image_upload(self, data, cookies): def image_upload(self, data):
sha1 = calc_sha1(data) sha1 = calc_sha1(data)
url = self.exist(sha1) url = self.exist(sha1)
if url: return {'code': 0, 'data': {'image_url': url}} if url: return {'code': 0, 'data': {'image_url': url}}
...@@ -205,7 +203,11 @@ class Bilibili: ...@@ -205,7 +203,11 @@ class Bilibili:
'category': "daily", 'category': "daily",
} }
try: try:
response = requests.post(url, data=data, headers=headers, cookies=cookies, files=files, timeout=300).json() response = requests.post(url, data=data,
headers=headers,
cookies=self.cookies,
files=files, timeout=300
).json()
except: except:
response = None response = None
return response return response
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册