添加enka备用api

This commit is contained in:
CMHopeSunshine 2023-02-21 20:06:03 +08:00
parent 33c5fbd2da
commit d73ec76dfc
5 changed files with 609 additions and 367 deletions

View File

@ -21,41 +21,62 @@ __plugin_meta__ = PluginMetadata(
'author': '惜月',
'version': '3.0',
'priority': 11,
'configs': {
'签到开始小时': 0,
'签到开始分钟': 5,
'米游币开始小时': 0,
'米游币开始分钟': 30
}
}
'configs': {'签到开始小时': 0, '签到开始分钟': 5, '米游币开始小时': 0, '米游币开始分钟': 30},
},
)
sign = on_command('mys签到', aliases={'米游社签到', 'mys自动签到', '米游社自动签到'}, priority=8, block=True, state={
sign = on_command(
'mys签到',
aliases={'米游社签到', 'mys自动签到', '米游社自动签到'},
priority=8,
block=True,
state={
'pm_name': '米游社签到',
'pm_description': '*执行米游社签到操作,或开启每日自动签到',
'pm_usage': '米游社签到(uid)[on|off]',
'pm_priority': 1
})
all_sign = on_command('全部重签', priority=8, block=True, permission=SUPERUSER, rule=to_me(), state={
'pm_priority': 1,
},
)
all_sign = on_command(
'全部重签',
priority=8,
block=True,
permission=SUPERUSER,
rule=to_me(),
state={
'pm_name': '米游社全部重签',
'pm_description': '重签全部米游社签到任务,需超级用户权限',
'pm_usage': '@Bot 全部重签',
'pm_priority': 3
})
'pm_priority': 3,
},
)
get_coin = on_command('myb获取', aliases={'米游币获取', 'myb自动获取', '米游币自动获取', '米游币任务'}, priority=8, block=True, state={
get_coin = on_command(
'myb获取',
aliases={'米游币获取', 'myb自动获取', '米游币自动获取', '米游币任务'},
priority=8,
block=True,
state={
'pm_name': '米游币获取',
'pm_description': '*执行米游币任务操作,或开启每日自动获取米游币',
'pm_usage': '米游币获取(uid)[on|off]',
'pm_priority': 2
})
'pm_priority': 2,
},
)
all_coin = on_command('myb全部重做', priority=8, block=True, permission=SUPERUSER, rule=to_me(), state={
all_coin = on_command(
'myb全部重做',
priority=8,
block=True,
permission=SUPERUSER,
rule=to_me(),
state={
'pm_name': '米游币获取全部重做',
'pm_description': '重做全部米游币获取任务,需超级用户权限',
'pm_usage': '@Bot myb全部重做',
'pm_priority': 4
})
'pm_priority': 4,
},
)
signing_list = []
@ -63,30 +84,44 @@ coin_getting_list = []
@sign.handle()
async def _(event: Union[GroupMessageEvent, PrivateMessageEvent], uid=CommandUID(), switch=CommandSwitch()):
async def _(
event: Union[GroupMessageEvent, PrivateMessageEvent],
uid=CommandUID(),
switch=CommandSwitch(),
):
if switch is None:
# 没有开关参数,手动执行米游社签到
if f'{event.user_id}-{uid}' in signing_list:
await sign.finish('你已经在执行签到任务中,请勿重复发送', at_sender=True)
else:
await sign.send(f'开始为UID{uid}执行米游社签到,请稍等...', at_sender=True)
logger.info('米游社原神签到', '', {'user_id': event.user_id, 'uid': uid, '执行签到': ''})
logger.info(
'米游社原神签到', '', {'user_id': event.user_id, 'uid': uid, '执行签到': ''}
)
signing_list.append(f'{event.user_id}-{uid}')
try:
_, result = await mhy_bbs_sign(str(event.user_id), uid)
except Exception as e:
result = f'UID{uid}签到失败,报错信息:{str(e)}'
finally:
signing_list.remove(f'{event.user_id}-{uid}')
await sign.finish(result, at_sender=True)
else:
sub_data = {
'user_id': event.user_id,
'uid': uid,
'sub_event': '米游社原神签到'
}
sub_data = {'user_id': event.user_id, 'uid': uid, 'sub_event': '米游社原神签到'}
if switch:
# switch为开启则添加订阅
if await PrivateCookie.get_or_none(user_id=str(event.user_id), uid=uid):
await MihoyoBBSSub.update_or_create(**sub_data, defaults={
'group_id': event.group_id if isinstance(event, GroupMessageEvent) else event.user_id})
logger.info('米游社原神签到', '', {'user_id': event.user_id, 'uid': uid}, '开启成功', True)
await MihoyoBBSSub.update_or_create(
**sub_data,
defaults={
'group_id': event.group_id
if isinstance(event, GroupMessageEvent)
else event.user_id
},
)
logger.info(
'米游社原神签到', '', {'user_id': event.user_id, 'uid': uid}, '开启成功', True
)
await sign.finish(f'UID{uid}开启米游社原神自动签到成功', at_sender=True)
else:
await sign.finish(f'UID{uid}尚未绑定Cookie请先使用ysb指令绑定吧', at_sender=True)
@ -94,7 +129,9 @@ async def _(event: Union[GroupMessageEvent, PrivateMessageEvent], uid=CommandUID
# switch为关闭则取消订阅
if sub := await MihoyoBBSSub.get_or_none(**sub_data):
await sub.delete()
logger.info('米游社原神签到', '', {'user_id': event.user_id, 'uid': uid}, '关闭成功', True)
logger.info(
'米游社原神签到', '', {'user_id': event.user_id, 'uid': uid}, '关闭成功', True
)
await sign.finish(f'UID{uid}关闭米游社原神自动签到成功', at_sender=True)
else:
await sign.finish(f'UID{uid}尚未开启米游社原神自动签到,无需关闭!', at_sender=True)
@ -107,38 +144,61 @@ async def _(event: Union[GroupMessageEvent, PrivateMessageEvent]):
@get_coin.handle()
async def _(event: Union[GroupMessageEvent, PrivateMessageEvent], uid=CommandUID(), switch=CommandSwitch()):
async def _(
event: Union[GroupMessageEvent, PrivateMessageEvent],
uid=CommandUID(),
switch=CommandSwitch(),
):
if switch is None:
# 没有开关参数,手动执行米游币获取
if f'{event.user_id}-{uid}' in coin_getting_list:
await get_coin.finish('你已经在执行米游币获取任务中,请勿重复发送', at_sender=True)
else:
await get_coin.send(f'开始为UID{uid}执行米游币获取,请稍等...', at_sender=True)
logger.info('米游币自动获取', '', {'user_id': event.user_id, 'uid': uid, '执行获取': ''})
logger.info(
'米游币自动获取', '', {'user_id': event.user_id, 'uid': uid, '执行获取': ''}
)
coin_getting_list.append(f'{event.user_id}-{uid}')
try:
result = await mhy_bbs_coin(str(event.user_id), uid)
except Exception as e:
result = f'UID{uid}米游币执行失败,报错信息:{str(e)}'
finally:
coin_getting_list.remove(f'{event.user_id}-{uid}')
await get_coin.finish(result, at_sender=True)
else:
sub_data = {
'user_id': event.user_id,
'uid': uid,
'sub_event': '米游币自动获取'
}
sub_data = {'user_id': event.user_id, 'uid': uid, 'sub_event': '米游币自动获取'}
if switch:
# switch为开启则添加订阅
if (ck := await PrivateCookie.get_or_none(user_id=str(event.user_id), uid=uid)) and ck.stoken is not None:
await MihoyoBBSSub.update_or_create(**sub_data, defaults={
'group_id': event.group_id if isinstance(event, GroupMessageEvent) else event.user_id})
logger.info('米游币自动获取', '', {'user_id': event.user_id, 'uid': uid}, '开启成功', True)
if (
ck := await PrivateCookie.get_or_none(
user_id=str(event.user_id), uid=uid
)
) and ck.stoken is not None:
await MihoyoBBSSub.update_or_create(
**sub_data,
defaults={
'group_id': event.group_id
if isinstance(event, GroupMessageEvent)
else event.user_id
},
)
logger.info(
'米游币自动获取', '', {'user_id': event.user_id, 'uid': uid}, '开启成功', True
)
await sign.finish(f'UID{uid}开启米游币自动获取成功', at_sender=True)
else:
await get_coin.finish(f'UID{uid}尚未绑定Cookie或Cookie中没有login_ticket请先使用ysb指令绑定吧', at_sender=True)
await get_coin.finish(
f'UID{uid}尚未绑定Cookie或Cookie中没有login_ticket请先使用ysb指令绑定吧',
at_sender=True,
)
else:
# switch为关闭则取消订阅
if sub := await MihoyoBBSSub.get_or_none(**sub_data):
await sub.delete()
logger.info('米游币自动获取', '', {'user_id': event.user_id, 'uid': uid}, '关闭成功', True)
logger.info(
'米游币自动获取', '', {'user_id': event.user_id, 'uid': uid}, '关闭成功', True
)
await sign.finish(f'UID{uid}关闭米游币自动获取成功', at_sender=True)
else:
await sign.finish(f'UID{uid}尚未开启米游币自动获取,无需关闭!', at_sender=True)

View File

@ -1,12 +1,22 @@
from typing import Union
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, PrivateMessageEvent
from nonebot.adapters.onebot.v11 import (
Bot,
MessageEvent,
GroupMessageEvent,
PrivateMessageEvent,
)
from nonebot.plugin import PluginMetadata
from LittlePaimon.utils import logger
from LittlePaimon.utils.message import CommandPlayer
from .data_source import get_gacha_log_img, get_gacha_log_data, create_import_command, gacha_log_to_UIGF
from .data_source import (
get_gacha_log_img,
get_gacha_log_data,
create_import_command,
gacha_log_to_UIGF,
)
__plugin_meta__ = PluginMetadata(
name="原神抽卡记录分析",
@ -20,30 +30,54 @@ __plugin_meta__ = PluginMetadata(
},
)
update_log = on_command('更新抽卡记录', aliases={'抽卡记录更新', '获取抽卡记录'}, priority=12, block=True, state={
update_log = on_command(
'更新抽卡记录',
aliases={'抽卡记录更新', '获取抽卡记录'},
priority=12,
block=True,
state={
'pm_name': '更新抽卡记录',
'pm_description': '*通过stoken更新原神抽卡记录',
'pm_usage': '更新抽卡记录(uid)',
'pm_priority': 1
})
show_log = on_command('查看抽卡记录', aliases={'抽卡记录', '查询抽卡记录'}, priority=12, block=True, state={
'pm_priority': 1,
},
)
show_log = on_command(
'查看抽卡记录',
aliases={'抽卡记录', '查询抽卡记录'},
priority=12,
block=True,
state={
'pm_name': '查看抽卡记录',
'pm_description': '*查看你的抽卡记录分析',
'pm_usage': '查看抽卡记录(uid)',
'pm_priority': 2
})
import_log = on_command('导入抽卡记录', aliases={'抽卡记录导入'}, priority=12, block=True, state={
'pm_priority': 2,
},
)
import_log = on_command(
'导入抽卡记录',
aliases={'抽卡记录导入'},
priority=12,
block=True,
state={
'pm_name': '导入抽卡记录',
'pm_description': '导入符合UIGF标准的抽卡记录json文件发送命令后于5分钟内上传json文件即可',
'pm_usage': '导入抽卡记录',
'pm_priority': 3
})
export_log = on_command('导出抽卡记录', aliases={'抽卡记录导出'}, priority=12, block=True, state={
'pm_priority': 3,
},
)
export_log = on_command(
'导出抽卡记录',
aliases={'抽卡记录导出'},
priority=12,
block=True,
state={
'pm_name': '导出抽卡记录',
'pm_description': '导出符合UIGF标准的抽卡记录json文件',
'pm_usage': '导出抽卡记录',
'pm_priority': 4
})
'pm_priority': 4,
},
)
running_update = []
running_show = []
@ -62,6 +96,7 @@ async def _(event: MessageEvent, player=CommandPlayer(1)):
except Exception as e:
logger.info('原神抽卡记录', f'➤➤更新抽卡记录时出现错误:<r>{e}</r>')
await update_log.send(f'更新抽卡记录时出现错误:{e}')
finally:
running_update.remove(f'{player[0].user_id}-{player[0].uid}')
@ -70,15 +105,24 @@ async def _(event: MessageEvent, player=CommandPlayer(1)):
if f'{player[0].user_id}-{player[0].uid}' in running_show:
await update_log.finish(f'UID{player[0].uid}已经在绘制抽卡记录分析中,请勿重复发送')
else:
logger.info('原神抽卡记录', '', {'用户': player[0].user_id, 'UID': player[0].uid}, '开始绘制抽卡记录图片', True)
logger.info(
'原神抽卡记录',
'',
{'用户': player[0].user_id, 'UID': player[0].uid},
'开始绘制抽卡记录图片',
True,
)
running_show.append(f'{player[0].user_id}-{player[0].uid}')
await update_log.send(f'开始为UID{player[0].uid}绘制抽卡记录分析,请稍候...')
try:
result = await get_gacha_log_img(player[0].user_id, player[0].uid, event.sender.nickname)
result = await get_gacha_log_img(
player[0].user_id, player[0].uid, event.sender.nickname
)
await show_log.send(result, at_sender=True)
except Exception as e:
logger.info('原神抽卡记录', f'➤➤绘制抽卡记录图片时出现错误:<r>{e}</r>')
await update_log.send(f'绘制抽卡记录分析时出现错误:{e}')
finally:
running_show.remove(f'{player[0].user_id}-{player[0].uid}')
@ -89,15 +133,23 @@ async def _(event: Union[GroupMessageEvent, PrivateMessageEvent]):
@export_log.handle()
async def _(event: Union[GroupMessageEvent, PrivateMessageEvent], bot: Bot, player=CommandPlayer(1)):
async def _(
event: Union[GroupMessageEvent, PrivateMessageEvent],
bot: Bot,
player=CommandPlayer(1),
):
state, msg, path = gacha_log_to_UIGF(player[0].user_id, player[0].uid)
if not state:
await export_log.finish(msg, at_sender=True)
else:
try:
if isinstance(event, GroupMessageEvent):
await bot.upload_group_file(group_id=event.group_id, file=str(path.absolute()), name=path.name)
await bot.upload_group_file(
group_id=event.group_id, file=str(path.absolute()), name=path.name
)
else:
await bot.upload_private_file(user_id=event.user_id, file=str(path.absolute()), name=path.name)
await bot.upload_private_file(
user_id=event.user_id, file=str(path.absolute()), name=path.name
)
except Exception as e:
await export_log.finish(f'上传文件失败,错误信息:{e}', at_sender=True)

View File

@ -28,68 +28,121 @@ __plugin_meta__ = PluginMetadata(
'author': '惜月',
'version': '3.0',
'priority': 1,
}
},
)
def has_raw_rule(event: MessageEvent) -> bool:
return bool(event.reply and (YSC_TEMP_IMG_PATH / f'{event.reply.message_id}.jpg').exists())
return bool(
event.reply and (YSC_TEMP_IMG_PATH / f'{event.reply.message_id}.jpg').exists()
)
ys = on_command('ys', aliases={'原神卡片', '个人卡片'}, priority=10, block=True, state={
ys = on_command(
'ys',
aliases={'原神卡片', '个人卡片'},
priority=10,
block=True,
state={
'pm_name': 'ys',
'pm_description': '查看原神个人信息卡片',
'pm_usage': 'ys(uid)',
'pm_priority': 1
})
ysa = on_command('ysa', aliases={'角色背包', '练度统计'}, priority=10, block=True, state={
'pm_priority': 1,
},
)
ysa = on_command(
'ysa',
aliases={'角色背包', '练度统计'},
priority=10,
block=True,
state={
'pm_name': 'ysa',
'pm_description': '查看角色背包及练度排行',
'pm_usage': 'ysa(uid)',
'pm_priority': 2
})
ysc = on_command('ysc', aliases={'角色图', '角色卡片'}, priority=10, block=True, state={
'pm_priority': 2,
},
)
ysc = on_command(
'ysc',
aliases={'角色图', '角色卡片'},
priority=10,
block=True,
state={
'pm_name': 'ysc',
'pm_description': '随机角色同人图+角色信息卡片',
'pm_usage': 'ysc(uid)<角色名>',
'pm_priority': 4
})
ysd = on_command('ysd', aliases={'角色详情', '角色信息', '角色面板'}, priority=10, block=True, state={
'pm_priority': 4,
},
)
ysd = on_command(
'ysd',
aliases={'角色详情', '角色信息', '角色面板'},
priority=10,
block=True,
state={
'pm_name': 'ysd',
'pm_description': '查看指定角色的详细面板数据及伤害计算',
'pm_usage': 'ysd(uid)<角色名>',
'pm_priority': 5
})
update_info = on_command('udi', aliases={'更新角色信息', '更新面板', '更新玩家信息'}, priority=10, block=True, state={
'pm_priority': 5,
},
)
update_info = on_command(
'udi',
aliases={'更新角色信息', '更新面板', '更新玩家信息'},
priority=10,
block=True,
state={
'pm_name': 'udi',
'pm_description': '更新你的原神玩家和角色数据绑定cookie后数据更详细加上"天赋"可以更新天赋等级',
'pm_usage': '更新角色信息[天赋](uid)',
'pm_priority': 6
})
add_alias = on_command('设置别名', priority=10, block=True, state={
'pm_priority': 6,
},
)
add_alias = on_command(
'设置别名',
priority=10,
block=True,
state={
'pm_name': '角色别名设置',
'pm_description': '设置专属于你的角色别名,例如【设置别名钟离 老公】',
'pm_usage': '设置别名<角色> <别名>',
'pm_priority': 7
})
delete_alias = on_command('删除别名', priority=10, block=True, state={
'pm_priority': 7,
},
)
delete_alias = on_command(
'删除别名',
priority=10,
block=True,
state={
'pm_name': '角色别名删除',
'pm_description': '删除你已设置的角色别名',
'pm_usage': '删除别名<别名>',
'pm_priority': 8
})
show_alias = on_command('查看别名', priority=10, block=True, state={
'pm_priority': 8,
},
)
show_alias = on_command(
'查看别名',
priority=10,
block=True,
state={
'pm_name': '角色别名查看',
'pm_description': '查看你已设置的角色别名',
'pm_usage': '查看别名',
'pm_priority': 9
})
raw_img_cmd = on_command('原图', priority=10, block=True, rule=Rule(has_raw_rule), state={
'pm_priority': 9,
},
)
raw_img_cmd = on_command(
'原图',
priority=10,
block=True,
rule=Rule(has_raw_rule),
state={
'pm_name': 'ysc原图',
'pm_description': '获取ysc指令卡片中的原神同人图',
'pm_usage': '(回复ysc消息) 原图',
'pm_priority': 10
})
'pm_priority': 10,
},
)
@ys.handle()
@ -128,7 +181,9 @@ async def _(event: MessageEvent, players=CommandPlayer(2)):
await ysa.send(f'UID{player.uid}正在绘制角色背包,请勿重复发送指令')
else:
running_ysa.append(f'{player.user_id}-{player.uid}')
logger.info('原神角色背包', '', {'用户': players[0].user_id, 'UID': players[0].uid})
logger.info(
'原神角色背包', '', {'用户': players[0].user_id, 'UID': players[0].uid}
)
gim = GenshinInfoManager(player.user_id, player.uid)
player_info, characters_list = await gim.get_chara_bag()
if isinstance(player_info, str):
@ -151,7 +206,11 @@ async def _(event: MessageEvent, players=CommandPlayer(2)):
@ysc.handle()
async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), characters=CommandCharacter()):
async def _(
event: MessageEvent,
players=CommandPlayer(only_cn=False),
characters=CommandCharacter(),
):
logger.info('原神角色卡片', '开始执行')
msg = Message()
temp_img = None
@ -164,7 +223,9 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
character_info = await gim.get_character(name=character)
if not character_info:
logger.info('原神角色卡片', '➤➤', {'角色': character}, '没有该角色信息,发送随机图', True)
msg += MessageSegment.image(f'https://genshin-res.cherishmoon.fun/img?name={character}')
msg += MessageSegment.image(
f'https://genshin-res.cherishmoon.fun/img?name={character}'
)
else:
img, temp_img = await draw_chara_card(character_info)
logger.info('原神角色卡片', '➤➤', {'角色': character}, '制图完成', True)
@ -177,15 +238,21 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
logger.info('原神角色卡片', '', {'用户': player.user_id, 'UID': player.uid})
character_info = await gim.get_character(name=characters[0])
if not character_info:
logger.info('原神角色卡片', '➤➤', {'角色': characters[0]}, '没有该角色信息,发送随机图', True)
msg += MessageSegment.image(f'https://genshin-res.cherishmoon.fun/img?name={characters[0]}')
logger.info(
'原神角色卡片', '➤➤', {'角色': characters[0]}, '没有该角色信息,发送随机图', True
)
msg += MessageSegment.image(
f'https://genshin-res.cherishmoon.fun/img?name={characters[0]}'
)
else:
img, temp_img = await draw_chara_card(character_info)
logger.info('原神角色卡片', '➤➤', {'角色': characters[0]}, '制图完成', True)
msg += img
send_result = await ysd.send(msg, at_sender=True)
if temp_img:
temp_img.convert('RGB').save(YSC_TEMP_IMG_PATH / f'{send_result["message_id"]}.jpg', )
temp_img.convert('RGB').save(
YSC_TEMP_IMG_PATH / f'{send_result["message_id"]}.jpg',
)
@raw_img_cmd.handle()
@ -195,7 +262,11 @@ async def _(event: MessageEvent):
@ysd.handle()
async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), characters=CommandCharacter()):
async def _(
event: MessageEvent,
players=CommandPlayer(only_cn=False),
characters=CommandCharacter(),
):
logger.info('原神角色面板', '开始执行')
msg = Message()
try:
@ -203,9 +274,13 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
# 当查询对象只有一个时,查询所有角色
gim = GenshinInfoManager(players[0].user_id, players[0].uid)
await LastQuery.update_last_query(players[0].user_id, players[0].uid)
logger.info('原神角色面板', '', {'用户': players[0].user_id, 'UID': players[0].uid})
logger.info(
'原神角色面板', '', {'用户': players[0].user_id, 'UID': players[0].uid}
)
for character in characters:
character_info = await gim.get_character(name=character, data_source='enka')
character_info = await gim.get_character(
name=character, data_source='enka'
)
if not character_info:
logger.info('原神角色面板', '➤➤', {'角色': character}, '没有该角色信息', False)
msg += f'\n暂无你{character}信息,请在游戏内展柜放置该角色'
@ -219,7 +294,9 @@ async def _(event: MessageEvent, players=CommandPlayer(only_cn=False), character
gim = GenshinInfoManager(player.user_id, player.uid)
await LastQuery.update_last_query(player.user_id, player.uid)
logger.info('原神角色面板', '', {'用户': player.user_id, 'UID': player.uid})
character_info = await gim.get_character(name=characters[0], data_source='enka')
character_info = await gim.get_character(
name=characters[0], data_source='enka'
)
if not character_info:
msg += f'\n暂无{player.uid}{characters[0]}信息,请在游戏内展柜放置该角色'
else:
@ -240,7 +317,9 @@ running_udi = []
async def _(event: MessageEvent, state: T_State, uid=CommandUID()):
msg = state['clear_msg']
if not freq_limiter.check(f'udi{uid}'):
await update_info.finish(f'UID{uid}: 更新信息冷却剩余{freq_limiter.left(f"udi{uid}")}\n', at_sender=True)
await update_info.finish(
f'UID{uid}: 更新信息冷却剩余{freq_limiter.left(f"udi{uid}")}\n', at_sender=True
)
elif f'{event.user_id}-{uid}' in running_udi:
await update_info.finish(f'UID{uid}正在更新信息中,请勿重复发送指令')
else:
@ -249,13 +328,14 @@ async def _(event: MessageEvent, state: T_State, uid=CommandUID()):
include_talent = any(i in msg for i in ['全部', '技能', '天赋', 'talent', 'all'])
await update_info.send('开始更新原神信息,请稍后...')
logger.info('原神信息', '➤开始更新', {'用户': event.user_id, 'UID': uid})
freq_limiter.start(f'udi{uid}', 180)
freq_limiter.start(f'udi{uid}', 60)
gim = GenshinInfoManager(str(event.user_id), uid)
result = await gim.update_all(include_talent)
except KeyError as e:
result = f'更新失败,缺少{e}的数据可能是Enka.Network接口出现问题'
except Exception as e:
result = f'更新失败,错误信息:{e}'
finally:
running_udi.remove(f'{event.user_id}-{uid}')
await update_info.finish(f'UID{uid}:\n{result}', at_sender=True)
@ -271,10 +351,19 @@ async def _(event: MessageEvent, state: T_State, msg: Message = CommandArg()):
state['alias'] = Message(msg[1])
@add_alias.got('alias', prompt=Message.template('你想把{chara}设置为你的谁呢?'),
parameterless=[HandleCancellation(f'好吧,有事再找{NICKNAME}')])
async def _(event: MessageEvent, chara: str = ArgPlainText('chara'), alias: str = ArgPlainText('alias')):
await PlayerAlias.update_or_create(user_id=str(event.user_id), alias=alias, defaults={'character': chara})
@add_alias.got(
'alias',
prompt=Message.template('你想把{chara}设置为你的谁呢?'),
parameterless=[HandleCancellation(f'好吧,有事再找{NICKNAME}')],
)
async def _(
event: MessageEvent,
chara: str = ArgPlainText('chara'),
alias: str = ArgPlainText('alias'),
):
await PlayerAlias.update_or_create(
user_id=str(event.user_id), alias=alias, defaults={'character': chara}
)
await add_alias.finish(f'设置成功,{NICKNAME}知道{chara}是你的{alias}啦..')
@ -283,14 +372,20 @@ async def _(event: MessageEvent, state: T_State, msg: Message = CommandArg()):
if msg:
state['alias'] = msg
elif aliases := await PlayerAlias.filter(user_id=str(event.user_id)).all():
state['msg'] = '你已设置以下别名:\n' + '\n'.join(
[f'{i.alias} -> {i.character}' for i in aliases]) + '\n请输入你想删除的别名或发送"全部"删除全部别名'
state['msg'] = (
'你已设置以下别名:\n'
+ '\n'.join([f'{i.alias} -> {i.character}' for i in aliases])
+ '\n请输入你想删除的别名或发送"全部"删除全部别名'
)
else:
await delete_alias.finish('你还没有设置任何别名哦')
@delete_alias.got('alias', prompt=Message.template('{msg}'),
parameterless=[HandleCancellation(f'好吧,有事再找{NICKNAME}')])
@delete_alias.got(
'alias',
prompt=Message.template('{msg}'),
parameterless=[HandleCancellation(f'好吧,有事再找{NICKNAME}')],
)
async def _(event: MessageEvent, msg: str = ArgPlainText('alias')):
if msg == '全部':
await PlayerAlias.filter(user_id=str(event.user_id)).delete()
@ -305,7 +400,10 @@ async def _(event: MessageEvent, msg: str = ArgPlainText('alias')):
@show_alias.handle()
async def _(event: MessageEvent):
if aliases := await PlayerAlias.filter(user_id=str(event.user_id)).all():
await show_alias.finish('你已设以下别名:' + '\n'.join(f'{alias.alias}->{alias.character}' for alias in aliases),
at_sender=True)
await show_alias.finish(
'你已设以下别名:'
+ '\n'.join(f'{alias.alias}->{alias.character}' for alias in aliases),
at_sender=True,
)
else:
await show_alias.finish('你还没有设置过角色别名哦', at_sender=True)

View File

@ -4,7 +4,7 @@ from nonebot import get_driver
from .logger import logger
from .scheduler import scheduler
__version__ = '3.0.6'
__version__ = '3.0.8'
DRIVER = get_driver()
try:
@ -20,11 +20,4 @@ try:
except Exception:
NICKNAME = '派蒙'
__all__ = [
'logger',
'scheduler',
'DRIVER',
'SUPERUSERS',
'NICKNAME',
'__version__'
]
__all__ = ['logger', 'scheduler', 'DRIVER', 'SUPERUSERS', 'NICKNAME', '__version__']

View File

@ -16,20 +16,34 @@ from .requests import aiorequests
# MIHOYO_API = 'https://api-takumi-record.mihoyo.com/'
# MIHOYO_API_OLD = 'https://api-takumi.mihoyo.com/'
ABYSS_API = 'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss'
PLAYER_CARD_API = 'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index'
CHARACTER_DETAIL_API = 'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character'
CHARACTER_SKILL_API = 'https://api-takumi.mihoyo.com/event/e20200928calculate/v1/sync/avatar/detail'
ABYSS_API = (
'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss'
)
PLAYER_CARD_API = (
'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index'
)
CHARACTER_DETAIL_API = (
'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character'
)
CHARACTER_SKILL_API = (
'https://api-takumi.mihoyo.com/event/e20200928calculate/v1/sync/avatar/detail'
)
MONTH_INFO_API = 'https://hk4e-api.mihoyo.com/event/ys_ledger/monthInfo'
DAILY_NOTE_API = 'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/dailyNote'
GAME_RECORD_API = 'https://api-takumi-record.mihoyo.com/game_record/card/wapi/getGameRecordCard'
DAILY_NOTE_API = (
'https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/dailyNote'
)
GAME_RECORD_API = (
'https://api-takumi-record.mihoyo.com/game_record/card/wapi/getGameRecordCard'
)
SIGN_INFO_API = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/info'
SIGN_REWARD_API = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/home'
SIGN_ACTION_API = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign'
AUTHKEY_API = 'https://api-takumi.mihoyo.com/binding/api/genAuthKey'
STOKEN_API = 'https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket'
COOKIE_TOKEN_API = 'https://api-takumi.mihoyo.com/auth/api/getCookieAccountInfoBySToken'
LOGIN_TICKET_INFO_API = 'https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket'
LOGIN_TICKET_INFO_API = (
'https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket'
)
def md5(text: str) -> str:
@ -117,7 +131,7 @@ def mihoyo_headers(cookie, q='', b=None) -> dict:
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS '
'X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
'x-rpc-client_type': '5',
'Referer': 'https://webstatic.mihoyo.com/'
'Referer': 'https://webstatic.mihoyo.com/',
}
@ -139,7 +153,7 @@ def mihoyo_sign_headers(cookie: str, extra_headers: Optional[dict] = None) -> di
'x-rpc-client_type': '5',
'Referer': 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true&act_id'
'=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon',
'x-rpc-app_version': '2.35.2'
'x-rpc-app_version': '2.35.2',
}
if extra_headers:
header.update(extra_headers)
@ -165,7 +179,10 @@ async def check_retcode(data: dict, cookie_info, user_id: str, uid: str) -> bool
logger.info('原神Cookie', f'用户<m>{user_id}</m>的私人cookie<m>{uid}</m>疑似失效')
elif cookie_info.status == 0:
await cookie_info.delete()
logger.info('原神Cookie', f'用户<m>{user_id}</m>的私人cookie<m>{uid}</m>连续失效,<r>已删除</r>')
logger.info(
'原神Cookie',
f'用户<m>{user_id}</m>的私人cookie<m>{uid}</m>连续失效,<r>已删除</r>',
)
elif isinstance(cookie_info, PublicCookie):
await CookieCache.filter(cookie=cookie_info.cookie).delete()
await cookie_info.delete()
@ -173,14 +190,18 @@ async def check_retcode(data: dict, cookie_info, user_id: str, uid: str) -> bool
else:
await PublicCookie.filter(cookie=cookie_info.cookie).delete()
await cookie_info.delete()
logger.info('原神Cookie', f'UID<m>{cookie_info.uid}</m>使用的缓存cookie已失效<r>已删除</r>')
logger.info(
'原神Cookie', f'UID<m>{cookie_info.uid}</m>使用的缓存cookie已失效<r>已删除</r>'
)
return False
elif data['retcode'] == 10101:
cookie_info.status = 2
if isinstance(cookie_info, PrivateCookie):
cookie_info.status = 2
await cookie_info.save()
logger.info('原神Cookie', f'用户<m>{user_id}</m>的私人cookie<m>{uid}</m>已达到每日30次查询上限')
logger.info(
'原神Cookie', f'用户<m>{user_id}</m>的私人cookie<m>{uid}</m>已达到每日30次查询上限'
)
elif isinstance(cookie_info, PublicCookie):
cookie_info.status = 2
await cookie_info.save()
@ -188,18 +209,21 @@ async def check_retcode(data: dict, cookie_info, user_id: str, uid: str) -> bool
else:
await PublicCookie.filter(cookie=cookie_info.cookie).update(status=2)
await cookie_info.delete()
logger.info('原神Cookie', f'UID<m>{cookie_info.uid}</m>使用的缓存cookie已达到每日30次查询上限')
logger.info(
'原神Cookie', f'UID<m>{cookie_info.uid}</m>使用的缓存cookie已达到每日30次查询上限'
)
return False
else:
if isinstance(cookie_info, PublicCookie) and data['retcode'] != 1034:
await CookieCache.update_or_create(uid=uid, defaults={'cookie': cookie_info.cookie})
await CookieCache.update_or_create(
uid=uid, defaults={'cookie': cookie_info.cookie}
)
return True
async def get_cookie(user_id: str,
uid: str,
check: bool = True,
own: bool = False) -> Union[None, PrivateCookie, PublicCookie, CookieCache]:
async def get_cookie(
user_id: str, uid: str, check: bool = True, own: bool = False
) -> Union[None, PrivateCookie, PublicCookie, CookieCache]:
"""
获取可用的cookie
:param user_id: 用户id
@ -208,12 +232,16 @@ async def get_cookie(user_id: str,
:param own: 是否只获取和uid对应的cookie
"""
query = Q(status=1) | Q(status=0) if check else Q(status=1)
if private_cookie := await PrivateCookie.filter(Q(Q(query) & Q(user_id=user_id) & Q(uid=uid))).first():
if private_cookie := await PrivateCookie.filter(
Q(Q(query) & Q(user_id=user_id) & Q(uid=uid))
).first():
return private_cookie
elif not own:
if cache_cookie := await CookieCache.get_or_none(uid=uid):
return cache_cookie
elif private_cookie := await PrivateCookie.filter(Q(Q(query) & Q(user_id=user_id))).first():
elif private_cookie := await PrivateCookie.filter(
Q(Q(query) & Q(user_id=user_id))
).first():
return private_cookie
else:
return await PublicCookie.filter(Q(query)).first()
@ -229,11 +257,11 @@ async def get_bind_game_info(cookie: str, mys_id: str):
:return: 原神信息
"""
with contextlib.suppress(Exception):
data = await aiorequests.get(url=GAME_RECORD_API,
data = await aiorequests.get(
url=GAME_RECORD_API,
headers=mihoyo_headers(cookie, f'uid={mys_id}'),
params={
'uid': mys_id
})
params={'uid': mys_id},
)
data = data.json()
nb_logger.debug(data)
if data['retcode'] == 0:
@ -245,7 +273,8 @@ async def get_mihoyo_public_data(
uid: str,
user_id: Optional[str],
mode: Literal['abyss', 'player_card', 'role_detail'],
schedule_type: Optional[str] = '1'):
schedule_type: Optional[str] = '1',
):
server_id = 'cn_qd01' if uid[0] == '5' else 'cn_gf01'
check = True
while True:
@ -254,32 +283,33 @@ async def get_mihoyo_public_data(
if not cookie_info:
return '当前没有可使用的cookie请绑定私人cookie或联系超级管理员添加公共cookie'
if mode == 'abyss':
data = await aiorequests.get(url=ABYSS_API,
data = await aiorequests.get(
url=ABYSS_API,
headers=mihoyo_headers(
q=f'role_id={uid}&schedule_type={schedule_type}&server={server_id}',
cookie=cookie_info.cookie),
cookie=cookie_info.cookie,
),
params={
"schedule_type": schedule_type,
"role_id": uid,
"server": server_id}
"server": server_id,
},
)
elif mode == 'player_card':
data = await aiorequests.get(url=PLAYER_CARD_API,
headers=mihoyo_headers(q=f'role_id={uid}&server={server_id}',
cookie=cookie_info.cookie),
params={
'server': server_id,
'role_id': uid
})
data = await aiorequests.get(
url=PLAYER_CARD_API,
headers=mihoyo_headers(
q=f'role_id={uid}&server={server_id}', cookie=cookie_info.cookie
),
params={'server': server_id, 'role_id': uid},
)
elif mode == 'role_detail':
json_data = {
"server": server_id,
"role_id": uid,
"character_ids": []
}
data = await aiorequests.post(url=CHARACTER_DETAIL_API,
json_data = {"server": server_id, "role_id": uid, "character_ids": []}
data = await aiorequests.post(
url=CHARACTER_DETAIL_API,
headers=mihoyo_headers(b=json_data, cookie=cookie_info.cookie),
json=json_data)
json=json_data,
)
else:
data = None
data = data.json() if data else {'retcode': 999}
@ -293,39 +323,44 @@ async def get_mihoyo_private_data(
user_id: Optional[str],
mode: Literal['role_skill', 'month_info', 'daily_note', 'sign_info', 'sign_action'],
role_id: Optional[str] = None,
month: Optional[str] = None):
month: Optional[str] = None,
):
server_id = 'cn_qd01' if uid[0] == '5' else 'cn_gf01'
cookie_info = await get_cookie(user_id, uid, True, True)
if not cookie_info:
return '未绑定私人cookie绑定方法二选一\n1.通过米游社扫码绑定:\n请发送指令[原神扫码绑定]\n2.获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定' \
return (
'未绑定私人cookie绑定方法二选一\n1.通过米游社扫码绑定:\n请发送指令[原神扫码绑定]\n2.获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定'
+ (f'或前往{config.CookieWeb_url}网页添加绑定' if config.CookieWeb_enable else '')
)
if mode == 'role_skill':
data = await aiorequests.get(url=CHARACTER_SKILL_API,
headers=mihoyo_headers(q=f'uid={uid}&region={server_id}&avatar_id={role_id}',
cookie=cookie_info.cookie),
params={
"region": server_id,
"uid": uid,
"avatar_id": role_id})
data = await aiorequests.get(
url=CHARACTER_SKILL_API,
headers=mihoyo_headers(
q=f'uid={uid}&region={server_id}&avatar_id={role_id}',
cookie=cookie_info.cookie,
),
params={"region": server_id, "uid": uid, "avatar_id": role_id},
)
elif mode == 'month_info':
data = await aiorequests.get(url=MONTH_INFO_API,
headers=mihoyo_headers(q=f'month={month}&bind_uid={uid}&bind_region={server_id}',
cookie=cookie_info.cookie),
params={
"month": month,
"bind_uid": uid,
"bind_region": server_id
})
data = await aiorequests.get(
url=MONTH_INFO_API,
headers=mihoyo_headers(
q=f'month={month}&bind_uid={uid}&bind_region={server_id}',
cookie=cookie_info.cookie,
),
params={"month": month, "bind_uid": uid, "bind_region": server_id},
)
elif mode == 'daily_note':
data = await aiorequests.get(url=DAILY_NOTE_API,
headers=mihoyo_headers(q=f'role_id={uid}&server={server_id}',
cookie=cookie_info.cookie),
params={
"server": server_id,
"role_id": uid
})
data = await aiorequests.get(
url=DAILY_NOTE_API,
headers=mihoyo_headers(
q=f'role_id={uid}&server={server_id}', cookie=cookie_info.cookie
),
params={"server": server_id, "role_id": uid},
)
elif mode == 'sign_info':
data = await aiorequests.get(url=SIGN_INFO_API,
data = await aiorequests.get(
url=SIGN_INFO_API,
headers={
'x-rpc-app_version': '2.11.1',
'x-rpc-client_type': '5',
@ -335,19 +370,14 @@ async def get_mihoyo_private_data(
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS '
'X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
},
params={
'act_id': 'e202009291139501',
'region': server_id,
'uid': uid
})
params={'act_id': 'e202009291139501', 'region': server_id, 'uid': uid},
)
elif mode == 'sign_action':
data = await aiorequests.post(url=SIGN_ACTION_API,
data = await aiorequests.post(
url=SIGN_ACTION_API,
headers=mihoyo_sign_headers(cookie_info.cookie),
json={
'act_id': 'e202009291139501',
'uid': uid,
'region': server_id
})
json={'act_id': 'e202009291139501', 'uid': uid, 'region': server_id},
)
else:
data = None
data = data.json() if data else {'retcode': 999}
@ -364,13 +394,11 @@ async def get_sign_reward_list() -> dict:
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 ('
'KHTML, like Gecko) miHoYoBBS/2.11.1',
'x-rpc-client_type': '5',
'Referer': 'https://webstatic.mihoyo.com/'
'Referer': 'https://webstatic.mihoyo.com/',
}
resp = await aiorequests.get(url=SIGN_REWARD_API,
headers=headers,
params={
'act_id': 'e202009291139501'
})
resp = await aiorequests.get(
url=SIGN_REWARD_API, headers=headers, params={'act_id': 'e202009291139501'}
)
data = resp.json()
nb_logger.debug(data)
return data
@ -378,7 +406,8 @@ async def get_sign_reward_list() -> dict:
async def get_stoken_by_login_ticket(login_ticket: str, mys_id: str) -> Optional[str]:
with contextlib.suppress(Exception):
data = await aiorequests.get(STOKEN_API,
data = await aiorequests.get(
STOKEN_API,
headers={
'x-rpc-app_version': '2.11.2',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
@ -386,11 +415,8 @@ async def get_stoken_by_login_ticket(login_ticket: str, mys_id: str) -> Optional
'Referer': 'https://webstatic.mihoyo.com/',
'Origin': 'https://webstatic.mihoyo.com',
},
params={
'login_ticket': login_ticket,
'token_types': '3',
'uid': mys_id
})
params={'login_ticket': login_ticket, 'token_types': '3', 'uid': mys_id},
)
data = data.json()
return data['data']['list'][0]['token']
return None
@ -398,25 +424,26 @@ async def get_stoken_by_login_ticket(login_ticket: str, mys_id: str) -> Optional
async def get_cookie_token_by_stoken(stoken: str, mys_id: str) -> Optional[str]:
with contextlib.suppress(Exception):
data = await aiorequests.get(COOKIE_TOKEN_API,
data = await aiorequests.get(
COOKIE_TOKEN_API,
headers={
'x-rpc-app_version': '2.11.2',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1',
'x-rpc-client_type': '5',
'Referer': 'https://webstatic.mihoyo.com/',
'Origin': 'https://webstatic.mihoyo.com',
'Cookie': f'stuid={mys_id};stoken={stoken}'
'Cookie': f'stuid={mys_id};stoken={stoken}',
},
params={
'uid': mys_id,
'stoken': stoken
})
params={'uid': mys_id, 'stoken': stoken},
)
data = data.json()
return data['data']['cookie_token']
return None
async def get_authkey_by_stoken(user_id: str, uid: str) -> Tuple[Optional[str], bool, Optional[PrivateCookie]]:
async def get_authkey_by_stoken(
user_id: str, uid: str
) -> Tuple[Optional[str], bool, Optional[PrivateCookie]]:
"""
根据stoken获取authkey
@ -427,8 +454,12 @@ async def get_authkey_by_stoken(user_id: str, uid: str) -> Tuple[Optional[str],
server_id = 'cn_qd01' if uid[0] == '5' else 'cn_gf01'
cookie_info = await get_cookie(user_id, uid, True, True)
if not cookie_info:
return '未绑定私人cookie绑定方法二选一\n1.通过米游社扫码绑定:\n请发送指令[原神扫码绑定]\n2.获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定' \
+ (f'或前往{config.CookieWeb_url}网页添加绑定' if config.CookieWeb_enable else ''), False, cookie_info
return (
'未绑定私人cookie绑定方法二选一\n1.通过米游社扫码绑定:\n请发送指令[原神扫码绑定]\n2.获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定'
+ (f'或前往{config.CookieWeb_url}网页添加绑定' if config.CookieWeb_enable else ''),
False,
cookie_info,
)
if not cookie_info.stoken:
return 'cookie中没有stoken字段请重新绑定', False, cookie_info
headers = {
@ -443,14 +474,18 @@ async def get_authkey_by_stoken(user_id: str, uid: str) -> Tuple[Optional[str],
'x-rpc-device_name': random_text(random.randint(1, 10)),
'x-rpc-device_model': 'Mi 10',
'Referer': 'https://app.mihoyo.com',
'Host': 'api-takumi.mihoyo.com'}
data = await aiorequests.post(url=AUTHKEY_API,
'Host': 'api-takumi.mihoyo.com',
}
data = await aiorequests.post(
url=AUTHKEY_API,
headers=headers,
json={
'auth_appid': 'webview_gacha',
'game_biz': 'hk4e_cn',
'game_uid': uid,
'region': server_id})
'region': server_id,
},
)
data = data.json()
if data.get('data') is not None and 'authkey' in data['data']:
return data['data']['authkey'], True, cookie_info
@ -458,16 +493,20 @@ async def get_authkey_by_stoken(user_id: str, uid: str) -> Tuple[Optional[str],
return None, False, cookie_info
async def get_enka_data(uid):
async def get_enka_data(uid: str):
urls = [
'https://enka.network/api/uid/{uid}',
'https://enka.microgg.cn/api/uid/{uid}'
'https://profile.microgg.cn/api/uid/{uid}', # 以下两个api由小灰灰提供
'https://enka.microgg.cn/api/uid/{uid}',
]
for url in urls:
with contextlib.suppress(Exception):
resp = await aiorequests.get(url=url.format(uid=uid),
resp = await aiorequests.get(
url=url.format(uid=uid),
headers={'User-Agent': 'LittlePaimon/3.0'},
follow_redirects=True)
follow_redirects=True,
)
data = resp.json()
nb_logger.debug(data)
if 'playerInfo' in data:
return data