"""wgapi 版登录接口策略""" import time from .crypto import encrypt_nickname_or_phone, encrypt_password from .login_api import LoginAPIStrategy class WgapiLoginAPI(LoginAPIStrategy): """wgapi 版接口策略 使用新版 wgapi 接口,参数扁平化,用户名 RC4 加密后 base64 编码。 """ @property def name(self) -> str: return "wgapi" @property def first_login_url(self) -> str: return "https://passport.douyu.com/wgapi/member/passport/login" @property def login_url(self) -> str: return "https://passport.douyu.com/wgapi/member/passport/login" @property def send_email_url(self) -> str: return "https://passport.douyu.com/wgapi/member/passport/remotelogin/sendemail" @property def verify_url(self) -> str: return "https://passport.douyu.com/wgapi/member/passport/remotelogin/verify" def encrypt_username(self, username: str) -> str: """RC4 加密后 base64 编码""" return encrypt_nickname_or_phone(username) def build_first_login_data(self, username: str, password: str, referer: str) -> dict: """构建第一次登录参数""" return { 'type': '1', 'nicknameOrPhoneEncrypt': self.encrypt_username(username), 'password': encrypt_password(password), 'biz_type': '1', 'room_id': '0', 'redirect_url': referer, 't': str(int(time.time() * 1000)), 'client_id': '1', 'did': '', 'lang': '', 'isMultiAccount': '0', } def build_second_login_data( self, username: str, password: str, gt: str, challenge: str, validate: str, seccode: str, code_token: str, referer: str, ) -> dict: """构建第二次登录参数(带极验验证)""" return { 'type': '1', 'nicknameOrPhoneEncrypt': self.encrypt_username(username), 'password': encrypt_password(password), 'room_id': '0', 'code_type': '1', 'code_token': code_token, 'gt_version': 'v3', 'geetest_challenge': challenge, 'geetest_validate': validate, 'geetest_seccode': seccode, 'code_data[geetest_challenge]': challenge, 'code_data[geetest_validate]': validate, 'code_data[geetest_seccode]': seccode, 'code_data[gt_version]': 'v3', 'code_data[code]': '', 'redirect_url': referer, 't': str(int(time.time() * 1000)), 'client_id': '1', 'did': '', 'lang': '', 'isMultiAccount': '0', 'biz_type': '1', } def build_send_email_data(self, code: str) -> dict: """构建发送邮箱验证参数""" return { 'code': code, 'client_id': '1', } def build_verify_data(self, code: str, captcha: str) -> dict: """构建提交验证码参数""" return { 'verify_type': '2', 'captcha': captcha, 'isMultiAccount': '0', 'code': code, 'client_id': '1', 'redirect_url': '//www.douyu.com/api/passport/login', }