2023-11-18 16:22:22 +00:00
|
|
|
import json
|
|
|
|
import re
|
|
|
|
import time
|
|
|
|
from typing import Optional
|
|
|
|
|
|
|
|
from httpx import Headers
|
|
|
|
|
|
|
|
from simnet.client.base import BaseClient
|
|
|
|
from simnet.client.routes import URL
|
|
|
|
from simnet.errors import RegionNotSupported
|
2023-12-27 07:09:24 +00:00
|
|
|
from simnet.utils.enums import Region
|
2023-11-18 16:22:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
class VerifyClient(BaseClient):
|
|
|
|
"""VerifyClient component."""
|
|
|
|
|
|
|
|
HOST = URL("https://api-takumi-record.mihoyo.com")
|
|
|
|
VERIFICATION_HOST = URL("https://api.geetest.com")
|
|
|
|
CREATE_VERIFICATION_URL = HOST / "/game_record/app/card/wapi/createVerification"
|
|
|
|
VERIFY_VERIFICATION_URL = HOST / "/game_record/app/card/wapi/verifyVerification"
|
|
|
|
AJAX_URL = VERIFICATION_HOST / "/ajax.php"
|
|
|
|
|
|
|
|
async def create_verification(self, is_high: bool = False):
|
|
|
|
"""Create a verification challenge.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
is_high (bool): Ifs the challenge for a high risk device.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
str: The challenge.
|
|
|
|
"""
|
|
|
|
if self.region != Region.CHINESE:
|
|
|
|
raise RegionNotSupported("This method is only available for the Chinese region.")
|
|
|
|
params = {"is_high": "true" if is_high else "false"}
|
|
|
|
return await self.request_lab(self.CREATE_VERIFICATION_URL, params=params)
|
|
|
|
|
|
|
|
async def verify_verification(self, challenge: str, validate: str):
|
|
|
|
"""Verify a verification challenge.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
challenge (str): The challenge code.
|
|
|
|
validate (str): The validate code.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
str: The verification result.
|
|
|
|
"""
|
|
|
|
if self.region != Region.CHINESE:
|
|
|
|
raise RegionNotSupported("This method is only available for the Chinese region.")
|
|
|
|
data = {"geetest_challenge": challenge, "geetest_validate": validate, "geetest_seccode": f"{validate}|jordan"}
|
|
|
|
return await self.request_lab(self.VERIFY_VERIFICATION_URL, data=data)
|
|
|
|
|
|
|
|
async def request_verify_ajax(self, referer: str, gt: str, challenge: str) -> Optional[str]:
|
|
|
|
"""Get the ajax validate code.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
referer (str): The web referer.
|
|
|
|
gt (str): The gt challenge.
|
|
|
|
challenge (str): The challenge code.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Optional[str]: The ajax validate code.
|
|
|
|
"""
|
|
|
|
if self.region != Region.CHINESE:
|
|
|
|
raise RegionNotSupported("This method is only available for the Chinese region.")
|
|
|
|
params = {
|
|
|
|
"gt": gt,
|
|
|
|
"challenge": challenge,
|
|
|
|
"lang": "zh-cn",
|
|
|
|
"pt": 3,
|
|
|
|
"client_type": "web_mobile",
|
|
|
|
"callback": f"geetest_{int(time.time() * 1000)}",
|
|
|
|
}
|
|
|
|
headers = Headers()
|
|
|
|
headers["user-agent"] = self.user_agent
|
|
|
|
headers["x-rpc-app_version"] = self.app_version
|
|
|
|
headers["x-rpc-client_type"] = self.client_type
|
|
|
|
headers["x-rpc-device_id"] = self.get_device_id()
|
|
|
|
headers["x-rpc-device_fp"] = self.get_device_fp()
|
|
|
|
headers["referer"] = referer
|
|
|
|
response = await self.request("GET", self.AJAX_URL, params=params, headers=headers)
|
|
|
|
text = response.text
|
|
|
|
json_data = re.findall(r"^.*?\((\{.*?)\)$", text)[0]
|
|
|
|
data = json.loads(json_data)
|
|
|
|
if "success" in data["status"] and "success" in data["data"]["result"]:
|
|
|
|
return data["data"]["validate"]
|
|
|
|
return None
|