"""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", }