🎨 调整请求方式

This commit is contained in:
qwerdvd 2023-09-02 11:00:36 +08:00
parent 60e5d06a2d
commit 0dd7f64434
3 changed files with 85 additions and 63 deletions

View File

@ -15,7 +15,6 @@ from ..utils.database.models import ArknightsBind
from .sign import daily_sign, sign_in from .sign import daily_sign, sign_in
SIGN_TIME = arkconfig.get_config('SignTime').data SIGN_TIME = arkconfig.get_config('SignTime').data
UID_HINT = '添加失败, 请先绑定明日方舟UID'
sv_sign = SV('森空岛签到') sv_sign = SV('森空岛签到')
sv_sign_config = SV('森空岛管理', pm=2) sv_sign_config = SV('森空岛管理', pm=2)

View File

@ -13,7 +13,7 @@ from ...models.skland.models import (
ArknightsPlayerInfoModel, ArknightsPlayerInfoModel,
ArknightsUserMeModel, ArknightsUserMeModel,
) )
from .api import ARK_PLAYER_INFO, ARK_SKD_SIGN, ARK_USER_ME from .api import ARK_GEN_CRED_BY_CODE, ARK_PLAYER_INFO, ARK_SKD_SIGN, ARK_USER_ME
proxy_url = core_plugins_config.get_config('proxy').data proxy_url = core_plugins_config.get_config('proxy').data
ssl_verify = core_plugins_config.get_config('MhySSLVerify').data ssl_verify = core_plugins_config.get_config('MhySSLVerify').data
@ -23,11 +23,11 @@ class BaseArkApi:
proxy_url: str | None = proxy_url if proxy_url else None proxy_url: str | None = proxy_url if proxy_url else None
_HEADER: ClassVar[dict[str, str]] = { _HEADER: ClassVar[dict[str, str]] = {
'Host': 'zonai.skland.com', 'Host': 'zonai.skland.com',
'Platform': '1',
'Origin': 'https://www.skland.com', 'Origin': 'https://www.skland.com',
'Referer': 'https://www.skland.com/', 'Referer': 'https://www.skland.com/',
'content-type': 'application/json; charset=UTF-8', 'content-type': 'application/json',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ 'user-agent': 'Skland/1.0.1 (com.hypergryph.skland; build:100001014; Android 33; ) Okhttp/4.11.0',
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
} }
async def _pass(self, gt: str, ch: str) -> tuple[str | None, str | None]: async def _pass(self, gt: str, ch: str) -> tuple[str | None, str | None]:
@ -50,7 +50,7 @@ class BaseArkApi:
async def get_game_player_info(self, uid: str) -> int | ArknightsPlayerInfoModel: async def get_game_player_info(self, uid: str) -> int | ArknightsPlayerInfoModel:
cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred')
if cred is None: if cred is None:
return -61 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
if isinstance(is_vaild, bool): if isinstance(is_vaild, bool):
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
@ -62,6 +62,8 @@ class BaseArkApi:
params={'uid': uid}, params={'uid': uid},
header=header, header=header,
) )
if isinstance(raw_data, int):
return raw_data
unpack_data = self.unpack(raw_data) unpack_data = self.unpack(raw_data)
if isinstance(unpack_data, int): if isinstance(unpack_data, int):
return unpack_data return unpack_data
@ -71,7 +73,7 @@ class BaseArkApi:
async def skd_sign(self, uid: str) -> int | ArknightsAttendanceModel: async def skd_sign(self, uid: str) -> int | ArknightsAttendanceModel:
cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred')
if cred is None: if cred is None:
return -61 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
if isinstance(is_vaild, bool): if isinstance(is_vaild, bool):
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
@ -87,6 +89,8 @@ class BaseArkApi:
}, },
header=header, header=header,
) )
if isinstance(raw_data, int):
return raw_data
unpack_data = self.unpack(raw_data) unpack_data = self.unpack(raw_data)
if isinstance(unpack_data, int): if isinstance(unpack_data, int):
return unpack_data return unpack_data
@ -96,7 +100,7 @@ class BaseArkApi:
async def get_sign_info(self, uid: str) -> int | ArknightsAttendanceCalendarModel: async def get_sign_info(self, uid: str) -> int | ArknightsAttendanceCalendarModel:
cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred')
if cred is None: if cred is None:
return -61 return -60
is_vaild = await self.check_cred_valid(cred) is_vaild = await self.check_cred_valid(cred)
if isinstance(is_vaild, bool): if isinstance(is_vaild, bool):
await ArknightsUser.delete_user_data_by_uid(uid) await ArknightsUser.delete_user_data_by_uid(uid)
@ -112,6 +116,8 @@ class BaseArkApi:
}, },
header=header, header=header,
) )
if isinstance(raw_data, int):
return raw_data
unpack_data = self.unpack(raw_data) unpack_data = self.unpack(raw_data)
if isinstance(unpack_data, int): if isinstance(unpack_data, int):
return unpack_data return unpack_data
@ -125,18 +131,28 @@ class BaseArkApi:
if isinstance(raw_data, int): if isinstance(raw_data, int):
return False return False
if 'code' in raw_data and raw_data['code'] == 10001: if 'code' in raw_data and raw_data['code'] == 10001:
logger.info(f'cred is invalid {raw_data}')
return False return False
unpack_data = self.unpack(raw_data) unpack_data = self.unpack(raw_data)
if isinstance(unpack_data, int): return msgspec.convert(unpack_data, type=ArknightsUserMeModel)
async def check_code_valid(self, code: str) -> bool | str:
data = {
'kind': 1,
'code': code
}
raw_data = await self._ark_request(
ARK_GEN_CRED_BY_CODE,
data=data
)
if isinstance(raw_data, int):
return False return False
else: else:
return msgspec.convert(unpack_data, type=ArknightsUserMeModel) cred = raw_data['cred']
return cred
def unpack(self, raw_data: dict | int) -> dict | int: def unpack(self, raw_data: dict) -> dict:
if isinstance(raw_data, dict): return raw_data['data']
return raw_data['data']
else:
return raw_data
async def _ark_request( async def _ark_request(
self, self,
@ -152,55 +168,46 @@ class BaseArkApi:
) as client: ) as client:
raw_data = {} raw_data = {}
if 'Cred' not in header: if 'Cred' not in header:
target_user_id = ( return 10001
data['friendUserId']
if data and 'friendUserId' in data
else None
)
Cred: str | None = await ArknightsUser.get_random_cookie(
target_user_id if target_user_id else '18888888'
)
if Cred is None:
return -61
arkUser = await ArknightsUser.base_select_data(Cred=Cred)
if arkUser is None:
return -61
header['Cred'] = Cred
for _ in range(3): async with client.request(
async with client.request( method,
method, url=url,
url=url, headers=header,
headers=header, params=params,
params=params, json=data,
json=data, proxy=self.proxy_url if use_proxy else None,
proxy=self.proxy_url if use_proxy else None, timeout=300,
timeout=300, ) as resp:
) as resp: try:
try: raw_data = await resp.json()
raw_data = await resp.json() except ContentTypeError:
except ContentTypeError: _raw_data = await resp.text()
_raw_data = await resp.text() raw_data = {'code': -999, 'data': _raw_data}
raw_data = {'retcode': -999, 'data': _raw_data} logger.info(raw_data)
# 判断code
if 'code' in raw_data and raw_data['code'] != 0:
logger.info(raw_data) logger.info(raw_data)
return raw_data
# 判断status # 判断status
if 'status' in raw_data and 'msg' in raw_data: if 'status' in raw_data and 'msg' in raw_data:
retcode = 1 retcode = 1
else: else:
retcode = 0 retcode = 0
if retcode == 1 and data: if retcode == 1 and data:
vl, ch = await self._pass( vl, ch = await self._pass(
gt=raw_data['data']['captcha']['gt'], gt=raw_data['data']['captcha']['gt'],
ch=raw_data['data']['captcha']['challenge'] ch=raw_data['data']['captcha']['challenge']
) )
data['captcha'] = {} data['captcha'] = {}
data['captcha']['geetest_challenge'] = ch data['captcha']['geetest_challenge'] = ch
data['captcha']['geetest_validate'] = vl data['captcha']['geetest_validate'] = vl
data['captcha']['geetest_seccode'] = f'{vl}|jordan' data['captcha']['geetest_seccode'] = f'{vl}|jordan'
elif retcode != 0: elif retcode != 0:
return retcode return retcode
else: else:
return raw_data return raw_data
return -999 return 10001

View File

@ -0,0 +1,16 @@
UID_HINT = '添加失败, 请先绑定明日方舟UID'
def get_error(retcode: int | str) -> str:
if retcode == 10001:
return '请求体出错, 请检查具体实现代码...'
if retcode == -10001:
return '请求体出错, 请检查具体实现代码...'
if retcode == -201:
return '你的账号可能已被封禁, 请联系米游社客服...'
if retcode == -501101:
return '当前角色冒险等阶未达到10级, 暂时无法参加此活动...'
if retcode == 400:
return '[MINIGG]暂未找到此内容...'
if retcode == -400:
return '请输入更详细的名称...'
return f'API报错, 错误码为{retcode}!'