SIMNet/simnet/client/components/verify.py

87 lines
3.2 KiB
Python
Raw Permalink Normal View History

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