From ce695745f64b198cf7b27b5a32101a9575027c3d Mon Sep 17 00:00:00 2001 From: KimigaiiWuyi <444835641@qq.com> Date: Fri, 10 Nov 2023 02:44:32 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81`mys=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=99=BB=E5=BD=95`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gsuid_core/core.py | 2 +- .../core_command/user_login/__init__.py | 52 +++++++++---------- gsuid_core/utils/api/mys/request.py | 29 +++++++---- gsuid_core/utils/database/base_models.py | 47 +++++++++++++---- gsuid_core/utils/database/models.py | 2 +- 5 files changed, 84 insertions(+), 48 deletions(-) diff --git a/gsuid_core/core.py b/gsuid_core/core.py index f574b9d..4c1ee3c 100644 --- a/gsuid_core/core.py +++ b/gsuid_core/core.py @@ -58,7 +58,7 @@ exec_list.extend( 'ALTER TABLE GsBind ADD COLUMN bbb_uid TEXT', 'ALTER TABLE GsBind ADD COLUMN zzz_uid TEXT', 'ALTER TABLE GsBind ADD COLUMN wd_uid TEXT', - 'ALTER TABLE GsUser ADD COLUMN OAID TEXT', + 'ALTER TABLE GsUser ADD COLUMN device_info TEXT', 'ALTER TABLE GsUser ADD COLUMN sr_sign_switch TEXT DEFAULT "off"', 'ALTER TABLE GsUser ADD COLUMN sr_push_switch TEXT DEFAULT "off"', 'ALTER TABLE GsUser ADD COLUMN draw_switch TEXT DEFAULT "off"', diff --git a/gsuid_core/plugins/core_command/user_login/__init__.py b/gsuid_core/plugins/core_command/user_login/__init__.py index 48944ee..98679d9 100644 --- a/gsuid_core/plugins/core_command/user_login/__init__.py +++ b/gsuid_core/plugins/core_command/user_login/__init__.py @@ -1,9 +1,11 @@ +import json +from typing import Dict + from gsuid_core.sv import SV from gsuid_core.bot import Bot from gsuid_core.models import Event from gsuid_core.utils.api.mys_api import mys_api -from gsuid_core.utils.database.api import get_uid -from gsuid_core.utils.database.models import GsBind, GsUser +from gsuid_core.utils.database.models import GsUser from gsuid_core.utils.cookie_manager.qrlogin import qrcode_login from gsuid_core.utils.cookie_manager.add_ck import ( deal_ck, @@ -49,35 +51,33 @@ async def send_add_ck_msg(bot: Bot, ev: Event): @sv_core_user_addck.on_prefix(('mys设备登录')) async def send_add_device_msg(bot: Bot, ev: Event): - # ev.text = device + model_name + device_type + board + oaid + device_info - # ev.text = diting + 220812C + OP11 + taro + 1f12fd + One/PHK110/OP11:13/ - data = ev.text.split('+') - uid = await get_uid(bot, ev, GsBind) - if len(data) != 6 or uid is None: - return await bot.send( - '登陆格式错误...\n请按照device + model_name + ' - 'device_type + board + oaid + device_info的方式输入' - ) + data: Dict[str, str] = json.loads(ev.text.strip()) + device_id = mys_api.get_device_id() seed_id, seed_time = mys_api.get_seed() - device, model_name, device_type, board, oaid, device_info = ( - data[0].strip(), - data[1].strip(), - data[2].strip(), - data[3].strip(), - data[4].strip(), - data[5].strip(), - ) fp = await mys_api.generate_fp( device_id, - model_name, - device, - device_type, - board, - oaid, - device_info, + data['deviceModel'], + data['deviceProduct'], + data['deviceName'], + data['deviceBoard'], + data['oaid'], + data['deviceFingerprint'], seed_id, seed_time, ) - await GsUser.update_data_by_xx({'uid': uid}, fp=fp, device_id=device_id) + await GsUser.update_data( + ev.user_id, + ev.bot_id, + fp=fp, + device_id=device_id, + device_info=data['deviceFingerprint'], + ) + user_list = await GsUser.select_data_list(ev.user_id, ev.bot_id) + if user_list: + for user in user_list: + if user.cookie: + await mys_api.device_login_and_save( + device_id, fp, data['deviceModel'], user.cookie + ) await bot.send('设备绑定成功!') diff --git a/gsuid_core/utils/api/mys/request.py b/gsuid_core/utils/api/mys/request.py index a5eedb5..9625305 100644 --- a/gsuid_core/utils/api/mys/request.py +++ b/gsuid_core/utils/api/mys/request.py @@ -220,7 +220,7 @@ class BaseMysApi: body = { "app_version": self.mysVersion, "device_id": device_id, - "device_name": f"XiaoMi{model_name}", + "device_name": f"{model_name}", "os_version": "33", "platform": "Android", "registration_id": self.generate_seed(19), @@ -229,7 +229,7 @@ class BaseMysApi: HEADER = copy.deepcopy(self._HEADER) HEADER['x-rpc-device_id'] = device_id HEADER['x-rpc-device_fp'] = device_fp - HEADER['x-rpc-device_name'] = f"XiaoMi{model_name}" + HEADER['x-rpc-device_name'] = f"{model_name}" HEADER['x-rpc-device_model'] = model_name HEADER['DS'] = generate_passport_ds('', body) HEADER['cookie'] = cookie @@ -372,11 +372,27 @@ class BaseMysApi: uid = None if params and 'role_id' in params: uid = params['role_id'] + elif data and 'role_id' in data: + uid = data['role_id'] + + if uid is not None: device_id = await self.get_user_device_id(uid) header['x-rpc-device_fp'] = await self.get_user_fp(uid) if device_id is not None: header['x-rpc-device_id'] = device_id + dfp: Optional[str] = await GsUser.get_user_attr_by_uid( + uid, 'device_info', 'sr' if self.is_sr else None + ) + if dfp is not None: + df = dfp.split('/') + header['User-Agent'] = ( + f"Mozilla/5.0 (Linux; Android 13; {df[1]} {df[3]}" + "; wv)AppleWebKit/537.36 (KHTML, like Gecko) " + "Version/4.0 Chrome/104.0.5112.97" + f"Mobile Safari/537.36 miHoYoBBS/2{mys_version}" + ) + logger.debug(header) for _ in range(2): async with client.request( @@ -407,15 +423,6 @@ class BaseMysApi: # 针对1034做特殊处理 if retcode == 1034 or retcode == 5003: if uid: - nd = await self.ck_in_new_device(uid) - ck = header['Cookie'] - if 'DEVICEFP_SEED_ID' not in ck and nd: - header['Cookie'] = ( - f'DEVICEFP_SEED_ID={nd[2]};' - f'DEVICEFP_SEED_TIME={nd[3]};' - f'{ck};DEVICE_FP={nd[0]}' - ) - header['x-rpc-challenge_game'] = ( '6' if self.is_sr else '2' ) diff --git a/gsuid_core/utils/database/base_models.py b/gsuid_core/utils/database/base_models.py index 8238e47..4f80559 100644 --- a/gsuid_core/utils/database/base_models.py +++ b/gsuid_core/utils/database/base_models.py @@ -287,11 +287,47 @@ class BaseModel(BaseBotIDModel): @classmethod @with_session - async def select_data( + async def select_data_list( cls: Type[T_BaseModel], session: AsyncSession, user_id: str, bot_id: Optional[str] = None, + ) -> Optional[List[T_BaseModel]]: + '''📝简单介绍: + + 基类的数据选择方法 + + 🌱参数: + + 🔹user_id (`str`): + 传入的用户id, 例如QQ号, 一般直接取`event.user_id` + + 🔹bot_id (`Optional[str]`, 默认是 `None`): + 传入的bot_id, 例如`onebot`, 一般直接取`event.bot_id` + + 🚀使用范例: + + `await GsUser.select_data(user_id='444888', bot_id='onebot')` + + ✅返回值: + + 🔸`Optional[List[T_BaseModel]]`: 选中符合条件的全部数据,不存在则为`None` + ''' + if bot_id is None: + sql = select(cls).where(cls.user_id == user_id) + else: + sql = select(cls).where( + cls.user_id == user_id, cls.bot_id == bot_id + ) + result = await session.execute(sql) + data = result.scalars().all() + return data if data else None + + @classmethod + async def select_data( + cls: Type[T_BaseModel], + user_id: str, + bot_id: Optional[str] = None, ) -> Optional[T_BaseModel]: '''📝简单介绍: @@ -313,14 +349,7 @@ class BaseModel(BaseBotIDModel): 🔸`Optional[T_BaseModel]`: 选中符合条件的第一个数据,不存在则为`None` ''' - if bot_id is None: - sql = select(cls).where(cls.user_id == user_id) - else: - sql = select(cls).where( - cls.user_id == user_id, cls.bot_id == bot_id - ) - result = await session.execute(sql) - data = result.scalars().all() + data = await cls.select_data_list(user_id, bot_id) return data[0] if data else None @classmethod diff --git a/gsuid_core/utils/database/models.py b/gsuid_core/utils/database/models.py index 9176437..90d1bdc 100644 --- a/gsuid_core/utils/database/models.py +++ b/gsuid_core/utils/database/models.py @@ -34,7 +34,7 @@ class GsUser(User, table=True): sr_sign_switch: str = Field(default='off', title='星铁自动签到') fp: Optional[str] = Field(default=None, title='Fingerprint') device_id: Optional[str] = Field(default=None, title='设备ID') - OAID: Optional[str] = Field(default=None, title='设备匿名标识符') + device_info: Optional[str] = Field(default=None, title='设备fp') class GsCache(Cache, table=True):