mirror of
https://github.com/Genshin-bots/gsuid_core.git
synced 2025-05-12 06:55:49 +08:00
✨ 支持mys设备登录
This commit is contained in:
parent
0e449457d9
commit
ce695745f6
@ -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"',
|
||||
|
@ -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('设备绑定成功!')
|
||||
|
@ -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'
|
||||
)
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user