From 019a96839797eef978ba40272f4c571db3f4ce22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wuyi=E6=97=A0=E7=96=91?= <444835641@qq.com> Date: Sun, 26 Mar 2023 16:51:56 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=96=B0=E5=A2=9E`=E7=95=99?= =?UTF-8?q?=E5=BD=B1=E5=8F=99=E4=BD=B3=E6=9C=9F`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenshinUID/genshinuid_postdraw/__init__.py | 19 ++++++ GenshinUID/genshinuid_postdraw/get_draw.py | 35 ++++++++++ GenshinUID/gsuid_utils/api/mys/api.py | 6 ++ GenshinUID/gsuid_utils/api/mys/models.py | 61 +++++++++++++++++ GenshinUID/gsuid_utils/api/mys/request.py | 77 ++++++++++++++++++++++ GenshinUID/utils/error_reply.py | 6 +- 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 GenshinUID/genshinuid_postdraw/__init__.py create mode 100644 GenshinUID/genshinuid_postdraw/get_draw.py diff --git a/GenshinUID/genshinuid_postdraw/__init__.py b/GenshinUID/genshinuid_postdraw/__init__.py new file mode 100644 index 00000000..b161eb22 --- /dev/null +++ b/GenshinUID/genshinuid_postdraw/__init__.py @@ -0,0 +1,19 @@ +from gsuid_core.sv import SV +from gsuid_core.bot import Bot +from gsuid_core.models import Event + +from .get_draw import post_my_draw +from ..utils.database import get_sqla +from ..utils.error_reply import UID_HINT + +sv_post_my_draw = SV('留影叙佳期') + + +# 群聊内 每月统计 功能 +@sv_post_my_draw.on_fullmatch(('留影叙佳期')) +async def send_postdraw_data(bot: Bot, ev: Event): + sqla = get_sqla(ev.bot_id) + uid = await sqla.get_bind_uid(ev.user_id) + if uid is None: + return UID_HINT + await bot.send(await post_my_draw(uid)) diff --git a/GenshinUID/genshinuid_postdraw/get_draw.py b/GenshinUID/genshinuid_postdraw/get_draw.py new file mode 100644 index 00000000..b54b2207 --- /dev/null +++ b/GenshinUID/genshinuid_postdraw/get_draw.py @@ -0,0 +1,35 @@ +from ..utils.mys_api import mys_api +from ..utils.error_reply import get_error + + +async def post_my_draw(uid) -> str: + bs_index = await mys_api.get_bs_index(uid) + calendar = await mys_api.get_draw_calendar(uid) + + # 错误检查 + if isinstance(bs_index, int): + return get_error(bs_index) + if isinstance(calendar, int): + return get_error(calendar) + + im_list = [] + + for role in bs_index['role']: + if not role['is_partake']: + data = await mys_api.post_draw(uid, role['role_id']) + if isinstance(data, int): + im_list.append(get_error(data)) + else: + retcode = data['retcode'] + if retcode != 0: + message = ( + data['message'] + if 'message' in data + else f'错误码{retcode}' + ) + im_list.append(message) + else: + im_list.append(f'UID{uid}成功获取{role["name"]}的画片!') + if im_list == []: + im_list.append(f'UID{uid}没有需要获取的画片了~') + return '\n'.join(im_list) diff --git a/GenshinUID/gsuid_utils/api/mys/api.py b/GenshinUID/gsuid_utils/api/mys/api.py index fb9cfdea..e8598e02 100644 --- a/GenshinUID/gsuid_utils/api/mys/api.py +++ b/GenshinUID/gsuid_utils/api/mys/api.py @@ -128,4 +128,10 @@ CreateOrderurl = f'{HK4_SDK_URL}/hk4e_cn/mdk/atropos/api/createOrder' CheckOrderurl = f'{HK4_SDK_URL}/hk4e_cn/mdk/atropos/api/checkOrder' PriceTierurl = f'{HK4_SDK_URL}/hk4e_cn/mdk/shopwindow/shopwindow/listPriceTier' +# 留影叙佳期 +DRAW_BASE_URL = f'{HK4_URL}/event/birthdaystar/account' +CALENDAR_URL = f'{DRAW_BASE_URL}/calendar' +RECEIVE_URL = f'{DRAW_BASE_URL}/post_my_draw' +BS_INDEX_URL = f'{DRAW_BASE_URL}/index' + _API = locals() diff --git a/GenshinUID/gsuid_utils/api/mys/models.py b/GenshinUID/gsuid_utils/api/mys/models.py index ac69899e..d841e649 100644 --- a/GenshinUID/gsuid_utils/api/mys/models.py +++ b/GenshinUID/gsuid_utils/api/mys/models.py @@ -717,3 +717,64 @@ class GcgAction(TypedDict): rank_id: int deck_recommend: str card_wiki: str + + +# 留影叙佳期 +class GsRoleBirthDay(TypedDict): + role_id: int + name: str + jump_tpye: str + jump_target: str + jump_start_time: str + jump_end_time: str + role_gender: int + take_picture: str + gal_xml: str + gal_resource: str + is_partake: bool + bgm: str + + +class BsIndex(TypedDict): + nick_name: str + uid: int + region: str + role: List[GsRoleBirthDay] + draw_notice: bool + CurrentTime: str + gender: int + is_show_remind: bool + + +class RolesCalendar(TypedDict): + calendar_role_infos: MonthlyRoleCalendar + is_pre: bool + is_next: bool + is_year_subscribe: bool + + +class RoleCalendar(TypedDict): + role_id: int + name: str + role_birthday: str + head_icon: str + is_subscribe: bool + + +MonthlyRoleCalendar = TypedDict( + 'MonthlyRoleCalendar', + { + '1': List[RoleCalendar], + '2': List[RoleCalendar], + '3': List[RoleCalendar], + '4': List[RoleCalendar], + '5': List[RoleCalendar], + '6': List[RoleCalendar], + '7': List[RoleCalendar], + '8': List[RoleCalendar], + '9': List[RoleCalendar], + '10': List[RoleCalendar], + '11': List[RoleCalendar], + '12': List[RoleCalendar], + }, +) diff --git a/GenshinUID/gsuid_utils/api/mys/request.py b/GenshinUID/gsuid_utils/api/mys/request.py index 8ffcd6d2..3cd620c7 100644 --- a/GenshinUID/gsuid_utils/api/mys/request.py +++ b/GenshinUID/gsuid_utils/api/mys/request.py @@ -24,6 +24,7 @@ from .tools import ( generate_passport_ds, ) from .models import ( + BsIndex, GcgInfo, MysGame, MysSign, @@ -43,6 +44,7 @@ from .models import ( DailyNoteData, GameTokenInfo, MysOrderCheck, + RolesCalendar, CharDetailData, CookieTokenInfo, LoginTicketInfo, @@ -312,6 +314,81 @@ class MysApi: data = cast(MonthlyAward, data['data']) return data + async def get_draw_calendar(self, uid: str) -> Union[int, RolesCalendar]: + server_id = RECOGNIZE_SERVER.get(uid[0]) + ck = await self.get_ck(uid, 'OWNER') + if ck is None: + return -51 + hk4e_token = await self.get_hk4e_token(uid) + header = {} + header['Cookie'] = f'{ck};{hk4e_token}' + params = { + 'lang': 'zh-cn', + 'badge_uid': uid, + 'badge_region': server_id, + 'game_biz': 'hk4e_cn', + 'activity_id': 20220301153521, + 'year': 2023, + } + data = await self._mys_request( + _API['CALENDAR_URL'], 'GET', header, params + ) + if isinstance(data, Dict): + return cast(RolesCalendar, data['data']) + return data + + async def get_bs_index(self, uid: str) -> Union[int, BsIndex]: + server_id = RECOGNIZE_SERVER.get(uid[0]) + ck = await self.get_ck(uid, 'OWNER') + if ck is None: + return -51 + hk4e_token = await self.get_hk4e_token(uid) + header = {} + header['Cookie'] = f'{ck};{hk4e_token}' + data = await self._mys_request( + _API['BS_INDEX_URL'], + 'GET', + header, + { + 'lang': 'zh-cn', + 'badge_uid': uid, + 'badge_region': server_id, + 'game_biz': 'hk4e_cn', + 'activity_id': 20220301153521, + }, + ) + if isinstance(data, Dict): + return cast(BsIndex, data['data']) + return data + + async def post_draw(self, uid: str, role_id: int) -> Union[int, Dict]: + server_id = RECOGNIZE_SERVER.get(uid[0]) + ck = await self.get_ck(uid, 'OWNER') + if ck is None: + return -51 + hk4e_token = await self.get_hk4e_token(uid) + header = {} + header['Cookie'] = f'{ck};{hk4e_token}' + data = await self._mys_request( + _API['RECEIVE_URL'], + 'POST', + header, + { + 'lang': 'zh-cn', + 'badge_uid': uid, + 'badge_region': server_id, + 'game_biz': 'hk4e_cn', + 'activity_id': 20220301153521, + }, + {'role_id': role_id}, + ) + if isinstance(data, Dict): + return data + elif data == -512009: + return {'data': None, 'message': '这张画片已经被收录啦~', 'retcode': -512009} + else: + return -999 + async def get_spiral_abyss_info( self, uid: str, schedule_type='1', ck: Optional[str] = None ) -> Union[AbyssData, int]: diff --git a/GenshinUID/utils/error_reply.py b/GenshinUID/utils/error_reply.py index 2354e7f1..5665063d 100644 --- a/GenshinUID/utils/error_reply.py +++ b/GenshinUID/utils/error_reply.py @@ -21,7 +21,9 @@ UPDATE_HINT = '''更新失败!更多错误信息请查看控制台... def get_error(retcode: Union[int, str]) -> str: if retcode == -51: return CK_HINT - if retcode == 10001: + elif retcode == -100: + return '您的cookie已经失效, 请重新获取!' + elif retcode == 10001: return '您的cookie已经失效, 请重新获取!' elif retcode == 10101: return '当前查询CK已超过每日30次上限!' @@ -33,6 +35,8 @@ def get_error(retcode: Union[int, str]) -> str: return '请求体出错, 请检查具体实现代码...' elif retcode == 10104: return CK_HINT + elif retcode == -512009: + return '已经获取过该内容~!' elif retcode == -201: return '你的账号可能已被封禁, 请联系米游社客服...' else: