mirror of
https://github.com/PaiGramTeam/PamGram.git
synced 2024-11-21 21:58:04 +00:00
🐛 Fix device too dynamic
This commit is contained in:
parent
65aed03d55
commit
01f171da65
@ -11,7 +11,7 @@ from qrcode.image.pure import PyPNGImage
|
|||||||
|
|
||||||
from ...logger import logger
|
from ...logger import logger
|
||||||
from ...models.genshin.cookies import CookiesModel
|
from ...models.genshin.cookies import CookiesModel
|
||||||
from ...utility.helpers import get_device_id, get_ds
|
from ...utility.helpers import get_device_id, get_ds, update_device_headers
|
||||||
|
|
||||||
__all__ = ("AuthClient",)
|
__all__ = ("AuthClient",)
|
||||||
|
|
||||||
@ -87,13 +87,12 @@ class AuthClient:
|
|||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
"x-rpc-game_biz": "bbs_cn",
|
"x-rpc-game_biz": "bbs_cn",
|
||||||
"x-rpc-sys_version": "11",
|
"x-rpc-sys_version": "11",
|
||||||
"x-rpc-device_id": get_device_id(self.USER_AGENT),
|
|
||||||
"x-rpc-device_fp": "".join(random.choices((ascii_letters + digits), k=13)),
|
|
||||||
"x-rpc-device_name": "Chrome 108.0.0.0",
|
"x-rpc-device_name": "Chrome 108.0.0.0",
|
||||||
"x-rpc-device_model": "Windows 10 64-bit",
|
"x-rpc-device_model": "Windows 10 64-bit",
|
||||||
"x-rpc-app_id": "bll8iq97cem8",
|
"x-rpc-app_id": "bll8iq97cem8",
|
||||||
"User-Agent": "okhttp/4.8.0",
|
"User-Agent": "okhttp/4.8.0",
|
||||||
}
|
}
|
||||||
|
update_device_headers(self.user_id, headers)
|
||||||
app_version, client_type, ds_sign = get_ds(new_ds=True, data=data)
|
app_version, client_type, ds_sign = get_ds(new_ds=True, data=data)
|
||||||
headers["x-rpc-app_version"] = app_version
|
headers["x-rpc-app_version"] = app_version
|
||||||
headers["x-rpc-client_type"] = client_type
|
headers["x-rpc-client_type"] = client_type
|
||||||
|
@ -4,7 +4,7 @@ import time
|
|||||||
from typing import Dict, Optional
|
from typing import Dict, Optional
|
||||||
|
|
||||||
from ..base.hyperionrequest import HyperionRequest
|
from ..base.hyperionrequest import HyperionRequest
|
||||||
from ...utility.helpers import get_ua, get_device_id, get_ds
|
from ...utility.helpers import get_ua, get_ds, update_device_headers
|
||||||
|
|
||||||
__all__ = ("Verify",)
|
__all__ = ("Verify",)
|
||||||
|
|
||||||
@ -14,6 +14,8 @@ class Verify:
|
|||||||
VERIFICATION_HOST = "api.geetest.com"
|
VERIFICATION_HOST = "api.geetest.com"
|
||||||
CREATE_VERIFICATION_URL = "/game_record/app/card/wapi/createVerification"
|
CREATE_VERIFICATION_URL = "/game_record/app/card/wapi/createVerification"
|
||||||
VERIFY_VERIFICATION_URL = "/game_record/app/card/wapi/verifyVerification"
|
VERIFY_VERIFICATION_URL = "/game_record/app/card/wapi/verifyVerification"
|
||||||
|
REFERER_URL = "/game_record/app/hkrpg/api/note"
|
||||||
|
GAME = "6"
|
||||||
AJAX_URL = "/ajax.php"
|
AJAX_URL = "/ajax.php"
|
||||||
|
|
||||||
USER_AGENT = get_ua()
|
USER_AGENT = get_ua()
|
||||||
@ -24,8 +26,7 @@ class Verify:
|
|||||||
"User-Agent": USER_AGENT,
|
"User-Agent": USER_AGENT,
|
||||||
"X-Requested-With": "com.mihoyo.hyperion",
|
"X-Requested-With": "com.mihoyo.hyperion",
|
||||||
"Referer": "https://webstatic.mihoyo.com/",
|
"Referer": "https://webstatic.mihoyo.com/",
|
||||||
"x-rpc-device_id": get_device_id(USER_AGENT),
|
"x-rpc-page": "3.1.3_#/rpg",
|
||||||
"x-rpc-page": "3.1.3_#/ys",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VERIFICATION_HEADERS = {
|
VERIFICATION_HEADERS = {
|
||||||
@ -35,7 +36,8 @@ class Verify:
|
|||||||
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, cookies: Dict = None):
|
def __init__(self, account_id: int = None, cookies: Dict = None):
|
||||||
|
self.account_id = account_id
|
||||||
self.client = HyperionRequest(headers=self.BBS_HEADERS, cookies=cookies)
|
self.client = HyperionRequest(headers=self.BBS_HEADERS, cookies=cookies)
|
||||||
|
|
||||||
def get_verification_headers(self, referer: str):
|
def get_verification_headers(self, referer: str):
|
||||||
@ -49,6 +51,9 @@ class Verify:
|
|||||||
headers["x-rpc-app_version"] = app_version
|
headers["x-rpc-app_version"] = app_version
|
||||||
headers["x-rpc-client_type"] = client_type
|
headers["x-rpc-client_type"] = client_type
|
||||||
headers["DS"] = ds
|
headers["DS"] = ds
|
||||||
|
headers["x-rpc-challenge_path"] = f"https://{self.HOST}{self.REFERER_URL}"
|
||||||
|
headers["x-rpc-challenge_game"] = self.GAME
|
||||||
|
update_device_headers(self.account_id, headers)
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -4,9 +4,9 @@ import random
|
|||||||
import string
|
import string
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
from typing import Any, Mapping, Optional
|
from typing import Any, Mapping, Optional, Dict
|
||||||
|
|
||||||
__all__ = ("get_device_id", "hex_digest", "get_ds", "get_recognize_server", "get_ua")
|
__all__ = ("get_device_id", "hex_digest", "get_ds", "get_recognize_server", "get_ua", "update_device_headers")
|
||||||
|
|
||||||
RECOGNIZE_SERVER = {
|
RECOGNIZE_SERVER = {
|
||||||
"1": "cn_gf01",
|
"1": "cn_gf01",
|
||||||
@ -23,6 +23,14 @@ def get_device_id(name: str = ""):
|
|||||||
return str(uuid.uuid3(uuid.NAMESPACE_URL, name))
|
return str(uuid.uuid3(uuid.NAMESPACE_URL, name))
|
||||||
|
|
||||||
|
|
||||||
|
def update_device_headers(account_id: int, headers: Dict = None) -> Dict[str, str]:
|
||||||
|
account_id = account_id or 0
|
||||||
|
headers = headers or {}
|
||||||
|
headers["x-rpc-device_id"] = get_device_id(str(account_id))
|
||||||
|
headers["x-rpc-device_fp"] = hex_digest(headers["x-rpc-device_id"])[:13]
|
||||||
|
return headers
|
||||||
|
|
||||||
|
|
||||||
def hex_digest(text):
|
def hex_digest(text):
|
||||||
_md5 = hashlib.md5() # nosec B303
|
_md5 = hashlib.md5() # nosec B303
|
||||||
_md5.update(text.encode())
|
_md5.update(text.encode())
|
||||||
|
@ -55,13 +55,13 @@ class ChallengeSystem(Plugin):
|
|||||||
raise ChallengeSystemException("非法用户")
|
raise ChallengeSystemException("非法用户")
|
||||||
if need_verify:
|
if need_verify:
|
||||||
try:
|
try:
|
||||||
await client.get_genshin_notes()
|
await client.get_starrail_notes()
|
||||||
except GenshinException as exc:
|
except GenshinException as exc:
|
||||||
if exc.retcode != 1034:
|
if exc.retcode != 1034:
|
||||||
raise exc
|
raise exc
|
||||||
else:
|
else:
|
||||||
raise ChallengeSystemException("账户正常,无需验证")
|
raise ChallengeSystemException("账户正常,无需验证")
|
||||||
verify = Verify(cookies=client.cookie_manager.cookies)
|
verify = Verify(account_id=client.hoyolab_id, cookies=client.cookie_manager.cookies)
|
||||||
try:
|
try:
|
||||||
data = await verify.create()
|
data = await verify.create()
|
||||||
challenge = data["challenge"]
|
challenge = data["challenge"]
|
||||||
@ -91,7 +91,7 @@ class ChallengeSystem(Plugin):
|
|||||||
_, challenge = await self.get_challenge(client.uid)
|
_, challenge = await self.get_challenge(client.uid)
|
||||||
if challenge is None:
|
if challenge is None:
|
||||||
raise ChallengeSystemException("验证失效 请求已经过期")
|
raise ChallengeSystemException("验证失效 请求已经过期")
|
||||||
verify = Verify(cookies=client.cookie_manager.cookies)
|
verify = Verify(account_id=client.hoyolab_id, cookies=client.cookie_manager.cookies)
|
||||||
try:
|
try:
|
||||||
await verify.verify(challenge=challenge, validate=validate)
|
await verify.verify(challenge=challenge, validate=validate)
|
||||||
except ResponseException as exc:
|
except ResponseException as exc:
|
||||||
|
@ -148,6 +148,7 @@ class SignSystem(Plugin):
|
|||||||
gt = request_daily_reward.get("gt", "")
|
gt = request_daily_reward.get("gt", "")
|
||||||
challenge = request_daily_reward.get("challenge", "")
|
challenge = request_daily_reward.get("challenge", "")
|
||||||
logger.warning("UID[%s] 触发验证码\ngt[%s]\nchallenge[%s]", client.uid, gt, challenge)
|
logger.warning("UID[%s] 触发验证码\ngt[%s]\nchallenge[%s]", client.uid, gt, challenge)
|
||||||
|
self.verify.account_id = client.hoyolab_id
|
||||||
validate = await self.verify.ajax(
|
validate = await self.verify.ajax(
|
||||||
referer=RecognizeSystem.REFERER,
|
referer=RecognizeSystem.REFERER,
|
||||||
gt=gt,
|
gt=gt,
|
||||||
|
@ -4,7 +4,7 @@ from genshin import Client
|
|||||||
from genshin.client.routes import InternationalRoute # noqa F401
|
from genshin.client.routes import InternationalRoute # noqa F401
|
||||||
from genshin.utility import recognize_starrail_server
|
from genshin.utility import recognize_starrail_server
|
||||||
|
|
||||||
from modules.apihelper.utility.helpers import hex_digest, get_ds
|
from modules.apihelper.utility.helpers import hex_digest, get_ds, update_device_headers
|
||||||
|
|
||||||
AUTHKEY_API = "https://api-takumi.mihoyo.com/binding/api/genAuthKey"
|
AUTHKEY_API = "https://api-takumi.mihoyo.com/binding/api/genAuthKey"
|
||||||
HK4E_LOGIN_URL = InternationalRoute(
|
HK4E_LOGIN_URL = InternationalRoute(
|
||||||
@ -15,7 +15,6 @@ GACHA_HEADERS = {
|
|||||||
"User-Agent": "okhttp/4.8.0",
|
"User-Agent": "okhttp/4.8.0",
|
||||||
"x-rpc-sys_version": "12",
|
"x-rpc-sys_version": "12",
|
||||||
"x-rpc-channel": "mihoyo",
|
"x-rpc-channel": "mihoyo",
|
||||||
"x-rpc-device_id": "",
|
|
||||||
"x-rpc-device_name": "",
|
"x-rpc-device_name": "",
|
||||||
"x-rpc-device_model": "",
|
"x-rpc-device_model": "",
|
||||||
"Referer": "https://app.mihoyo.com",
|
"Referer": "https://app.mihoyo.com",
|
||||||
@ -37,8 +36,8 @@ async def get_authkey_by_stoken(client: Client) -> Optional[str]:
|
|||||||
"region": recognize_starrail_server(client.uid),
|
"region": recognize_starrail_server(client.uid),
|
||||||
}
|
}
|
||||||
device_id = hex_digest(str(client.uid))
|
device_id = hex_digest(str(client.uid))
|
||||||
headers["x-rpc-device_id"] = device_id
|
|
||||||
device = f"Paimon Build {device_id[:5]}"
|
device = f"Paimon Build {device_id[:5]}"
|
||||||
|
update_device_headers(client.hoyolab_id, headers)
|
||||||
headers["x-rpc-device_name"] = device
|
headers["x-rpc-device_name"] = device
|
||||||
headers["x-rpc-device_model"] = device
|
headers["x-rpc-device_model"] = device
|
||||||
app_version, client_type, ds_sign = get_ds()
|
app_version, client_type, ds_sign = get_ds()
|
||||||
|
@ -9,7 +9,8 @@ from genshin import constants, types, utility
|
|||||||
from genshin.client import routes
|
from genshin.client import routes
|
||||||
from genshin.utility import generate_dynamic_secret, ds
|
from genshin.utility import generate_dynamic_secret, ds
|
||||||
|
|
||||||
from modules.apihelper.utility.helpers import get_ds, get_ua, get_device_id, hex_digest
|
from modules.apihelper.utility.helpers import get_ds, get_ua, get_device_id, hex_digest, update_device_headers
|
||||||
|
from utils.log import logger
|
||||||
from utils.patch.methods import patch, patchable
|
from utils.patch.methods import patch, patchable
|
||||||
|
|
||||||
DEVICE_ID = get_device_id()
|
DEVICE_ID = get_device_id()
|
||||||
@ -108,7 +109,7 @@ class CalculatorClient:
|
|||||||
class BaseClient:
|
class BaseClient:
|
||||||
@patchable
|
@patchable
|
||||||
async def request_hoyolab(
|
async def request_hoyolab(
|
||||||
self,
|
self: "genshin.Client",
|
||||||
url: aiohttp.typedefs.StrOrURL,
|
url: aiohttp.typedefs.StrOrURL,
|
||||||
*,
|
*,
|
||||||
lang: typing.Optional[str] = None,
|
lang: typing.Optional[str] = None,
|
||||||
@ -151,11 +152,11 @@ class BaseClient:
|
|||||||
"User-Agent": ua,
|
"User-Agent": ua,
|
||||||
"X_Requested_With": "com.mihoyo.hoyolab",
|
"X_Requested_With": "com.mihoyo.hoyolab",
|
||||||
"Referer": "https://webstatic.mihoyo.com",
|
"Referer": "https://webstatic.mihoyo.com",
|
||||||
"x-rpc-device_id": get_device_id(device_id),
|
|
||||||
"x-rpc-app_version": app_version,
|
"x-rpc-app_version": app_version,
|
||||||
"x-rpc-client_type": client_type,
|
"x-rpc-client_type": client_type,
|
||||||
"ds": ds_sign,
|
"ds": ds_sign,
|
||||||
}
|
}
|
||||||
|
update_device_headers(self.hoyolab_id, headers)
|
||||||
else:
|
else:
|
||||||
raise TypeError(f"{region!r} is not a valid region.")
|
raise TypeError(f"{region!r} is not a valid region.")
|
||||||
|
|
||||||
@ -164,7 +165,7 @@ class BaseClient:
|
|||||||
|
|
||||||
@patchable
|
@patchable
|
||||||
async def request(
|
async def request(
|
||||||
self,
|
self: "genshin.Client",
|
||||||
url: aiohttp.typedefs.StrOrURL,
|
url: aiohttp.typedefs.StrOrURL,
|
||||||
*,
|
*,
|
||||||
method: typing.Optional[str] = None,
|
method: typing.Optional[str] = None,
|
||||||
@ -189,6 +190,8 @@ class BaseClient:
|
|||||||
|
|
||||||
headers = dict(headers or {})
|
headers = dict(headers or {})
|
||||||
headers.setdefault("User-Agent", self.USER_AGENT)
|
headers.setdefault("User-Agent", self.USER_AGENT)
|
||||||
|
update_device_headers(self.hoyolab_id, headers)
|
||||||
|
logger.debug("Account ID: %s Header: %s" % (self.hoyolab_id, headers))
|
||||||
|
|
||||||
if method is None:
|
if method is None:
|
||||||
method = "POST" if data else "GET"
|
method = "POST" if data else "GET"
|
||||||
@ -218,7 +221,7 @@ class BaseClient:
|
|||||||
|
|
||||||
@patchable
|
@patchable
|
||||||
async def request_bbs(
|
async def request_bbs(
|
||||||
self,
|
self: "genshin.Client",
|
||||||
url: aiohttp.typedefs.StrOrURL,
|
url: aiohttp.typedefs.StrOrURL,
|
||||||
*,
|
*,
|
||||||
lang: typing.Optional[str] = None,
|
lang: typing.Optional[str] = None,
|
||||||
@ -256,12 +259,12 @@ class BaseClient:
|
|||||||
add_headers = {
|
add_headers = {
|
||||||
"User-Agent": ua,
|
"User-Agent": ua,
|
||||||
"Referer": "https://www.miyoushe.com/ys/",
|
"Referer": "https://www.miyoushe.com/ys/",
|
||||||
"x-rpc-device_id": get_device_id(device_id),
|
|
||||||
"x-rpc-app_version": app_version,
|
"x-rpc-app_version": app_version,
|
||||||
"x-rpc-client_type": "4",
|
"x-rpc-client_type": "4",
|
||||||
"ds": ds_sign,
|
"ds": ds_sign,
|
||||||
}
|
}
|
||||||
headers.update(add_headers)
|
headers.update(add_headers)
|
||||||
|
update_device_headers(self.hoyolab_id, headers)
|
||||||
elif self.region == types.Region.OVERSEAS:
|
elif self.region == types.Region.OVERSEAS:
|
||||||
headers.update(ds.get_ds_headers(data=data, params=params, region=region, lang=lang or self.lang))
|
headers.update(ds.get_ds_headers(data=data, params=params, region=region, lang=lang or self.lang))
|
||||||
headers["Referer"] = str(routes.BBS_REFERER_URL.get_url(self.region))
|
headers["Referer"] = str(routes.BBS_REFERER_URL.get_url(self.region))
|
||||||
@ -276,7 +279,7 @@ class BaseClient:
|
|||||||
class DailyRewardClient:
|
class DailyRewardClient:
|
||||||
@patchable
|
@patchable
|
||||||
async def request_daily_reward(
|
async def request_daily_reward(
|
||||||
self,
|
self: "genshin.Client",
|
||||||
endpoint: str,
|
endpoint: str,
|
||||||
*,
|
*,
|
||||||
game: typing.Optional[types.Game] = None,
|
game: typing.Optional[types.Game] = None,
|
||||||
@ -331,7 +334,6 @@ class DailyRewardClient:
|
|||||||
"bbs_auth_required=true&act_id=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon"
|
"bbs_auth_required=true&act_id=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon"
|
||||||
)
|
)
|
||||||
headers["x-rpc-device_name"] = device
|
headers["x-rpc-device_name"] = device
|
||||||
headers["x-rpc-device_id"] = get_device_id(device_id)
|
|
||||||
headers["x-rpc-app_version"] = app_version
|
headers["x-rpc-app_version"] = app_version
|
||||||
headers["x-rpc-client_type"] = client_type
|
headers["x-rpc-client_type"] = client_type
|
||||||
headers["x-rpc-sys_version"] = "12"
|
headers["x-rpc-sys_version"] = "12"
|
||||||
@ -347,7 +349,7 @@ class DailyRewardClient:
|
|||||||
headers["x-rpc-challenge"] = challenge
|
headers["x-rpc-challenge"] = challenge
|
||||||
headers["x-rpc-validate"] = validate
|
headers["x-rpc-validate"] = validate
|
||||||
headers["x-rpc-seccode"] = f"{validate}|jordan"
|
headers["x-rpc-seccode"] = f"{validate}|jordan"
|
||||||
|
update_device_headers(self.hoyolab_id, headers)
|
||||||
else:
|
else:
|
||||||
raise TypeError(f"{self.region!r} is not a valid region.")
|
raise TypeError(f"{self.region!r} is not a valid region.")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user