From f260a50582d08cf4fe224edb3964dddbbf2abcd2 Mon Sep 17 00:00:00 2001 From: luckycat0426 Date: Tue, 14 Jun 2022 14:09:31 +0800 Subject: [PATCH] Fix ui bug,add login page for biliup (#155) * Add Douyin Mainpage Url Support For Douyin Recorder * Fix issues 119 * Delete Tid Table --- biliup/plugins/bili_webup.py | 69 +- biliup/web/__init__.py | 65 +- package.json | 5 +- src/App.svelte | 25 + src/Login.svelte | 257 +++++ src/Partition.svelte | 11 +- src/Sidebar.svelte | 5 +- src/Upload.svelte | 158 ++- src/store.ts | 2 +- src/tid.ts | 2046 ---------------------------------- 10 files changed, 530 insertions(+), 2113 deletions(-) create mode 100644 src/Login.svelte delete mode 100644 src/tid.ts diff --git a/biliup/plugins/bili_webup.py b/biliup/plugins/bili_webup.py index 46f75f6..48b3f08 100644 --- a/biliup/plugins/bili_webup.py +++ b/biliup/plugins/bili_webup.py @@ -6,6 +6,7 @@ import math import os import sys import time +import urllib.parse from dataclasses import asdict, dataclass, field, InitVar from json import JSONDecodeError from os.path import splitext, basename @@ -56,7 +57,7 @@ class BiliWeb(UploadBase): video_part = bili.upload_file(file, self.lines, self.threads) # 上传视频 video_part['title'] = video_part['title'][:80] video.append(video_part) # 添加已经上传的视频 - video.title = self.data["format_title"][:80] #稿件标题限制80字 + video.title = self.data["format_title"][:80] # 稿件标题限制80字 video.desc = self.desc video.copyright = self.copyright if self.copyright == 2: @@ -95,6 +96,42 @@ class BiliBili: self._auto_os = None self.persistence_path = 'engine/bili.cookie' + def get_qrcode(self): + params = { + "appkey": "4409e2ce8ffd12b8", + "local_id": "0", + "ts": int(time.time()), + } + params["sign"] = hashlib.md5( + f"{urllib.parse.urlencode(params)}59b43e04ad6965f34319062b478f83dd".encode()).hexdigest() + response = self.__session.post("http://passport.bilibili.com/x/passport-tv-login/qrcode/auth_code", data=params, + timeout=5) + r = response.json() + if r and r["code"] == 0: + return r + + async def login_by_qrcode(self, value): + params = { + "appkey": "4409e2ce8ffd12b8", + "auth_code": value["data"]["auth_code"], + "local_id": "0", + "ts": int(time.time()), + } + params["sign"] = hashlib.md5( + f"{urllib.parse.urlencode(params)}59b43e04ad6965f34319062b478f83dd".encode()).hexdigest() + for i in range(0, 120): + await asyncio.sleep(1) + response = self.__session.post("http://passport.bilibili.com/x/passport-tv-login/qrcode/poll", data=params, + timeout=5) + r = response.json() + if r and r["code"] == 0: + return r + raise "Qrcode timeout" + def tid_archive(self,cookies): + requests.utils.add_dict_to_cookiejar(self.__session.cookies, cookies) + response = self.__session.get("https://member.bilibili.com/x/vupre/web/archive/pre") + return response.json() + def login(self, persistence_path, user): self.persistence_path = persistence_path if os.path.isfile(persistence_path): @@ -131,6 +168,35 @@ class BiliBili: 'refresh_token': self.refresh_token }, f) + def send_sms(self, phone_number, country_code ): + params = { + "actionKey": "appkey", + "appkey": "783bbb7264451d82", + "build": 6510400, + "channel": "bili", + "cid": country_code, + "device": "phone", + "mobi_app": "android", + "platform": "android", + "tel": phone_number, + "ts": int(time.time()), + } + sign = hashlib.md5(f"{urllib.parse.urlencode(params)}2653583c8873dea268ab9386918b1d65".encode()).hexdigest() + payload = f"{urllib.parse.urlencode(params)}&sign={sign}" + response = self.__session.post("https://passport.bilibili.com/x/passport-login/sms/send", data=payload, + timeout=5) + return response.json() + + def login_by_sms(self, code, params): + params["code"] = code + params["sign"] = hashlib.md5( + f"{urllib.parse.urlencode(params)}59b43e04ad6965f34319062b478f83dd".encode()).hexdigest() + response = self.__session.post("https://passport.bilibili.com/x/passport-login/login/sms", data=params, + timeout=5) + r = response.json() + if r and r["code"] == 0: + return r + def login_by_password(self, username, password): print('使用账号上传') key_hash, pub_key = self.get_key() @@ -175,7 +241,6 @@ class BiliBili: requests.utils.add_dict_to_cookiejar(self.__session.cookies, cookie) if 'bili_jct' in cookie: self.__bili_jct = cookie["bili_jct"] - data = self.__session.get("https://api.bilibili.com/x/web-interface/nav", timeout=5).json() if data["code"] != 0: raise Exception(data) diff --git a/biliup/web/__init__.py b/biliup/web/__init__.py index a4674ee..3edacb8 100644 --- a/biliup/web/__init__.py +++ b/biliup/web/__init__.py @@ -2,6 +2,9 @@ from aiohttp import web from .aiohttp_basicauth_middleware import basic_auth_middleware from biliup.config import config +from biliup.plugins.bili_webup import BiliBili, Data + +BiliBili = BiliBili(Data()) async def get_basic_config(request): @@ -25,11 +28,14 @@ async def set_basic_config(request): if config.data['lines'] == 'cos': config.data['lines'] = 'cos-internal' config.data['threads'] = post_data['limit'] - config.data['user']['cookies']['SESSDATA'] = post_data['user']['SESSDATA'] - config.data['user']['cookies']['bili_jct'] = post_data['user']['bili_jct'] - config.data['user']['cookies']['DedeUserID__ckMd5'] = post_data['user']['DedeUserID__ckMd5'] - config.data['user']['cookies']['DedeUserID'] = post_data['user']['DedeUserID'] - config.data['user']['access_token'] = post_data['user']['access_token'] + cookies ={ + "SESSDATA": str(post_data['user']['SESSDATA']), + "bili_jct": str(post_data['user']['bili_jct']), + "DedeUserID__ckMd5": str(post_data['user']['DedeUserID__ckMd5']), + "DedeUserID": str(post_data['user']['DedeUserID']), + } + config.data['user']['cookies'] = cookies + config.data['user']['access_token'] = str(post_data['user']['access_token']) return web.json_response({"status": 200}) @@ -62,10 +68,49 @@ async def root_handler(request): return web.HTTPFound('/index.html') -async def service(args, event_manager): +async def cookie_login(request): + cookie = config.data['user']['cookies'] + try: + BiliBili.login_by_cookies(cookie) + except Exception as e: + print(e) + return web.HTTPBadRequest(text="login failed") + return web.json_response({"status": 200}) + +async def sms_login(request): + pass + + +async def sms_send(request): + post_data = await request.json() + pass + + +async def qrcode_get(request): + r = BiliBili.get_qrcode() + return web.json_response(r) + + +async def qrcode_login(request): + post_data = await request.json() + try: + r = await BiliBili.login_by_qrcode(post_data) + except: + return web.HTTPBadRequest(text="timeout for qrcode validate") + for cookie in r['data']['cookie_info']['cookies']: + config.data['user']['cookies'][cookie['name']] = cookie['value'] + config.data['user']['access_token'] = r['data']['token_info']['access_token'] + return web.json_response(r) +async def pre_archive(request): + cookies = config.data['user']['cookies'] + return web.json_response(BiliBili.tid_archive(cookies)) + + +async def service(args, event_manager): async def url_status(request): return web.json_response(event_manager.context['KernelFunc'].get_url_status()) + app = web.Application() try: from importlib.resources import files @@ -77,7 +122,13 @@ async def service(args, event_manager): app.add_routes([web.post('/api/setbasic', set_basic_config)]) app.add_routes([web.get('/api/getconfig', get_streamer_config)]) app.add_routes([web.post('/api/setconfig', set_streamer_config)]) + app.add_routes([web.get('/api/login_by_cookie', cookie_login)]) + app.add_routes([web.get('/api/login_by_sms', sms_login)]) + app.add_routes([web.post('/api/send_sms', sms_send)]) app.add_routes([web.get('/api/save', save_config)]) + app.add_routes([web.get('/api/get_qrcode', qrcode_get)]) + app.add_routes([web.post('/api/login_by_qrcode', qrcode_login)]) + app.add_routes([web.get('/api/archive_pre', pre_archive)]) app.add_routes([web.get('/', root_handler)]) if args.static_dir: app.add_routes([web.static('/', args.static_dir, show_index=False)]) @@ -91,4 +142,4 @@ async def service(args, event_manager): runner = web.AppRunner(app) await runner.setup() site = web.TCPSite(runner, host=args.host, port=args.port) - return runner, site \ No newline at end of file + return runner, site diff --git a/package.json b/package.json index 86397c2..9a14850 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@tsconfig/svelte": "^2.0.0", "autoprefixer": "^10.4.2", "daisyui": "^2.6.4", + "ncp": "^2.0.0", "postcss": "^8.4.5", "postcss-import": "^14.0.2", "postcss-load-config": "^3.1.0", @@ -31,11 +32,11 @@ "svelte-preprocess": "^4.9.8", "tailwindcss": "^3.0.16", "tslib": "^2.0.0", - "typescript": "^4.0.0", - "ncp": "^2.0.0" + "typescript": "^4.0.0" }, "dependencies": { "sirv-cli": "^1.0.0", + "svelte-qrcode": "^1.0.0", "tippy.js": "^6.3.7" } } diff --git a/src/App.svelte b/src/App.svelte index 63005bf..0f76597 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1,12 +1,37 @@
+ {#if $isLogin} + {:else} + + {/if}