提交 9281bf98 编写于 作者: W wizardforcel

优化代码结构

上级 b0d3d837
......@@ -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())
......
......@@ -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']
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册