diff --git a/BiliDriveEx/__main__.py b/BiliDriveEx/__main__.py index 46ad92baa6f1d78a7375e62156e2638c7e5d40f4..f2fa4659a7036e92933c16bb1f429cf6a72066cc 100644 --- a/BiliDriveEx/__main__.py +++ b/BiliDriveEx/__main__.py @@ -312,7 +312,8 @@ def main(): try: args.func(args) break - except AttributeError: + except AttributeError as ex: + traceback.print_exc(file=sys.stdout) shell = True subparsers.add_parser("help", help="show this help message").set_defaults(func=lambda _: parser.parse_args(["--help"]).func()) subparsers.add_parser("version", help="show program's version number").set_defaults(func=lambda _: parser.parse_args(["--version"]).func()) diff --git a/BiliDriveEx/bilibili.py b/BiliDriveEx/bilibili.py index bb39e5b7df12250bfa2b13400ed0318265f79da6..ead90ec27d2edfc3f1667ecd4226ed70e7fc1a43 100644 --- a/BiliDriveEx/bilibili.py +++ b/BiliDriveEx/bilibili.py @@ -14,6 +14,7 @@ from BiliDriveEx.util import * class Bilibili: app_key = "1d8b6e7d45233436" + default_hdrs = {'User-Agent': "Mozilla/5.0 BiliDroid/5.51.1 (bbcallen@gmail.com)"} default_url = lambda self, sha1: f"http://i0.hdslb.com/bfs/album/{sha1}.png" 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 @@ -22,10 +23,9 @@ class Bilibili: get_uid = lambda self: self.get_cookies().get("DedeUserID", "") def __init__(self): + self.cookie = {} self._session = requests.Session() self._session.headers.update({'User-Agent': "Mozilla/5.0 BiliDroid/5.51.1 (bbcallen@gmail.com)"}) - self.username = "" - self.password = "" self.info = { 'ban': False, 'coins': 0, @@ -40,20 +40,18 @@ class Bilibili: - def _requests(self, method, url, decode_level=2, retry=0, timeout=10, **kwargs): - if method in ["get", "post"]: - for _ in range(retry + 1): - try: - response = getattr(self._session, method)(url, timeout=timeout, **kwargs) - return response.json() if decode_level == 2 else response.content if decode_level == 1 else response - except: - pass - return None + 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): url = "https://bili.dev:2233/captcha" payload = {'image': base64.b64encode(image).decode("utf-8")} - response = self._requests("post", url, json=payload) + response = self._requests("post", url, json=payload).json() return response['message'] if response and response.get("code") == 0 else None @staticmethod @@ -70,7 +68,7 @@ class Bilibili: 'appkey': Bilibili.app_key, 'sign': self.calc_sign(f"appkey={Bilibili.app_key}"), } - res = request_retry("post", url, data=payload, retry=999999).json() + res = self._requests("post", url, data=payload, retry=999999).json() if res and res['code'] == 0: return { 'key_hash': res['data']['hash'], @@ -79,6 +77,7 @@ class Bilibili: def login_once(self, username, password, captcha=None): key = self.get_key() + print('key: ', key) key_hash, pub_key = key['key_hash'], key['pub_key'] username = parse.quote_plus(username) password = parse.quote_plus(base64.b64encode(rsa.encrypt(f'{key_hash}{password}'.encode(), pub_key))) @@ -88,34 +87,38 @@ class Bilibili: param += f"&password={password}&username={username}" payload = f"{param}&sign={self.calc_sign(param)}" headers = {'Content-type': "application/x-www-form-urlencoded"} - res = self._requests("post", url, data=payload, headers=headers) + res = self._requests("POST", url, data=payload, headers=headers).json() + return res + + def get_captcha(self): + url = f"https://passport.bilibili.com/captcha" + headers = {'Host': "passport.bilibili.com"} + res = self._requests('GET', url, headers=headers).content return res # 登录 def login(self, username, password): - self.username = username - self.password = password while True: response = self.login_once(username, password) + print(response) while True: if response and response.get("code") is not None: if response['code'] == -105: - url = f"https://passport.bilibili.com/captcha" - headers = {'Host': "passport.bilibili.com"} - response = self._requests("get", url, headers=headers, decode_level=1) + response = self.get_captcha() captcha = self._solve_captcha(response) if captcha: log(f"登录验证码识别结果: {captcha}") - response = login_once(username, password, captcha) + response = self.login_once(username, password, captcha) else: log(f"登录验证码识别服务暂时不可用, 10秒后重试") time.sleep(10) break elif response['code'] == -449: time.sleep(1) - response = self._requests("post", url, data=payload, headers=headers) + response = self.login_once(username, password) elif response['code'] == 0 and response['data']['status'] == 0: + print(response) for cookie in response['data']['cookie_info']['cookies']: self._session.cookies.set(cookie['name'], cookie['value'], domain=".bilibili.com") log("登录成功") @@ -135,7 +138,7 @@ class Bilibili: 'Host': "api.bilibili.com", 'Referer': f"https://space.bilibili.com/{self.get_uid()}/", } - response = self._requests("get", url, headers=headers) + response = self._requests("get", url, headers=headers).json() if response and response.get("code") == 0: self.info['ban'] = bool(response['data']['silence']) self.info['coins'] = response['data']['coins']