diff --git a/gsuid_core/core.py b/gsuid_core/core.py index f44ad3f..f574b9d 100644 --- a/gsuid_core/core.py +++ b/gsuid_core/core.py @@ -50,6 +50,15 @@ exec_list.extend( 'ALTER TABLE GsUser ADD COLUMN sr_region TEXT', 'ALTER TABLE GsUser ADD COLUMN fp TEXT', 'ALTER TABLE GsUser ADD COLUMN device_id TEXT', + 'ALTER TABLE GsUser ADD COLUMN bb_uid TEXT', + 'ALTER TABLE GsUser ADD COLUMN bbb_uid TEXT', + 'ALTER TABLE GsUser ADD COLUMN zzz_uid TEXT', + 'ALTER TABLE GsUser ADD COLUMN wd_uid TEXT', + 'ALTER TABLE GsBind ADD COLUMN bb_uid TEXT', + '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 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/utils/api/mys/request.py b/gsuid_core/utils/api/mys/request.py index 78e9922..14b3e9c 100644 --- a/gsuid_core/utils/api/mys/request.py +++ b/gsuid_core/utils/api/mys/request.py @@ -161,7 +161,7 @@ class BaseMysApi: self, uid: str, seed_id: str, seed_time: str, model_name: str ) -> str: device_id = await self.get_user_device_id(uid) - ext_fields = f'''{{\"cpuType\":\"arm64-v8a\",\"romCapacity\":\"512\",\"productName\":\"{model_name}\",\"romRemain\":\"422\",\"manufacturer\":\"XiaoMi\",\"appMemory\":\"512\",\"hostname\":\"dg02-pool03-kvm87\",\"screenSize\":\"1240x2662\",\"osVersion\":\"13\",\"aaid\":\"{self.generate_ID()}\",\"vendor\":\"中国联通\",\"accelerometer\":\"1.4883357x7.1712894x6.2847486\",\"buildTags\":\"release-keys\",\"model\":\"{model_name}\",\"brand\":\"XiaoMi\",\"oaid\":\"6C47BC55BBC443F49B603129AFCD621E6f70bfc8a663a364e224fe59c248b471\",\"hardware\":\"qcom\",\"deviceType\":\"OP5913L1\",\"devId\":\"REL\",\"serialNumber\":\"unknown\",\"buildTime\":\"1687848011000\",\"buildUser\":\"root\",\"ramCapacity\":\"469679\",\"magnetometer\":\"20.081251x-27.487501x2.1937501\",\"display\":\"{model_name}_13.1.0.181(CN01)\",\"ramRemain\":\"215344\",\"deviceInfo\":\"XiaoMi\\\/{model_name}\\\/OP5913L1:13\\\/SKQ1.221119.001\\\/T.118e6c7-5aa23-73911:user\\\/release-keys\",\"gyroscope\":\"0.030226856x0.014647375x0.010652636\",\"vaid\":\"{self.generate_ID()}\",\"buildType\":\"user\",\"sdkVersion\":\"33\",\"board\":\"taro\"}}''' # noqa + ext_fields = f'''{{\"cpuType\":\"arm64-v8a\",\"romCapacity\":\"512\",\"productName\":\"{model_name}\",\"romRemain\":\"422\",\"manufacturer\":\"XiaoMi\",\"appMemory\":\"512\",\"hostname\":\"dg02-pool03-kvm87\",\"screenSize\":\"1240x2662\",\"osVersion\":\"13\",\"aaid\":\"{self.generate_ID()}\",\"vendor\":\"中国联通\",\"accelerometer\":\"1.4883357x7.1712894x6.2847486\",\"buildTags\":\"release-keys\",\"model\":\"{model_name}\",\"brand\":\"XiaoMi\",\"oaid\":\"DD8D6ADFC74F4725BBD548BF23D708E46f70bfc8a663a364da14b74c490eb0c5\",\"hardware\":\"qcom\",\"deviceType\":\"OP5913L1\",\"devId\":\"REL\",\"serialNumber\":\"unknown\",\"buildTime\":\"1687848011000\",\"buildUser\":\"root\",\"ramCapacity\":\"469679\",\"magnetometer\":\"20.081251x-27.487501x2.1937501\",\"display\":\"{model_name}_13.1.0.181(CN01)\",\"ramRemain\":\"215344\",\"deviceInfo\":\"XiaoMi\\\/{model_name}\\\/OP5913L1:13\\\/SKQ1.221119.001\\\/T.118e6c7-5aa23-73911:user\\\/release-keys\",\"gyroscope\":\"0.030226856x0.014647375x0.010652636\",\"vaid\":\"{self.generate_ID()}\",\"buildType\":\"user\",\"sdkVersion\":\"33\",\"board\":\"taro\"}}''' # noqa body = { 'device_id': self.generate_seed(16), 'seed_id': seed_id, # uuid4 diff --git a/gsuid_core/utils/cookie_manager/add_ck.py b/gsuid_core/utils/cookie_manager/add_ck.py index a42fcbe..2d37e16 100644 --- a/gsuid_core/utils/cookie_manager/add_ck.py +++ b/gsuid_core/utils/cookie_manager/add_ck.py @@ -116,7 +116,9 @@ async def _deal_ck(bot_id: str, mes: str, user_id: str) -> str: simp_dict = SimpleCookie(mes) uid = await GsBind.get_uid_by_game(user_id, bot_id) sr_uid = await GsBind.get_uid_by_game(user_id, bot_id, 'sr') - uid_bind = sr_uid_bind = None + + uid_bind = sr_uid_bind = zzz_uid_bind = None + wd_uid_bind = bb_uid_bind = bbb_uid_bind = None if uid is None and sr_uid is None: if uid is None: @@ -214,11 +216,24 @@ async def _deal_ck(bot_id: str, mes: str, user_id: str) -> str: uid_bind = i['game_role_id'] elif i['game_id'] == 6: sr_uid_bind = i['game_role_id'] - if uid_bind and sr_uid_bind: - break + elif i['game_id'] == 8: + zzz_uid_bind = i['game_role_id'] + elif i['game_id'] == 4: + wd_uid_bind = i['game_role_id'] + elif i['game_id'] == 3: + bb_uid_bind = i['game_role_id'] + elif i['game_id'] == 1: + bbb_uid_bind = i['game_role_id'] else: - if not (uid_bind or sr_uid_bind): - return f'你的米游社账号{account_id}尚未绑定原神/星铁账号,请前往米游社操作!' + if not ( + uid_bind + or sr_uid_bind + or zzz_uid_bind + or wd_uid_bind + or bb_uid_bind + or bbb_uid_bind + ): + return f'你的米游社账号{account_id}尚未绑定游戏账号,请前往米游社操作!' except Exception: pass @@ -235,28 +250,21 @@ async def _deal_ck(bot_id: str, mes: str, user_id: str) -> str: nd = await mys_api.ck_in_new_device(uid, app_cookie) - # 往数据库添加内容 - if uid_bind and await GsUser.user_exists(uid_bind): - await GsUser.update_data_by_uid( - uid_bind, - bot_id, + if await GsUser.data_exist(mys_id=account_id): + await GsUser.update_data_by_xx( + {'mys_id': account_id}, + bot_id=bot_id, cookie=account_cookie, status=None, stoken=app_cookie, sr_uid=sr_uid_bind, + bb_uid=bb_uid_bind, + bbb_uid=bbb_uid_bind, + zzz_uid=zzz_uid_bind, + wd_uid=wd_uid_bind, fp=nd[0], device_id=nd[1], - ) - elif sr_uid_bind and await GsUser.user_exists(sr_uid_bind, 'sr'): - await GsUser.update_data_by_uid( - sr_uid_bind, - bot_id, - 'sr', - cookie=account_cookie, - status=None, - stoken=app_cookie, - fp=nd[0], - device_id=nd[1], + OAID=None, ) else: await GsUser.insert_data( @@ -264,6 +272,10 @@ async def _deal_ck(bot_id: str, mes: str, user_id: str) -> str: bot_id=bot_id, uid=uid_bind, sr_uid=sr_uid_bind, + bb_uid=bb_uid_bind, + bbb_uid=bbb_uid_bind, + zzz_uid=zzz_uid_bind, + wd_uid=wd_uid_bind, mys_id=account_id, cookie=account_cookie, stoken=app_cookie if app_cookie else None, @@ -279,6 +291,7 @@ async def _deal_ck(bot_id: str, mes: str, user_id: str) -> str: device_id=nd[1], sr_push_switch='off', sr_sign_switch='off', + OAID=None, ) im_list.append( diff --git a/gsuid_core/utils/cookie_manager/qrlogin.py b/gsuid_core/utils/cookie_manager/qrlogin.py index 65ef5a0..1790525 100644 --- a/gsuid_core/utils/cookie_manager/qrlogin.py +++ b/gsuid_core/utils/cookie_manager/qrlogin.py @@ -4,7 +4,7 @@ import base64 import asyncio from pathlib import Path from http.cookies import SimpleCookie -from typing import Any, List, Tuple, Union, Literal +from typing import Any, Tuple, Union, Literal import qrcode import aiofiles @@ -16,7 +16,6 @@ from gsuid_core.models import Event from gsuid_core.logger import logger from gsuid_core.segment import MessageSegment from gsuid_core.utils.api.mys_api import mys_api -from gsuid_core.utils.database.models import GsBind async def get_qrcode_base64(url: str, path: Path, bot_id: str) -> bytes: @@ -132,61 +131,20 @@ async def qrcode_login(bot: Bot, ev: Event, user_id: str) -> str: if isinstance(ck, int): return await send_msg('[登录]获取CK失败...') ck = ck['cookie_token'] - cookie_check = f'account_id={account_id};cookie_token={ck}' - get_uid = await mys_api.get_mihoyo_bbs_info(account_id, cookie_check) - # 剔除除了原神/星铁之外的其他游戏 - im = None - uid_check = sruid_check = None - if isinstance(get_uid, List): - for i in get_uid: - if i['game_id'] == 2: - uid_check = i['game_role_id'] - elif i['game_id'] == 6: - sruid_check = i['game_role_id'] - else: - if uid_check or sruid_check: - pass - else: - im = f'[登录]你的米游社账号{account_id}尚未绑定原神账号,请前往米游社操作!' - return await send_msg(im) - else: - im = '[登录]请求失败, 请稍后再试...' - return await send_msg(im) - uid_bind_list = ( - await GsBind.get_uid_list_by_game(user_id, ev.bot_id) or [] - ) - sruid_bind_list = ( - await GsBind.get_uid_list_by_game(user_id, ev.bot_id, 'sr') or [] - ) - # 没有在gsuid绑定uid的情况 - if not (uid_bind_list or sruid_bind_list): - logger.warning('[登录]game_token获取失败') - im = '你还没有绑定uid, 请输入[绑定uid123456]绑定你的uid, 再发送[扫码登录]进行绑定' - return await send_msg(im) if isinstance(cookie_token, int): return await send_msg('[登录]获取CK失败...') - # 比对gsuid数据库和扫码登陆获取到的uid - if ( - uid_check in uid_bind_list - or sruid_check in sruid_bind_list - or account_id in uid_bind_list - ): - return SimpleCookie( - { - 'stoken_v2': stoken_data['token']['token'], - 'stuid': stoken_data['user_info']['aid'], - 'mid': stoken_data['user_info']['mid'], - 'cookie_token': cookie_token['cookie_token'], - } - ).output(header='', sep=';') - else: - logger.warning('[登录]game_token获取失败') - im = ( - f'检测到扫码登录UID{uid_check}与绑定UID不同, ' - 'gametoken获取失败, 请重新发送[扫码登录]进行登录!' - ) + + return SimpleCookie( + { + 'stoken_v2': stoken_data['token']['token'], + 'stuid': stoken_data['user_info']['aid'], + 'mid': stoken_data['user_info']['mid'], + 'cookie_token': cookie_token['cookie_token'], + } + ).output(header='', sep=';') else: logger.warning('[登录]game_token获取失败') im = '[登录]game_token获取失败: 二维码已过期' + return await send_msg(im) diff --git a/gsuid_core/utils/database/base_models.py b/gsuid_core/utils/database/base_models.py index 81be7c5..8238e47 100644 --- a/gsuid_core/utils/database/base_models.py +++ b/gsuid_core/utils/database/base_models.py @@ -185,6 +185,45 @@ class BaseBotIDModel(BaseIDModel): return 0 return -1 + @classmethod + @with_session + async def update_data_by_xx( + cls, + session: AsyncSession, + by: Dict[str, Any], + **data, + ) -> int: + '''📝简单介绍: + + 基类方法,通过传入`by`和`**data`查找并更新数据 + + 🌱参数: + + 🔹by (`Dict[str, Any]`) + 根据该入参寻找相应数据 + + 🔹**data + 根据该入参修改数据 + + 🚀使用范例: + + `await GsUser.update_data_by_xx({'uid': '233'}, cookie=ck)` + + ✅返回值: + + 🔸`int`: 成功为`0`, 失败为`-1` + ''' + sql = update(cls) + for i in by: + sql = sql.where(getattr(cls, i) == by[i]) + if data is not None: + query = sql.values(**data) + query.execution_options(synchronize_session='fetch') + await session.execute(query) + await session.commit() + return 0 + return -1 + @classmethod @with_session async def update_data_by_uid( diff --git a/gsuid_core/utils/database/models.py b/gsuid_core/utils/database/models.py index 000c03d..9176437 100644 --- a/gsuid_core/utils/database/models.py +++ b/gsuid_core/utils/database/models.py @@ -10,6 +10,10 @@ class GsBind(Bind, table=True): uid: Optional[str] = Field(default=None, title='原神UID') sr_uid: Optional[str] = Field(default=None, title='星铁UID') + bb_uid: Optional[str] = Field(default=None, title='崩坏二UID') + bbb_uid: Optional[str] = Field(default=None, title='崩坏三UID') + zzz_uid: Optional[str] = Field(default=None, title='绝区零UID') + wd_uid: Optional[str] = Field(default=None, title='未定UID') mys_id: Optional[str] = Field(default=None, title='米游社通行证') @@ -17,6 +21,10 @@ class GsUser(User, table=True): __table_args__ = {'extend_existing': True} uid: Optional[str] = Field(default=None, title='原神UID') sr_uid: Optional[str] = Field(default=None, title='星铁UID') + bb_uid: Optional[str] = Field(default=None, title='崩坏二UID') + bbb_uid: Optional[str] = Field(default=None, title='崩坏三UID') + zzz_uid: Optional[str] = Field(default=None, title='绝区零UID') + wd_uid: Optional[str] = Field(default=None, title='未定UID') mys_id: Optional[str] = Field(default=None, title='米游社通行证') region: Optional[str] = Field(default=None, title='原神地区') sr_region: Optional[str] = Field(default=None, title='星铁地区') @@ -26,6 +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='设备匿名标识符') class GsCache(Cache, table=True):