From 0dd7f64434e0cdcf48c2d8276a5265091c011885 Mon Sep 17 00:00:00 2001 From: qwerdvd <105906879+qwerdvd@users.noreply.github.com> Date: Sat, 2 Sep 2023 11:00:36 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E8=B0=83=E6=95=B4=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArknightsUID/arknightsuid_signin/__init__.py | 1 - ArknightsUID/utils/api/skd/request.py | 131 ++++++++++--------- ArknightsUID/utils/error_reply.py | 16 +++ 3 files changed, 85 insertions(+), 63 deletions(-) create mode 100644 ArknightsUID/utils/error_reply.py diff --git a/ArknightsUID/arknightsuid_signin/__init__.py b/ArknightsUID/arknightsuid_signin/__init__.py index 8a7f652..861363d 100644 --- a/ArknightsUID/arknightsuid_signin/__init__.py +++ b/ArknightsUID/arknightsuid_signin/__init__.py @@ -15,7 +15,6 @@ from ..utils.database.models import ArknightsBind from .sign import daily_sign, sign_in SIGN_TIME = arkconfig.get_config('SignTime').data -UID_HINT = '添加失败, 请先绑定明日方舟UID' sv_sign = SV('森空岛签到') sv_sign_config = SV('森空岛管理', pm=2) diff --git a/ArknightsUID/utils/api/skd/request.py b/ArknightsUID/utils/api/skd/request.py index dce2a88..319f67f 100644 --- a/ArknightsUID/utils/api/skd/request.py +++ b/ArknightsUID/utils/api/skd/request.py @@ -13,7 +13,7 @@ from ...models.skland.models import ( ArknightsPlayerInfoModel, 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 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 _HEADER: ClassVar[dict[str, str]] = { 'Host': 'zonai.skland.com', + 'Platform': '1', 'Origin': 'https://www.skland.com', 'Referer': 'https://www.skland.com/', - 'content-type': 'application/json; charset=UTF-8', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ - AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36', + 'content-type': 'application/json', + 'user-agent': 'Skland/1.0.1 (com.hypergryph.skland; build:100001014; Android 33; ) Okhttp/4.11.0', } 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: cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') if cred is None: - return -61 + return -60 is_vaild = await self.check_cred_valid(cred) if isinstance(is_vaild, bool): await ArknightsUser.delete_user_data_by_uid(uid) @@ -62,6 +62,8 @@ class BaseArkApi: params={'uid': uid}, header=header, ) + if isinstance(raw_data, int): + return raw_data unpack_data = self.unpack(raw_data) if isinstance(unpack_data, int): return unpack_data @@ -71,7 +73,7 @@ class BaseArkApi: async def skd_sign(self, uid: str) -> int | ArknightsAttendanceModel: cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') if cred is None: - return -61 + return -60 is_vaild = await self.check_cred_valid(cred) if isinstance(is_vaild, bool): await ArknightsUser.delete_user_data_by_uid(uid) @@ -87,6 +89,8 @@ class BaseArkApi: }, header=header, ) + if isinstance(raw_data, int): + return raw_data unpack_data = self.unpack(raw_data) if isinstance(unpack_data, int): return unpack_data @@ -96,7 +100,7 @@ class BaseArkApi: async def get_sign_info(self, uid: str) -> int | ArknightsAttendanceCalendarModel: cred: str | None = await ArknightsUser.get_user_attr_by_uid(uid=uid, attr='cred') if cred is None: - return -61 + return -60 is_vaild = await self.check_cred_valid(cred) if isinstance(is_vaild, bool): await ArknightsUser.delete_user_data_by_uid(uid) @@ -112,6 +116,8 @@ class BaseArkApi: }, header=header, ) + if isinstance(raw_data, int): + return raw_data unpack_data = self.unpack(raw_data) if isinstance(unpack_data, int): return unpack_data @@ -125,18 +131,28 @@ class BaseArkApi: if isinstance(raw_data, int): return False if 'code' in raw_data and raw_data['code'] == 10001: + logger.info(f'cred is invalid {raw_data}') return False 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 else: - return msgspec.convert(unpack_data, type=ArknightsUserMeModel) + cred = raw_data['cred'] + return cred - def unpack(self, raw_data: dict | int) -> dict | int: - if isinstance(raw_data, dict): - return raw_data['data'] - else: - return raw_data + def unpack(self, raw_data: dict) -> dict: + return raw_data['data'] async def _ark_request( self, @@ -152,55 +168,46 @@ class BaseArkApi: ) as client: raw_data = {} if 'Cred' not in header: - target_user_id = ( - 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 + return 10001 - for _ in range(3): - async with client.request( - method, - url=url, - headers=header, - params=params, - json=data, - proxy=self.proxy_url if use_proxy else None, - timeout=300, - ) as resp: - try: - raw_data = await resp.json() - except ContentTypeError: - _raw_data = await resp.text() - raw_data = {'retcode': -999, 'data': _raw_data} + async with client.request( + method, + url=url, + headers=header, + params=params, + json=data, + proxy=self.proxy_url if use_proxy else None, + timeout=300, + ) as resp: + try: + raw_data = await resp.json() + except ContentTypeError: + _raw_data = await resp.text() + raw_data = {'code': -999, 'data': _raw_data} + logger.info(raw_data) + + # 判断code + if 'code' in raw_data and raw_data['code'] != 0: logger.info(raw_data) + return raw_data - # 判断status - if 'status' in raw_data and 'msg' in raw_data: - retcode = 1 - else: - retcode = 0 + # 判断status + if 'status' in raw_data and 'msg' in raw_data: + retcode = 1 + else: + retcode = 0 - if retcode == 1 and data: - vl, ch = await self._pass( - gt=raw_data['data']['captcha']['gt'], - ch=raw_data['data']['captcha']['challenge'] - ) - data['captcha'] = {} - data['captcha']['geetest_challenge'] = ch - data['captcha']['geetest_validate'] = vl - data['captcha']['geetest_seccode'] = f'{vl}|jordan' - elif retcode != 0: - return retcode - else: - return raw_data - return -999 + if retcode == 1 and data: + vl, ch = await self._pass( + gt=raw_data['data']['captcha']['gt'], + ch=raw_data['data']['captcha']['challenge'] + ) + data['captcha'] = {} + data['captcha']['geetest_challenge'] = ch + data['captcha']['geetest_validate'] = vl + data['captcha']['geetest_seccode'] = f'{vl}|jordan' + elif retcode != 0: + return retcode + else: + return raw_data + return 10001 diff --git a/ArknightsUID/utils/error_reply.py b/ArknightsUID/utils/error_reply.py new file mode 100644 index 0000000..5b17a10 --- /dev/null +++ b/ArknightsUID/utils/error_reply.py @@ -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}!' \ No newline at end of file