From cfc755dc0a06c7e0c6a05ae496e834ada139c01a Mon Sep 17 00:00:00 2001 From: student_2333 Date: Sun, 3 Apr 2022 21:47:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=BC=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +- genshinuid.py | 722 ++++++++++++------------- mihoyo_libs/get_data.py | 650 +++++++++++----------- mihoyo_libs/get_image.py | 836 ++++++++++++++--------------- mihoyo_libs/get_mihoyo_bbs_coin.py | 222 ++++---- mihoyo_libs/get_mihoyo_bbs_data.py | 564 +++++++++---------- 6 files changed, 1511 insertions(+), 1507 deletions(-) diff --git a/README.md b/README.md index b1de6057..60985519 100644 --- a/README.md +++ b/README.md @@ -12,17 +12,18 @@

- ## 丨我该如何安装该插件? -+ 如果你使用的是[Go-cqhttp](https://github.com/Mrs4s/go-cqhttp) & [HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot),**安装方法查看[此处](https://github.com/KimigaiiWuyi/GenshinUID/wiki#%E4%B8%A8%E5%AE%89%E8%A3%85hoshinobot-)**。 -+ 如果你使用的是[Go-cqhttp](https://github.com/Mrs4s/go-cqhttp) & [NoneBot2](https://github.com/nonebot/nonebot2),**安装方法查看[此处](https://github.com/KimigaiiWuyi/GenshinUID/wiki#%E4%B8%A8%E5%AE%89%E8%A3%85nonebot2)**。(**开发者正在使用**) ++ 如果你使用的是[Go-cqhttp](https://github.com/Mrs4s/go-cqhttp) + & [HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot),**安装方法查看[此处](https://github.com/KimigaiiWuyi/GenshinUID/wiki#%E4%B8%A8%E5%AE%89%E8%A3%85hoshinobot-)**。 ++ 如果你使用的是[Go-cqhttp](https://github.com/Mrs4s/go-cqhttp) + & [NoneBot2](https://github.com/nonebot/nonebot2),**安装方法查看[此处](https://github.com/KimigaiiWuyi/GenshinUID/wiki#%E4%B8%A8%E5%AE%89%E8%A3%85nonebot2)**。(**开发者正在使用**) + 如果你想在QQ官方的频道Bot使用此插件,你需要**做好以下准备**: - - 拥有QQ频道机器人的开发者账号(类型:私域) - - 拥有已经备案好的服务器地址(视情况后期官方放开本地图片发送而定) - - **腾讯频道Bot官方的文档**,查看[此处](https://bot.q.qq.com/wiki/#) - - 安装方法:基于官方的[PythonSDK](https://github.com/tencent-connect/botpy),本插件的安装方法可自行摸索。 + - 拥有QQ频道机器人的开发者账号(类型:私域) + - 拥有已经备案好的服务器地址(视情况后期官方放开本地图片发送而定) + - **腾讯频道Bot官方的文档**,查看[此处](https://bot.q.qq.com/wiki/#) + - 安装方法:基于官方的[PythonSDK](https://github.com/tencent-connect/botpy),本插件的安装方法可自行摸索。 ## 丨我该如何获取Cookies?[#92](https://github.com/KimigaiiWuyi/GenshinUID/issues/92)([@RemKeeper](https://github.com/RemKeeper)) @@ -73,8 +74,10 @@ if (ask == true) { - [PaimonBot](https://github.com/XiaoMiku01/PaimonBot) - 插件原始代码来自于它 - [YuanShen_User_Info](https://github.com/Womsxd/YuanShen_User_Info) - 米游社API来自于它 - *[MiniGG](https://www.minigg.cn/)* - Wiki API来自于它 -- [@MingxuanGame](https://github.com/MingxuanGame) - [Nonebot2-beta1](https://github.com/KimigaiiWuyi/GenshinUID/tree/nonebot2-beta1)分支新建与维护 -- [@shirokurakana](https://github.com/shirokurakana) - [Nonebot2-beta1分支的修复与优化](https://github.com/KimigaiiWuyi/GenshinUID/pull/118) +- [@MingxuanGame](https://github.com/MingxuanGame) + - [Nonebot2-beta1](https://github.com/KimigaiiWuyi/GenshinUID/tree/nonebot2-beta1)分支新建与维护 +- [@shirokurakana](https://github.com/shirokurakana) + - [Nonebot2-beta1分支的修复与优化](https://github.com/KimigaiiWuyi/GenshinUID/pull/118) - [@AMEKENN](https://github.com/AMEKENN) - 米游社签到部分的代码指导 - [@lgc233](https://github.com/lgc2333) - 众多优秀PR贡献 - [@RemKeeper](https://github.com/RemKeeper) - 简易Cookies获取文档 @@ -88,4 +91,5 @@ if (ask == true) { + 如果本插件对你有帮助,不要忘了点个Star~ + 本项目仅供学习使用,请勿用于商业用途 + [爱发电](https://afdian.net/@KimigaiiWuyi) -+ [GPL-3.0 License](https://github.com/KimigaiiWuyi/GenshinUID/blob/main/LICENSE) © [@KimigaiiWuyi](https://github.com/KimigaiiWuyi) ++ [GPL-3.0 License](https://github.com/KimigaiiWuyi/GenshinUID/blob/main/LICENSE) + © [@KimigaiiWuyi](https://github.com/KimigaiiWuyi) diff --git a/genshinuid.py b/genshinuid.py index 6ddc2559..54894212 100644 --- a/genshinuid.py +++ b/genshinuid.py @@ -3,10 +3,10 @@ import traceback from aiocqhttp.exceptions import ActionFailed from aiohttp import ClientConnectorError -from nonebot import get_bot, MessageSegment - from hoshino import Service from hoshino.typing import CQEvent, HoshinoBot +from nonebot import MessageSegment, get_bot + from .mihoyo_libs.get_image import * from .mihoyo_libs.get_mihoyo_bbs_data import * @@ -21,46 +21,46 @@ Texture_PATH = os.path.join(FILE_PATH, 'texture2d') @sv.on_rex('[\u4e00-\u9fa5]+(用什么|能用啥|怎么养)') async def send_char_adv(bot: HoshinoBot, ev: CQEvent): try: - name = str(ev.message).strip().replace(" ", "")[:-3] + name = str(ev.message).strip().replace(' ', '')[:-3] im = await char_adv(name) await bot.send(ev, im) except Exception: - logger.exception("获取建议失败。") + logger.exception('获取建议失败。') @sv.on_rex('[\u4e00-\u9fa5]+(能给谁|给谁用|要给谁|谁能用)') async def send_weapon_adv(bot: HoshinoBot, ev: CQEvent): try: - name = str(ev.message).strip().replace(" ", "")[:-3] + name = str(ev.message).strip().replace(' ', '')[:-3] im = await weapon_adv(name) await bot.send(ev, im) except Exception: - logger.exception("获取建议失败。") + logger.exception('获取建议失败。') @sv.on_prefix('语音') async def send_audio(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - message = message.replace(' ', "") + message = message.replace(' ', '') name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) im = await audio_wiki(name, message) - if name == "列表": + if name == '列表': await bot.send(ev, MessageSegment.image(im)) else: await bot.send(ev, MessageSegment.record(im)) except ActionFailed as e: - logger.exception("获取语音失败") - await bot.send(ev, "机器人发送消息失败:{}".format(e)) + logger.exception('获取语音失败') + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) except Exception as e: - logger.exception("获取语音失败或ffmpeg未配置") - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) + logger.exception('获取语音失败或ffmpeg未配置') + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) @sv.on_fullmatch('活动列表') async def send_polar(bot: HoshinoBot, ev: CQEvent): try: - img_path = os.path.join(FILE_PATH, "event.jpg") + img_path = os.path.join(FILE_PATH, 'event.jpg') while 1: if os.path.exists(img_path): f = open(img_path, 'rb') @@ -72,41 +72,41 @@ async def send_polar(bot: HoshinoBot, ev: CQEvent): await draw_event_pic() await bot.send(ev, MessageSegment.image(img_mihoyo_bbs)) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送活动列表失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送活动列表失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取活动列表错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取活动列表错误') @sv.on_fullmatch('御神签') async def send_lots(bot: HoshinoBot, ev: CQEvent): try: - qid = ev.sender["user_id"] + qid = ev.sender['user_id'] raw_data = await get_a_lots(qid) - im = base64.b64decode(raw_data).decode("utf-8") + im = base64.b64decode(raw_data).decode('utf-8') await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送御神签失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送御神签失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取御神签错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取御神签错误') @sv.on_prefix('材料') async def send_cost(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - message = message.replace(' ', "") - im = await char_wiki(message, "costs") + message = message.replace(' ', '') + im = await char_wiki(message, 'costs') await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送材料信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送材料信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取材料信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取材料信息错误') @sv.on_prefix('原魔') @@ -116,11 +116,11 @@ async def send_enemies(bot: HoshinoBot, ev: CQEvent): im = await enemies_wiki(message) await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送怪物信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送怪物信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取怪物信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取怪物信息错误') @sv.on_prefix('食物') @@ -130,11 +130,11 @@ async def send_food(bot: HoshinoBot, ev: CQEvent): im = await foods_wiki(message) await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送食物信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送食物信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取食物信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取食物信息错误') @sv.on_prefix('圣遗物') @@ -144,11 +144,11 @@ async def send_artifacts(bot: HoshinoBot, ev: CQEvent): im = await artifacts_wiki(message) await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送圣遗物信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送圣遗物信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取圣遗物信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取圣遗物信息错误') @sv.on_prefix('天赋') @@ -156,21 +156,21 @@ async def send_talents(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - num = re.findall(r"[0-9]+", message) + num = re.findall(r'[0-9]+', message) if len(num) == 1: - im = await char_wiki(name, "talents", num[0]) + im = await char_wiki(name, 'talents', num[0]) if isinstance(im, list): await hoshino_bot.send_group_forward_msg(group_id=ev.group_id, messages=im) return else: - im = "参数不正确。" + im = '参数不正确。' await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送天赋信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送天赋信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取天赋信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取天赋信息错误') @sv.on_prefix('武器') @@ -178,57 +178,57 @@ async def send_weapon(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - level = re.findall(r"[0-9]+", message) + level = re.findall(r'[0-9]+', message) if len(level) == 1: im = await weapon_wiki(name, level=level[0]) else: im = await weapon_wiki(name) await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送武器信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送武器信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取武器信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取武器信息错误') @sv.on_prefix('角色') async def send_char(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - message = message.replace(' ', "") + message = message.replace(' ', '') name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - level = re.findall(r"[0-9]+", message) + level = re.findall(r'[0-9]+', message) if len(level) == 1: - im = await char_wiki(name, "char", level=level[0]) + im = await char_wiki(name, 'char', level=level[0]) else: im = await char_wiki(name) await bot.send(ev, im) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送角色信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送角色信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取角色信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取角色信息错误') @sv.on_prefix('命座') async def send_polar(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - num = int(re.findall(r"\d+", message)[0]) # str + num = int(re.findall(r'\d+', message)[0]) # str m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) if num <= 0 or num > 6: - await bot.send(ev, "你家{}有{}命?".format(m, num), at_sender=True) + await bot.send(ev, '你家{}有{}命?'.format(m, num), at_sender=True) else: - im = await char_wiki(m, "constellations", num) + im = await char_wiki(m, 'constellations', num) await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送命座信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送命座信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("获取命座信息错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('获取命座信息错误') # 每日零点清空cookies使用缓存 @@ -244,23 +244,23 @@ async def draw_event(): @sv.on_fullmatch('开始获取米游币') async def send_mihoyo_coin(bot: HoshinoBot, ev: CQEvent): - await bot.send(ev, "开始操作……", at_sender=True) + await bot.send(ev, '开始操作……', at_sender=True) try: - qid = ev.sender["user_id"] + qid = ev.sender['user_id'] im_mes = await mihoyo_coin(int(qid)) im = im_mes except TypeError or AttributeError: - im = "没有找到绑定信息。" - logger.exception("获取米游币失败") + im = '没有找到绑定信息。' + logger.exception('获取米游币失败') except Exception as e: - im = "发生错误 {},请检查后台输出。".format(e) - logger.exception("获取米游币失败") + im = '发生错误 {},请检查后台输出。'.format(e) + logger.exception('获取米游币失败') finally: try: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e.info['wording'])) - logger.exception("发送签到信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e.info['wording'])) + logger.exception('发送签到信息失败') @sv.on_fullmatch('全部重签') @@ -268,13 +268,13 @@ async def _(bot: HoshinoBot, ev: CQEvent): try: if ev.user_id not in bot.config.SUPERUSERS: return - await bot.send(ev, "已开始执行") + await bot.send(ev, '已开始执行') await daily_sign() except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) except Exception as e: traceback.print_exc() - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) @sv.on_fullmatch('全部重获取') @@ -282,32 +282,32 @@ async def bbscoin_resign(bot: HoshinoBot, ev: CQEvent): try: if ev.user_id not in bot.config.SUPERUSERS: return - await bot.send(ev, "已开始执行") + await bot.send(ev, '已开始执行') await daily_mihoyo_bbs_sign() except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) except Exception as e: traceback.print_exc() - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) # 每隔半小时检测树脂是否超过设定值 -@sv.scheduled_job('cron', minute="*/30") +@sv.scheduled_job('cron', minute='*/30') async def push(): daily_data = await daily() if daily_data is not None: for i in daily_data: - if i['gid'] == "on": + if i['gid'] == 'on': await hoshino_bot.send_private_msg(user_id=i['qid'], message=i['message']) else: - await hoshino_bot.send_group_msg(group_id=i['gid'], message=f"[CQ:at,qq={i['qid']}]" - + "\n" + i['message']) + await hoshino_bot.send_group_msg(group_id=i['gid'], message=f'[CQ:at,qq={i["qid"]}]' + + '\n' + i['message']) else: pass # 每日零点半进行米游社签到 -@sv.scheduled_job('cron', hour='0', minute="30") +@sv.scheduled_job('cron', hour='0', minute='30') async def daily_sign_schedule(): await daily_sign() @@ -316,64 +316,64 @@ async def daily_sign(): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() cursor = c.execute( - "SELECT * FROM NewCookiesTable WHERE StatusB != ?", ("off",)) + 'SELECT * FROM NewCookiesTable WHERE StatusB != ?', ('off',)) c_data = cursor.fetchall() temp_list = [] for row in c_data: im = await sign(str(row[0])) - if row[4] == "on": + if row[4] == 'on': try: await hoshino_bot.send_private_msg(user_id=row[2], message=im) except: - logger.exception(f"{im} Error") + logger.exception(f'{im} Error') else: - message = f"[CQ:at,qq={row[2]}]\n{im}" - if await config_check("SignReportSimple"): + message = f'[CQ:at,qq={row[2]}]\n{im}' + if await config_check('SignReportSimple'): for i in temp_list: - if row[4] == i["push_group"]: - if im == "签到失败,请检查Cookies是否失效。" or im.startswith("网络有点忙,请稍后再试~!"): - i["failed"] += 1 - i["push_message"] += "\n" + message + if row[4] == i['push_group']: + if im == '签到失败,请检查Cookies是否失效。' or im.startswith('网络有点忙,请稍后再试~!'): + i['failed'] += 1 + i['push_message'] += '\n' + message else: - i["success"] += 1 + i['success'] += 1 break else: - if im == "签到失败,请检查Cookies是否失效。": - temp_list.append({"push_group": row[4], "push_message": message, "success": 0, "failed": 1}) + if im == '签到失败,请检查Cookies是否失效。': + temp_list.append({'push_group': row[4], 'push_message': message, 'success': 0, 'failed': 1}) else: - temp_list.append({"push_group": row[4], "push_message": "", "success": 1, "failed": 0}) + temp_list.append({'push_group': row[4], 'push_message': '', 'success': 1, 'failed': 0}) else: for i in temp_list: - if row[4] == i["push_group"] and i["num"] < 4: - i["push_message"] += "\n" + message - i["num"] += 1 + if row[4] == i['push_group'] and i['num'] < 4: + i['push_message'] += '\n' + message + i['num'] += 1 break else: - temp_list.append({"push_group": row[4], "push_message": message, "num": 1}) + temp_list.append({'push_group': row[4], 'push_message': message, 'num': 1}) await asyncio.sleep(6 + random.randint(1, 3)) - if await config_check("SignReportSimple"): + if await config_check('SignReportSimple'): for i in temp_list: try: - report = "以下为签到失败报告:{}".format(i["push_message"]) if i["push_message"] != "" else "" - await hoshino_bot.send_group_msg(group_id=i["push_group"], - message="今日自动签到已完成!\n本群共签到成功{}人," - "共签到失败{}人。{}".format(i["success"], i["failed"], report)) + report = '以下为签到失败报告:{}'.format(i['push_message']) if i['push_message'] != '' else '' + await hoshino_bot.send_group_msg(group_id=i['push_group'], + message='今日自动签到已完成!\n本群共签到成功{}人,' + '共签到失败{}人。{}'.format(i['success'], i['failed'], report)) except: - logger.exception("签到报告发送失败:{}".format(i["push_message"])) + logger.exception('签到报告发送失败:{}'.format(i['push_message'])) await asyncio.sleep(4 + random.randint(1, 3)) else: for i in temp_list: try: - await hoshino_bot.send_group_msg(group_id=i["push_group"], message=i["push_message"]) + await hoshino_bot.send_group_msg(group_id=i['push_group'], message=i['push_message']) except: - logger.exception("签到报告发送失败:{}".format(i["push_message"])) + logger.exception('签到报告发送失败:{}'.format(i['push_message'])) await asyncio.sleep(4 + random.randint(1, 3)) conn.close() return # 每日零点五十进行米游币获取 -@sv.scheduled_job('cron', hour='0', minute="50") +@sv.scheduled_job('cron', hour='0', minute='50') async def sign_at_night(): await daily_mihoyo_bbs_sign() @@ -382,11 +382,11 @@ async def daily_mihoyo_bbs_sign(): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() cursor = c.execute( - "SELECT * FROM NewCookiesTable WHERE StatusC != ?", ("off",)) + 'SELECT * FROM NewCookiesTable WHERE StatusC != ?', ('off',)) c_data = cursor.fetchall() logger.info(c_data) for row in c_data: - logger.info("正在执行{}".format(row[0])) + logger.info('正在执行{}'.format(row[0])) if row[8]: await asyncio.sleep(5 + random.randint(1, 3)) im = await mihoyo_coin(str(row[2]), str(row[8])) @@ -395,16 +395,16 @@ async def daily_mihoyo_bbs_sign(): await hoshino_bot.call_api(api='send_private_msg', user_id=row[2], message=im) except Exception: - logger.exception(f"{im} Error") - logger.info("已结束。") + logger.exception(f'{im} Error') + logger.info('已结束。') # 私聊事件 @hoshino_bot.on_message('private') async def setting(ctx): message = ctx['raw_message'] - sid = int(ctx["self_id"]) - userid = int(ctx["sender"]["user_id"]) + sid = int(ctx['self_id']) + userid = int(ctx['sender']['user_id']) gid = 0 if '添加 ' in message: try: @@ -414,80 +414,80 @@ async def setting(ctx): message=im) except ActionFailed as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="机器人发送消息失败:{}".format(e)) - logger.exception("发送Cookie校验信息失败") + message='机器人发送消息失败:{}'.format(e)) + logger.exception('发送Cookie校验信息失败') except Exception as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message='校验失败!请输入正确的Cookies!\n错误信息为{}'.format(e)) - logger.exception("Cookie校验失败") + logger.exception('Cookie校验失败') elif 'gs开启推送' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "on", "StatusA") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'on', 'StatusA') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except ActionFailed as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="机器人发送消息失败:{}".format(e)) - logger.exception("私聊)发送开启推送信息失败") + message='机器人发送消息失败:{}'.format(e)) + logger.exception('私聊)发送开启推送信息失败') except Exception: - await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") - logger.exception("开启推送失败") + await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message='未找到uid绑定记录。') + logger.exception('开启推送失败') elif 'gs关闭推送' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "off", "StatusA") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'off', 'StatusA') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except ActionFailed as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="机器人发送消息失败:{}".format(e)) - logger.exception("私聊)发送关闭推送信息失败") + message='机器人发送消息失败:{}'.format(e)) + logger.exception('私聊)发送关闭推送信息失败') except Exception: - await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") - logger.exception("关闭推送失败") - elif "gs开启自动米游币" in message: + await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message='未找到uid绑定记录。') + logger.exception('关闭推送失败') + elif 'gs开启自动米游币' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "off", "StatusC") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'off', 'StatusC') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im, at_sender=True) except Exception: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="未绑定uid信息!", at_sender=True) - elif "gs关闭自动米游币" in message: + message='未绑定uid信息!', at_sender=True) + elif 'gs关闭自动米游币' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "on", "StatusC") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'on', 'StatusC') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im, at_sender=True) except Exception: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="未绑定uid信息!", at_sender=True) + message='未绑定uid信息!', at_sender=True) elif 'gs开启自动签到' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "on", "StatusB") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'on', 'StatusB') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except ActionFailed as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="机器人发送消息失败:{}".format(e)) - logger.exception("私聊)发送开启自动签到信息失败") + message='机器人发送消息失败:{}'.format(e)) + logger.exception('私聊)发送开启自动签到信息失败') except Exception: traceback.print_exc() - await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") - logger.exception("开启自动签到失败") + await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message='未找到uid绑定记录。') + logger.exception('开启自动签到失败') elif 'gs关闭自动签到' in message: try: - uid = await select_db(userid, mode="uid") - im = await open_push(int(uid[0]), userid, "off", "StatusA") + uid = await select_db(userid, mode='uid') + im = await open_push(int(uid[0]), userid, 'off', 'StatusA') await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message=im) except ActionFailed as e: await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, - message="机器人发送消息失败:{}".format(e)) - logger.exception("私聊)发送关闭自动签到信息失败") + message='机器人发送消息失败:{}'.format(e)) + logger.exception('私聊)发送关闭自动签到信息失败') except Exception: traceback.print_exc() - await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message="未找到uid绑定记录。") - logger.exception("关闭自动签到失败") + await hoshino_bot.send_msg(self_id=sid, user_id=userid, group_id=gid, message='未找到uid绑定记录。') + logger.exception('关闭自动签到失败') # 群聊开启 自动签到 和 推送树脂提醒 功能 @@ -497,57 +497,57 @@ async def open_switch_func(bot: HoshinoBot, ev: CQEvent): message = ev.message.extract_plain_text() m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - qid = ev.sender["user_id"] - at = re.search(r"\[CQ:at,qq=(\d*)]", message) + qid = ev.sender['user_id'] + at = re.search(r'\[CQ:at,qq=(\d*)]', message) - if m == "自动签到": + if m == '自动签到': try: if at: if at and at.group(1) != qid: - await bot.send(ev, "你没有权限。", at_sender=True) + await bot.send(ev, '你没有权限。', at_sender=True) return gid = ev.group_id - uid = await select_db(ev.sender['user_id'], mode="uid") - im = await open_push(int(uid[0]), ev.sender['user_id'], str(gid), "StatusB") + uid = await select_db(ev.sender['user_id'], mode='uid') + im = await open_push(int(uid[0]), ev.sender['user_id'], str(gid), 'StatusB') await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送开启自动签到信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送开启自动签到信息失败') except Exception: - await bot.send(ev, "未绑定uid信息!", at_sender=True) - logger.exception("开启自动签到失败") - elif m == "推送": + await bot.send(ev, '未绑定uid信息!', at_sender=True) + logger.exception('开启自动签到失败') + elif m == '推送': try: if at: if at and at.group(1) != qid: - await bot.send(ev, "你没有权限。", at_sender=True) + await bot.send(ev, '你没有权限。', at_sender=True) return gid = ev.group_id - uid = await select_db(ev.sender['user_id'], mode="uid") - im = await open_push(int(uid[0]), ev.sender['user_id'], str(gid), "StatusA") + uid = await select_db(ev.sender['user_id'], mode='uid') + im = await open_push(int(uid[0]), ev.sender['user_id'], str(gid), 'StatusA') await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送开启推送信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送开启推送信息失败') except Exception: - await bot.send(ev, "未绑定uid信息!", at_sender=True) - logger.exception("开启推送失败") - elif m == "简洁签到报告": + await bot.send(ev, '未绑定uid信息!', at_sender=True) + logger.exception('开启推送失败') + elif m == '简洁签到报告': try: if qid in bot.config.SUPERUSERS: - _ = await config_check("SignReportSimple", "OPEN") - await bot.send(ev, "成功!", at_sender=True) + _ = await config_check('SignReportSimple', 'OPEN') + await bot.send(ev, '成功!', at_sender=True) else: return except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送设置成功信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送设置成功信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("设置简洁签到报告失败") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('设置简洁签到报告失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("开启功能失败") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('开启功能失败') # 群聊关闭 自动签到 和 推送树脂提醒 功能 @@ -557,87 +557,87 @@ async def close_switch_func(bot: HoshinoBot, ev: CQEvent): message = ev.message.extract_plain_text() m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - qid = ev.sender["user_id"] - at = re.search(r"\[CQ:at,qq=(\d*)]", message) + qid = ev.sender['user_id'] + at = re.search(r'\[CQ:at,qq=(\d*)]', message) - if m == "自动签到": + if m == '自动签到': try: if at: if at and at.group(1) != qid: - await bot.send(ev, "你没有权限。", at_sender=True) + await bot.send(ev, '你没有权限。', at_sender=True) return - uid = await select_db(ev.sender['user_id'], mode="uid") - im = await open_push(int(uid[0]), ev.sender['user_id'], "off", "StatusB") + uid = await select_db(ev.sender['user_id'], mode='uid') + im = await open_push(int(uid[0]), ev.sender['user_id'], 'off', 'StatusB') await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送关闭自动签到信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送关闭自动签到信息失败') except Exception: - await bot.send(ev, "未绑定uid信息!", at_sender=True) - logger.exception("关闭自动签到失败") - elif m == "推送": + await bot.send(ev, '未绑定uid信息!', at_sender=True) + logger.exception('关闭自动签到失败') + elif m == '推送': try: if at: if at and at.group(1) != qid: - await bot.send(ev, "你没有权限。", at_sender=True) + await bot.send(ev, '你没有权限。', at_sender=True) return - uid = await select_db(ev.sender['user_id'], mode="uid") - im = await open_push(int(uid[0]), ev.sender['user_id'], "off", "StatusA") + uid = await select_db(ev.sender['user_id'], mode='uid') + im = await open_push(int(uid[0]), ev.sender['user_id'], 'off', 'StatusA') await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送关闭推送信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送关闭推送信息失败') except Exception: - await bot.send(ev, "未绑定uid信息!", at_sender=True) - logger.exception("关闭推送失败") - elif m == "简洁签到报告": + await bot.send(ev, '未绑定uid信息!', at_sender=True) + logger.exception('关闭推送失败') + elif m == '简洁签到报告': try: if qid in bot.config.SUPERUSERS: - _ = await config_check("SignReportSimple", "CLOSED") - await bot.send(ev, "成功!", at_sender=True) + _ = await config_check('SignReportSimple', 'CLOSED') + await bot.send(ev, '成功!', at_sender=True) else: return except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送设置成功信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送设置成功信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("设置简洁签到报告失败") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('设置简洁签到报告失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("关闭功能失败") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('关闭功能失败') # 群聊内 每月统计 功能 @sv.on_fullmatch('每月统计') async def send_monthly_data(bot: HoshinoBot, ev: CQEvent): try: - uid = await select_db(ev.sender['user_id'], mode="uid") + uid = await select_db(ev.sender['user_id'], mode='uid') uid = uid[0] im = await award(uid) await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送每月统计信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送每月统计信息失败') except Exception: await bot.send(ev, '未找到绑定信息', at_sender=True) - logger.exception("获取每月统计失败") + logger.exception('获取每月统计失败') # 群聊内 签到 功能 @sv.on_fullmatch('签到') async def get_sing_func(bot: HoshinoBot, ev: CQEvent): try: - uid = await select_db(ev.sender['user_id'], mode="uid") + uid = await select_db(ev.sender['user_id'], mode='uid') uid = uid[0] im = await sign(uid) await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送签到信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送签到信息失败') except Exception: await bot.send(ev, '未找到绑定信息', at_sender=True) - logger.exception("签到失败") + logger.exception('签到失败') # 群聊内 校验Cookies 是否正常的功能,不正常自动删掉 @@ -649,35 +649,35 @@ async def check_cookies(bot: HoshinoBot, ev: CQEvent): await bot.send(ev, im) for i in raw_mes[1]: await bot.send_private_msg(user_id=i[0], - message="您绑定的Cookies(uid{})已失效,以下功能将会受到影响:\n查看完整信息列表\n" - "查看深渊配队\n自动签到/当前状态/每月统计\n" - "请及时重新绑定Cookies并重新开关相应功能。".format(i[1])) + message='您绑定的Cookies(uid{})已失效,以下功能将会受到影响:\n查看完整信息列表\n' + '查看深渊配队\n自动签到/当前状态/每月统计\n' + '请及时重新绑定Cookies并重新开关相应功能。'.format(i[1])) await asyncio.sleep(3 + random.randint(1, 3)) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送Cookie校验信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送Cookie校验信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("Cookie校验错误") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('Cookie校验错误') # 群聊内 查询当前树脂状态以及派遣状态 的命令 @sv.on_fullmatch('当前状态') async def send_daily_data(bot: HoshinoBot, ev: CQEvent): try: - uid = await select_db(ev.sender['user_id'], mode="uid") + uid = await select_db(ev.sender['user_id'], mode='uid') uid = uid[0] - mes = await daily("ask", uid) + mes = await daily('ask', uid) im = mes[0]['message'] except Exception: - im = "没有找到绑定信息。" - logger.exception("获取当前状态失败") + im = '没有找到绑定信息。' + logger.exception('获取当前状态失败') try: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送当前状态信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送当前状态信息失败') # 图片版信息 @@ -685,96 +685,96 @@ async def send_daily_data(bot: HoshinoBot, ev: CQEvent): async def send_genshin_info(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - uid = await select_db(ev.sender['user_id'], mode="uid") + uid = await select_db(ev.sender['user_id'], mode='uid') uid = uid[0] - image = re.search(r"\[CQ:image,file=(.*),url=(.*)]", message) + image = re.search(r'\[CQ:image,file=(.*),url=(.*)]', message) im = await draw_info_pic(uid, image) try: await bot.send(ev, MessageSegment.image(im), at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送当前信息信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送当前信息信息失败') except Exception: - im = "没有找到绑定信息。" + im = '没有找到绑定信息。' await bot.send(ev, im, at_sender=True) - logger.exception("获取当前信息失败") + logger.exception('获取当前信息失败') # 群聊内 查询uid 的命令 @sv.on_prefix('uid') async def send_uid_info(bot: HoshinoBot, ev: CQEvent): try: - image = re.search(r"\[CQ:image,file=(.*),url=(.*)]", str(ev.message)) + image = re.search(r'\[CQ:image,file=(.*),url=(.*)]', str(ev.message)) message = ev.message.extract_plain_text() - uid = re.findall(r"\d+", message)[0] # str + uid = re.findall(r'\d+', message)[0] # str m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - if m == "深渊": + if m == '深渊': try: - if len(re.findall(r"\d+", message)) == 2: - floor_num = re.findall(r"\d+", message)[1] + if len(re.findall(r'\d+', message)) == 2: + floor_num = re.findall(r'\d+', message)[1] im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: im = await draw_abyss0_pic(uid, ev.sender['nickname'], image) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("深渊数据获取失败(数据状态问题)") - elif m == "上期深渊": + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('深渊数据获取失败(数据状态问题)') + elif m == '上期深渊': try: - if len(re.findall(r"\d+", message)) == 2: - floor_num = re.findall(r"\d+", message)[1] - im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image, 2, "2") - if im.startswith("base64://"): + if len(re.findall(r'\d+', message)) == 2: + floor_num = re.findall(r'\d+', message)[1] + im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image, 2, '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: - im = await draw_abyss0_pic(uid, ev.sender['nickname'], image, 2, "2") - if im.startswith("base64://"): + im = await draw_abyss0_pic(uid, ev.sender['nickname'], image, 2, '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid上期深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid上期深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("上期深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('上期深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("上期深渊数据获取失败(数据状态问题)") + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('上期深渊数据获取失败(数据状态问题)') else: try: im = await draw_pic(uid, ev.sender['nickname'], image, 2) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("数据获取失败(数据状态问题)") + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('数据获取失败(数据状态问题)') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("uid查询异常") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('uid查询异常') # 群聊内 绑定uid 的命令,会绑定至当前qq号上 @@ -782,15 +782,15 @@ async def send_uid_info(bot: HoshinoBot, ev: CQEvent): async def link_uid_to_qq(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - uid = re.findall(r"\d+", message)[0] # str + uid = re.findall(r'\d+', message)[0] # str await connect_db(ev.sender['user_id'], uid) await bot.send(ev, '绑定uid成功!', at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送绑定信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送绑定信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("绑定uid异常") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('绑定uid异常') # 群聊内 绑定米游社通行证 的命令,会绑定至当前qq号上,和绑定uid不冲突,两者可以同时绑定 @@ -798,28 +798,28 @@ async def link_uid_to_qq(bot: HoshinoBot, ev: CQEvent): async def link_mihoyo_bbs_to_qq(bot: HoshinoBot, ev: CQEvent): try: message = ev.message.extract_plain_text() - mys = re.findall(r"\d+", message)[0] # str + mys = re.findall(r'\d+', message)[0] # str await connect_db(ev.sender['user_id'], None, mys) await bot.send(ev, '绑定米游社id成功!', at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送绑定信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送绑定信息失败') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("绑定米游社通行证异常") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('绑定米游社通行证异常') # 群聊内 绑定过uid/mysid的情况下,可以查询,默认优先调用米游社通行证,多出世界等级一个参数 @sv.on_prefix('查询') async def get_info(bot, ev): try: - image = re.search(r"\[CQ:image,file=(.*),url=(.*)]", str(ev.message)) - at = re.search(r"\[CQ:at,qq=(\d*)]", str(ev.raw_message.strip())) + image = re.search(r'\[CQ:image,file=(.*),url=(.*)]', str(ev.message)) + at = re.search(r'\[CQ:at,qq=(\d*)]', str(ev.raw_message.strip())) message = ev.message.extract_plain_text() if at: qid = at.group(1) mi = await bot.get_group_member_info(group_id=ev.group_id, user_id=qid) - nickname = mi["nickname"] + nickname = mi['nickname'] uid = await select_db(qid) else: nickname = ev.sender['nickname'] @@ -827,170 +827,170 @@ async def get_info(bot, ev): m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) if uid: - if m == "深渊": + if m == '深渊': try: - if len(re.findall(r"\d+", message)) == 1: - floor_num = re.findall(r"\d+", message)[0] + if len(re.findall(r'\d+', message)) == 1: + floor_num = re.findall(r'\d+', message)[0] im = await draw_abyss_pic(uid[0], nickname, floor_num, image, uid[1]) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: im = await draw_abyss0_pic(uid[0], nickname, image, uid[1]) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("深渊数据获取失败(数据状态问题)") - elif m == "上期深渊": + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('深渊数据获取失败(数据状态问题)') + elif m == '上期深渊': try: - if len(re.findall(r"\d+", message)) == 1: - floor_num = re.findall(r"\d+", message)[0] - im = await draw_abyss_pic(uid[0], nickname, floor_num, image, uid[1], "2") - if im.startswith("base64://"): + if len(re.findall(r'\d+', message)) == 1: + floor_num = re.findall(r'\d+', message)[0] + im = await draw_abyss_pic(uid[0], nickname, floor_num, image, uid[1], '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: - im = await draw_abyss0_pic(uid[0], nickname, image, uid[1], "2") - if im.startswith("base64://"): + im = await draw_abyss0_pic(uid[0], nickname, image, uid[1], '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid上期深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid上期深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("上期深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('上期深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("上期深渊数据获取失败(数据状态问题)") - elif m == "词云": + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('上期深渊数据获取失败(数据状态问题)') + elif m == '词云': try: im = await draw_word_cloud(uid[0], image, uid[1]) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid词云信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid词云信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("词云数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('词云数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("词云数据获取失败(数据状态问题)") - elif m == "": + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('词云数据获取失败(数据状态问题)') + elif m == '': try: im = await draw_pic(uid[0], nickname, image, uid[1]) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送uid信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送uid信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('数据获取失败(Cookie失效/不公开信息)') except ClientConnectorError: - await bot.send(ev, "获取失败:连接超时") - logger.exception("连接超时") + await bot.send(ev, '获取失败:连接超时') + logger.exception('连接超时') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("数据获取失败(数据状态问题)") + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('数据获取失败(数据状态问题)') else: pass else: await bot.send(ev, '未找到绑定记录!') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("查询异常") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('查询异常') # 群聊内 查询米游社通行证 的命令 @sv.on_prefix('mys') async def send_mihoyo_bbs_info(bot: HoshinoBot, ev: CQEvent): try: - image = re.search(r"\[CQ:image,file=(.*),url=(.*)]", str(ev.message)) + image = re.search(r'\[CQ:image,file=(.*),url=(.*)]', str(ev.message)) message = ev.message.extract_plain_text() - uid = re.findall(r"\d+", message)[0] # str + uid = re.findall(r'\d+', message)[0] # str m = ''.join(re.findall('[\u4e00-\u9fa5]', message)) - if m == "深渊": + if m == '深渊': try: - if len(re.findall(r"\d+", message)) == 2: - floor_num = re.findall(r"\d+", message)[1] + if len(re.findall(r'\d+', message)) == 2: + floor_num = re.findall(r'\d+', message)[1] im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image, 3) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: im = await draw_abyss0_pic(uid, ev.sender['nickname'], image, 3) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送米游社深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送米游社深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("深渊数据获取失败(数据状态问题)") - elif m == "上期深渊": + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('深渊数据获取失败(数据状态问题)') + elif m == '上期深渊': try: - if len(re.findall(r"\d+", message)) == 1: - floor_num = re.findall(r"\d+", message)[0] - im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image, 3, "2") - if im.startswith("base64://"): + if len(re.findall(r'\d+', message)) == 1: + floor_num = re.findall(r'\d+', message)[0] + im = await draw_abyss_pic(uid, ev.sender['nickname'], floor_num, image, 3, '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) else: - im = await draw_abyss0_pic(uid, ev.sender['nickname'], image, 3, "2") - if im.startswith("base64://"): + im = await draw_abyss0_pic(uid, ev.sender['nickname'], image, 3, '2') + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送米游社上期深渊信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送米游社上期深渊信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("上期深渊数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('上期深渊数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("上期深渊数据获取失败(数据状态问题)") + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('上期深渊数据获取失败(数据状态问题)') else: try: im = await draw_pic(uid, ev.sender['nickname'], image, 3) - if im.startswith("base64://"): + if im.startswith('base64://'): await bot.send(ev, MessageSegment.image(im), at_sender=True) else: await bot.send(ev, im, at_sender=True) except ActionFailed as e: - await bot.send(ev, "机器人发送消息失败:{}".format(e)) - logger.exception("发送米游社信息失败") + await bot.send(ev, '机器人发送消息失败:{}'.format(e)) + logger.exception('发送米游社信息失败') except TypeError: - await bot.send(ev, "获取失败,可能是Cookies失效或者未打开米游社角色详情开关。") - logger.exception("米游社数据获取失败(Cookie失效/不公开信息)") + await bot.send(ev, '获取失败,可能是Cookies失效或者未打开米游社角色详情开关。') + logger.exception('米游社数据获取失败(Cookie失效/不公开信息)') except Exception as e: - await bot.send(ev, "获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。".format(e)) - logger.exception("米游社数据获取失败(数据状态问题)") + await bot.send(ev, '获取失败,有可能是数据状态有问题,\n{}\n请检查后台输出。'.format(e)) + logger.exception('米游社数据获取失败(数据状态问题)') except Exception as e: - await bot.send(ev, "发生错误 {},请检查后台输出。".format(e)) - logger.exception("米游社查询异常") + await bot.send(ev, '发生错误 {},请检查后台输出。'.format(e)) + logger.exception('米游社查询异常') diff --git a/mihoyo_libs/get_data.py b/mihoyo_libs/get_data.py index e5ca7e70..83c931d8 100644 --- a/mihoyo_libs/get_data.py +++ b/mihoyo_libs/get_data.py @@ -14,38 +14,38 @@ from aiohttp import ClientSession from httpx import AsyncClient from nonebot import logger -mhyVersion = "2.11.1" +mhyVersion = '2.11.1' BASE_PATH = os.path.dirname(__file__) BASE2_PATH = os.path.join(BASE_PATH, 'mihoyo_bbs') INDEX_PATH = os.path.join(BASE2_PATH, 'index') -async def config_check(func, mode="CHECK"): +async def config_check(func, mode='CHECK'): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS Config + c.execute("""CREATE TABLE IF NOT EXISTS Config (Name TEXT PRIMARY KEY NOT NULL, Status TEXT, GroupList TEXT, - Extra TEXT);''') - c.execute("INSERT OR IGNORE INTO Config (Name,Status) \ - VALUES (?, ?)", (func, "on")) - if mode == "CHECK": - cursor = c.execute("SELECT * from Config WHERE Name = ?", (func,)) + Extra TEXT);""") + c.execute('INSERT OR IGNORE INTO Config (Name,Status) \ + VALUES (?, ?)', (func, 'on')) + if mode == 'CHECK': + cursor = c.execute('SELECT * from Config WHERE Name = ?', (func,)) c_data = cursor.fetchall() conn.close() - if c_data[0][1] != "off": + if c_data[0][1] != 'off': return True else: return False - elif mode == "OPEN": - c.execute("UPDATE Config SET Status = ? WHERE Name=?", ("on", func)) + elif mode == 'OPEN': + c.execute('UPDATE Config SET Status = ? WHERE Name=?', ('on', func)) conn.commit() conn.close() return True - elif mode == "CLOSED": - c.execute("UPDATE Config SET Status = ? WHERE Name=?", ("off", func)) + elif mode == 'CLOSED': + c.execute('UPDATE Config SET Status = ? WHERE Name=?', ('off', func)) conn.commit() conn.close() return True @@ -54,30 +54,30 @@ async def config_check(func, mode="CHECK"): async def get_a_lots(qid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS UseridDict + c.execute("""CREATE TABLE IF NOT EXISTS UseridDict (QID INT PRIMARY KEY NOT NULL, lots TEXT, cache TEXT, permission TEXT, Status TEXT, Subscribe TEXT, - Extra TEXT);''') - cursor = c.execute("SELECT * from UseridDict WHERE QID = ?", (qid,)) + Extra TEXT);""") + cursor = c.execute('SELECT * from UseridDict WHERE QID = ?', (qid,)) c_data = cursor.fetchall() - with open(os.path.join(INDEX_PATH, 'lots.txt'), "r") as f: + with open(os.path.join(INDEX_PATH, 'lots.txt'), 'r') as f: raw_data = f.read() - raw_data = raw_data.replace(' ', "").split('-') + raw_data = raw_data.replace(' ', '').split('-') if len(c_data) == 0: num = random.randint(1, len(raw_data) - 1) data = raw_data[num] - c.execute("INSERT OR IGNORE INTO UseridDict (QID,lots) \ - VALUES (?, ?)", (qid, str(num))) + c.execute('INSERT OR IGNORE INTO UseridDict (QID,lots) \ + VALUES (?, ?)', (qid, str(num))) else: if c_data[0][1] is None: num = random.randint(0, len(raw_data) - 1) data = raw_data[num] - c.execute("UPDATE UseridDict SET lots = ? WHERE QID=?", (str(num), qid)) + c.execute('UPDATE UseridDict SET lots = ? WHERE QID=?', (str(num), qid)) else: num = int(c_data[0][1]) data = raw_data[num] @@ -89,18 +89,18 @@ async def get_a_lots(qid): async def open_push(uid, qid, status, mode): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * from NewCookiesTable WHERE UID = ?', (uid,)) c_data = cursor.fetchall() if len(c_data) != 0: try: - c.execute("UPDATE NewCookiesTable SET {s} = ?,QID = ? WHERE UID=?".format(s=mode), (status, qid, uid)) + c.execute('UPDATE NewCookiesTable SET {s} = ?,QID = ? WHERE UID=?'.format(s=mode), (status, qid, uid)) conn.commit() conn.close() - return "成功!" + return '成功!' except: - return "未找到Ck绑定记录。" + return '未找到Ck绑定记录。' else: - return "未找到Ck绑定记录。" + return '未找到Ck绑定记录。' async def check_db(): @@ -108,24 +108,24 @@ async def check_db(): invalid_list = [] conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT UID,Cookies,QID from NewCookiesTable") + cursor = c.execute('SELECT UID,Cookies,QID from NewCookiesTable') c_data = cursor.fetchall() for row in c_data: try: - aid = re.search(r"account_id=(\d*)", row[1]) + aid = re.search(r'account_id=(\d*)', row[1]) mihoyo_id_data = aid.group(0).split('=') mihoyo_id = mihoyo_id_data[1] mys_data = await get_mihoyo_bbs_info(mihoyo_id, row[1]) for i in mys_data['data']['list']: if i['game_id'] != 2: mys_data['data']['list'].remove(i) - return_str = return_str + f"uid{row[0]}/mys{mihoyo_id}的Cookies是正常的!\n" + return_str = return_str + f'uid{row[0]}/mys{mihoyo_id}的Cookies是正常的!\n' except: - return_str = return_str + f"uid{row[0]}的Cookies是异常的!已删除该条Cookies!\n" + return_str = return_str + f'uid{row[0]}的Cookies是异常的!已删除该条Cookies!\n' invalid_list.append([row[2], row[0]]) - c.execute("DELETE from NewCookiesTable where UID=?", (row[0],)) + c.execute('DELETE from NewCookiesTable where UID=?', (row[0],)) try: - c.execute("DELETE from CookiesCache where Cookies=?", (row[1],)) + c.execute('DELETE from CookiesCache where Cookies=?', (row[1],)) except: pass conn.commit() @@ -136,29 +136,29 @@ async def check_db(): async def connect_db(userid, uid=None, mys=None): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS UIDDATA + c.execute("""CREATE TABLE IF NOT EXISTS UIDDATA (USERID INT PRIMARY KEY NOT NULL, UID TEXT, - MYSID TEXT);''') + MYSID TEXT);""") - c.execute("INSERT OR IGNORE INTO UIDDATA (USERID,UID,MYSID) \ - VALUES (?, ?,?)", (userid, uid, mys)) + c.execute('INSERT OR IGNORE INTO UIDDATA (USERID,UID,MYSID) \ + VALUES (?, ?,?)', (userid, uid, mys)) if uid: - c.execute("UPDATE UIDDATA SET UID = ? WHERE USERID=?", (uid, userid)) + c.execute('UPDATE UIDDATA SET UID = ? WHERE USERID=?', (uid, userid)) if mys: - c.execute("UPDATE UIDDATA SET MYSID = ? WHERE USERID=?", (mys, userid)) + c.execute('UPDATE UIDDATA SET MYSID = ? WHERE USERID=?', (mys, userid)) conn.commit() conn.close() -async def select_db(userid, mode="auto"): +async def select_db(userid, mode='auto'): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - cursor = c.execute("SELECT * FROM UIDDATA WHERE USERID = ?", (userid,)) + cursor = c.execute('SELECT * FROM UIDDATA WHERE USERID = ?', (userid,)) for row in cursor: - if mode == "auto": + if mode == 'auto': if row[0]: if row[2]: return [row[2], 3] @@ -168,123 +168,123 @@ async def select_db(userid, mode="auto"): return None else: return None - elif mode == "uid": + elif mode == 'uid': return [row[1], 2] - elif mode == "mys": + elif mode == 'mys': return [row[2], 3] async def delete_cache(): try: - copyfile("ID_DATA.db", "ID_DATA_bak.db") - logger.info("————数据库成功备份————") + copyfile('ID_DATA.db', 'ID_DATA_bak.db') + logger.info('————数据库成功备份————') except: - logger.info("————数据库备份失败————") + logger.info('————数据库备份失败————') try: conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute("DROP TABLE CookiesCache") - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Extra=?", (None, "limit30")) - c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache + c.execute('DROP TABLE CookiesCache') + c.execute('UPDATE NewCookiesTable SET Extra = ? WHERE Extra=?', (None, 'limit30')) + c.execute("""CREATE TABLE IF NOT EXISTS CookiesCache (UID TEXT PRIMARY KEY, MYSID TEXT, - Cookies TEXT);''') + Cookies TEXT);""") conn.commit() conn.close() - logger.info("————UID查询缓存已清空————") + logger.info('————UID查询缓存已清空————') except: - logger.info("\nerror\n") + logger.info('\nerror\n') try: conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute("UPDATE UseridDict SET lots=NULL") + c.execute('UPDATE UseridDict SET lots=NULL') conn.commit() conn.close() - logger.info("————御神签缓存已清空————") + logger.info('————御神签缓存已清空————') except: - logger.info("\nerror\n") + logger.info('\nerror\n') def error_db(ck, err): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - if err == "error": - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?", ("error", ck)) - elif err == "limit30": - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?", ("limit30", ck)) + if err == 'error': + c.execute('UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?', ('error', ck)) + elif err == 'limit30': + c.execute('UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?', ('limit30', ck)) def cache_db(uid, mode=1, mys=None): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache + c.execute("""CREATE TABLE IF NOT EXISTS CookiesCache (UID TEXT PRIMARY KEY, MYSID TEXT, - Cookies TEXT);''') + Cookies TEXT);""") if mode == 1: if mys: - cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?", (mys,)) + cursor = c.execute('SELECT * FROM CookiesCache WHERE MYSID = ?', (mys,)) else: - cursor = c.execute("SELECT * FROM CookiesCache WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * FROM CookiesCache WHERE UID = ?', (uid,)) else: - cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?", (uid,)) + cursor = c.execute('SELECT * FROM CookiesCache WHERE MYSID = ?', (uid,)) c_data = cursor.fetchall() if len(c_data) == 0: if mode == 2: - conn.create_function("REGEXP", 2, regex_func) - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE REGEXP(Cookies, ?)", (uid,)) + conn.create_function('REGEXP', 2, regex_func) + cursor = c.execute('SELECT * FROM NewCookiesTable WHERE REGEXP(Cookies, ?)', (uid,)) d_data = cursor.fetchall() else: - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * FROM NewCookiesTable WHERE UID = ?', (uid,)) d_data = cursor.fetchall() if len(d_data) != 0: - if d_data[0][7] != "error": + if d_data[0][7] != 'error': use = d_data[0][1] if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)", (use, uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)', (use, uid)) elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)", (use, uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)', (use, uid)) else: - cookies_row = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") + cookies_row = c.execute('SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1') e_data = cookies_row.fetchall() if len(e_data) != 0: if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)", (e_data[0][1], uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)', (e_data[0][1], uid)) elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)", (e_data[0][1], uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)', (e_data[0][1], uid)) use = e_data[0][1] else: - return "没有可以使用的Cookies!" + return '没有可以使用的Cookies!' else: - cookies_row = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") + cookies_row = c.execute('SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1') e_data = cookies_row.fetchall() if len(e_data) != 0: if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)", (e_data[0][1], uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)', (e_data[0][1], uid)) elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)", (e_data[0][1], uid)) + c.execute('INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)', (e_data[0][1], uid)) use = e_data[0][1] else: - return "没有可以使用的Cookies!" + return '没有可以使用的Cookies!' else: use = c_data[0][2] if mys: try: - c.execute("UPDATE CookiesCache SET UID = ? WHERE MYSID=?", (uid, mys)) + c.execute('UPDATE CookiesCache SET UID = ? WHERE MYSID=?', (uid, mys)) except: - c.execute("UPDATE CookiesCache SET MYSID = ? WHERE UID=?", (mys, uid)) + c.execute('UPDATE CookiesCache SET MYSID = ? WHERE UID=?', (mys, uid)) conn.commit() conn.close() @@ -292,7 +292,7 @@ def cache_db(uid, mode=1, mys=None): def regex_func(value, patter): - c_pattern = re.compile(r"account_id={}".format(patter)) + c_pattern = re.compile(r'account_id={}'.format(patter)) return c_pattern.search(value) is not None @@ -300,7 +300,7 @@ async def cookies_db(uid, cookies, qid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable + c.execute("""CREATE TABLE IF NOT EXISTS NewCookiesTable (UID INT PRIMARY KEY NOT NULL, Cookies TEXT, QID INT, @@ -308,15 +308,15 @@ async def cookies_db(uid, cookies, qid): StatusB TEXT, StatusC TEXT, NUM INT, - Extra TEXT);''') + Extra TEXT);""") - cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * from NewCookiesTable WHERE UID = ?', (uid,)) c_data = cursor.fetchall() if len(c_data) == 0: - c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM,QID) \ - VALUES (?, ?,?,?,?,?,?)", (cookies, uid, "off", "off", "off", 140, qid)) + c.execute('INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM,QID) \ + VALUES (?, ?,?,?,?,?,?)', (cookies, uid, 'off', 'off', 'off', 140, qid)) else: - c.execute("UPDATE NewCookiesTable SET Cookies = ? WHERE UID=?", (cookies, uid)) + c.execute('UPDATE NewCookiesTable SET Cookies = ? WHERE UID=?', (cookies, uid)) conn.commit() conn.close() @@ -327,10 +327,10 @@ async def stoken_db(s_cookies, uid): c = conn.cursor() columns = [i[1] for i in c.execute('PRAGMA table_info(NewCookiesTable)')] - if "Stoken" not in columns: + if 'Stoken' not in columns: c.execute('ALTER TABLE NewCookiesTable ADD COLUMN Stoken TEXT') - c.execute("UPDATE NewCookiesTable SET Stoken = ? WHERE UID=?", (s_cookies, int(uid))) + c.execute('UPDATE NewCookiesTable SET Stoken = ? WHERE UID=?', (s_cookies, int(uid))) conn.commit() conn.close() @@ -340,7 +340,7 @@ async def get_stoken(uid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() try: - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * FROM NewCookiesTable WHERE UID = ?', (uid,)) c_data = cursor.fetchall() stoken = c_data[0][8] except: @@ -353,7 +353,7 @@ async def owner_cookies(uid): conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() try: - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,)) + cursor = c.execute('SELECT * FROM NewCookiesTable WHERE UID = ?', (uid,)) c_data = cursor.fetchall() cookies = c_data[0][1] except: @@ -365,7 +365,7 @@ async def owner_cookies(uid): def random_hex(length): result = hex(random.randint(0, 16 ** length)).replace('0x', '').upper() if len(result) < length: - result = "0" * (length - len(result)) + result + result = '0' * (length - len(result)) + result return result @@ -377,58 +377,58 @@ def md5(text): def old_version_get_ds_token(mysbbs=False): if mysbbs: - n = "fd3ykrh7o1j54g581upo1tvpam0dsgtf" + n = 'fd3ykrh7o1j54g581upo1tvpam0dsgtf' else: - n = "h8w582wxwgqvahcdkpvdhbh2w9casgfl" + n = 'h8w582wxwgqvahcdkpvdhbh2w9casgfl' i = str(int(time.time())) r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) - c = md5("salt=" + n + "&t=" + i + "&r=" + r) - return i + "," + r + "," + c + c = md5('salt=' + n + '&t=' + i + '&r=' + r) + return i + ',' + r + ',' + c -def get_ds_token(q="", b=None): +def get_ds_token(q='', b=None): if b: br = json.dumps(b) else: - br = "" - s = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs" + br = '' + s = 'xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs' t = str(int(time.time())) r = str(random.randint(100000, 200000)) - c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q) - return t + "," + r + "," + c + c = md5('salt=' + s + '&t=' + t + '&r=' + r + '&b=' + br + '&q=' + q) + return t + ',' + r + ',' + c async def get_stoken_by_login_ticket(loginticket, mys_id): async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket", + url='https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket', params={ - "login_ticket": loginticket, - "token_types": "3", - "uid": mys_id + 'login_ticket': loginticket, + 'token_types' : '3', + 'uid' : mys_id } ) return req.json() -async def get_daily_data(uid, server_id="cn_gf01"): +async def get_daily_data(uid, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/dailyNote", + url='https://api-takumi.mihoyo.com/game_record/app/genshin/api/dailyNote', headers={ - 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'DS' : get_ds_token('role_id=' + uid + '&server=' + server_id), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": await owner_cookies(uid)}, + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : await owner_cookies(uid)}, params={ - "server": server_id, - "role_id": uid + 'server' : server_id, + 'role_id': uid } ) data = json.loads(req.text) @@ -437,26 +437,26 @@ async def get_daily_data(uid, server_id="cn_gf01"): try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/dailyNote", + url='https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/dailyNote', headers={ - 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'DS' : get_ds_token('role_id=' + uid + '&server=' + server_id), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": await owner_cookies(uid)}, + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : await owner_cookies(uid)}, params={ - "server": server_id, - "role_id": uid + 'server' : server_id, + 'role_id': uid } ) data = json.loads(req.text) return data except json.decoder.JSONDecodeError: - logger.info("当前状态读取Api失败!") + logger.info('当前状态读取Api失败!') except Exception as e: - logger.info("访问每日信息失败,请重试!") + logger.info('访问每日信息失败,请重试!') logger.info(e.with_traceback) @@ -464,130 +464,130 @@ async def get_sign_list(): try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/home", + url='https://api-takumi.mihoyo.com/event/bbs_sign_reward/home', headers={ 'x-rpc-app_version': mhyVersion, - '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', + '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/'}, params={ - "act_id": "e202009291139501" + 'act_id': 'e202009291139501' } ) data = json.loads(req.text) return data except: - logger.info("获取签到奖励列表失败,请重试") + logger.info('获取签到奖励列表失败,请重试') -async def get_sign_info(uid, server_id="cn_gf01"): +async def get_sign_info(uid, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/info", + url='https://api-takumi.mihoyo.com/event/bbs_sign_reward/info', headers={ 'x-rpc-app_version': mhyVersion, - "Cookie": await owner_cookies(uid), - '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', + 'Cookie' : await owner_cookies(uid), + '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/'}, params={ - "act_id": "e202009291139501", - "region": server_id, - "uid": uid + 'act_id': 'e202009291139501', + 'region': server_id, + 'uid' : uid } ) data = json.loads(req.text) return data except: - logger.info("获取签到信息失败,请重试") + logger.info('获取签到信息失败,请重试') -async def mihoyo_bbs_sign(uid, server_id="cn_gf01"): +async def mihoyo_bbs_sign(uid, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: req = requests.post( - url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign", + url='https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign', headers={ - 'User_Agent': 'Mozilla/5.0 (Linux; Android 10; MIX 2 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (' - 'KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36 ' - 'miHoYoBBS/2.3.0', - "Cookie": await owner_cookies(uid), - "x-rpc-device_id": random_hex(32), - 'Origin': 'https://webstatic.mihoyo.com', - 'X_Requested_With': 'com.mihoyo.hyperion', - 'DS': old_version_get_ds_token(), + 'User_Agent' : 'Mozilla/5.0 (Linux; Android 10; MIX 2 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (' + 'KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36 ' + 'miHoYoBBS/2.3.0', + 'Cookie' : await owner_cookies(uid), + 'x-rpc-device_id' : random_hex(32), + 'Origin' : 'https://webstatic.mihoyo.com', + 'X_Requested_With' : 'com.mihoyo.hyperion', + 'DS' : old_version_get_ds_token(), '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', + '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.3.0' }, - json={"act_id": "e202009291139501", "uid": uid, "region": server_id} + json={'act_id': 'e202009291139501', 'uid': uid, 'region': server_id} ) data2 = json.loads(req.text) return data2 except: - logger.info("签到失败,请重试") + logger.info('签到失败,请重试') -async def get_award(uid, server_id="cn_gf01"): +async def get_award(uid, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: async with AsyncClient() as client: req = await client.get( - url="https://hk4e-api.mihoyo.com/event/ys_ledger/monthInfo", + url='https://hk4e-api.mihoyo.com/event/ys_ledger/monthInfo', headers={ 'x-rpc-app_version': mhyVersion, - "Cookie": await owner_cookies(uid), - 'DS': old_version_get_ds_token(), - "x-rpc-device_id": random_hex(32), - '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', + 'Cookie' : await owner_cookies(uid), + 'DS' : old_version_get_ds_token(), + 'x-rpc-device_id' : random_hex(32), + '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/'}, params={ - "act_id": "e202009291139501", - "bind_region": server_id, - "bind_uid": uid, - "month": "0", - "bbs_presentation_style": "fullscreen", - "bbs_auth_required": True, - "utm_source": "bbs", - "utm_medium": "mys", - "utm_campaign": "icon" + 'act_id' : 'e202009291139501', + 'bind_region' : server_id, + 'bind_uid' : uid, + 'month' : '0', + 'bbs_presentation_style': 'fullscreen', + 'bbs_auth_required' : True, + 'utm_source' : 'bbs', + 'utm_medium' : 'mys', + 'utm_campaign' : 'icon' } ) data = json.loads(req.text) return data except: - logger.info("访问失败,请重试!") + logger.info('访问失败,请重试!') # sys.exit(1) -async def get_info(uid, ck, server_id="cn_gf01"): +async def get_info(uid, ck, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/index", + url='https://api-takumi.mihoyo.com/game_record/app/genshin/api/index', headers={ - 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'DS' : get_ds_token('role_id=' + uid + '&server=' + server_id), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": ck}, + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : ck}, params={ - "role_id": uid, - "server": server_id + 'role_id': uid, + 'server' : server_id } ) data = json.loads(req.text) @@ -596,51 +596,51 @@ async def get_info(uid, ck, server_id="cn_gf01"): try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index", + url='https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index', headers={ - 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'DS' : get_ds_token('role_id=' + uid + '&server=' + server_id), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": ck}, + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : ck}, params={ - "role_id": uid, - "server": server_id + 'role_id': uid, + 'server' : server_id } ) data = json.loads(req.text) return data except json.decoder.JSONDecodeError: - logger.info("米游社基础信息读取新Api失败!") + logger.info('米游社基础信息读取新Api失败!') except Exception as e: - logger.info("米游社基础信息读取旧Api失败!") + logger.info('米游社基础信息读取旧Api失败!') logger.info(e.with_traceback) -async def get_spiral_abyss_info(uid, ck, schedule_type="1", server_id="cn_gf01"): +async def get_spiral_abyss_info(uid, ck, schedule_type='1', server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/spiralAbyss", + url='https://api-takumi.mihoyo.com/game_record/app/genshin/api/spiralAbyss', headers={ - 'DS': get_ds_token( - "role_id=" + uid + "&schedule_type=" + schedule_type + "&server=" + server_id), - 'Origin': 'https://webstatic.mihoyo.com', - 'Cookie': ck, + 'DS' : get_ds_token( + 'role_id=' + uid + '&schedule_type=' + schedule_type + '&server=' + server_id), + 'Origin' : 'https://webstatic.mihoyo.com', + 'Cookie' : ck, 'x-rpc-app_version': mhyVersion, - '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', + '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/' }, params={ - "schedule_type": schedule_type, - "role_id": uid, - "server": server_id + 'schedule_type': schedule_type, + 'role_id' : uid, + 'server' : server_id } ) data = json.loads(req.text) @@ -649,106 +649,106 @@ async def get_spiral_abyss_info(uid, ck, schedule_type="1", server_id="cn_gf01") try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss", + url='https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss', headers={ - 'DS': get_ds_token( - "role_id=" + uid + "&schedule_type=" + schedule_type + "&server=" + server_id), - 'Origin': 'https://webstatic.mihoyo.com', - 'Cookie': ck, + 'DS' : get_ds_token( + 'role_id=' + uid + '&schedule_type=' + schedule_type + '&server=' + server_id), + 'Origin' : 'https://webstatic.mihoyo.com', + 'Cookie' : ck, 'x-rpc-app_version': mhyVersion, - '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', + '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/' }, params={ - "role_id": uid, - "server": server_id, - "bbs_presentation_style": "fullscreen", - "bbs_auth_required": "true", - "utm_source": "bbs", - "utm_medium": "mys", - "utm_campaign": "icon" + 'role_id' : uid, + 'server' : server_id, + 'bbs_presentation_style': 'fullscreen', + 'bbs_auth_required' : 'true', + 'utm_source' : 'bbs', + 'utm_medium' : 'mys', + 'utm_campaign' : 'icon' } ) data = json.loads(req.text) return data except json.decoder.JSONDecodeError: - logger.info("深渊信息读取新Api失败!") + logger.info('深渊信息读取新Api失败!') except Exception as e: - logger.info("深渊信息读取老Api失败!") + logger.info('深渊信息读取老Api失败!') logger.info(e.with_traceback) -def get_character(uid, character_ids, ck, server_id="cn_gf01"): +def get_character(uid, character_ids, ck, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" + server_id = 'cn_qd01' try: req = requests.post( - url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/character", + url='https://api-takumi.mihoyo.com/game_record/app/genshin/api/character', headers={ - 'DS': get_ds_token('', {"character_ids": character_ids, "role_id": uid, - "server": server_id}), - 'Origin': 'https://webstatic.mihoyo.com', - 'Cookie': ck, + 'DS' : get_ds_token('', {'character_ids': character_ids, 'role_id': uid, + 'server' : server_id}), + 'Origin' : 'https://webstatic.mihoyo.com', + 'Cookie' : ck, 'x-rpc-app_version': mhyVersion, - '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', + '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/' }, - json={"character_ids": character_ids, "role_id": uid, "server": server_id} + json={'character_ids': character_ids, 'role_id': uid, 'server': server_id} ) data2 = json.loads(req.text) return data2 except requests.exceptions.SSLError: try: req = requests.post( - url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character", + url='https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character', headers={ - 'DS': get_ds_token('', {"character_ids": character_ids, "role_id": uid, - "server": server_id}), - 'Origin': 'https://webstatic.mihoyo.com', - 'Cookie': ck, + 'DS' : get_ds_token('', {'character_ids': character_ids, 'role_id': uid, + 'server' : server_id}), + 'Origin' : 'https://webstatic.mihoyo.com', + 'Cookie' : ck, 'x-rpc-app_version': mhyVersion, - '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', + '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/' }, - json={"character_ids": character_ids, "role_id": uid, "server": server_id} + json={'character_ids': character_ids, 'role_id': uid, 'server': server_id} ) data = json.loads(req.text) return data except json.decoder.JSONDecodeError: - logger.info("深渊信息读取新Api失败!") + logger.info('深渊信息读取新Api失败!') except Exception as e: - logger.info("深渊信息读取老Api失败!") + logger.info('深渊信息读取老Api失败!') logger.info(e.with_traceback) -async def get_calculate_info(client: ClientSession, uid, char_id, ck, name, server_id="cn_gf01"): +async def get_calculate_info(client: ClientSession, uid, char_id, ck, name, server_id='cn_gf01'): if uid[0] == '5': - server_id = "cn_qd01" - url = "https://api-takumi.mihoyo.com/event/e20200928calculate/v1/sync/avatar/detail" + server_id = 'cn_qd01' + url = 'https://api-takumi.mihoyo.com/event/e20200928calculate/v1/sync/avatar/detail' req = await client.get( url=url, headers={ - 'DS': get_ds_token("uid={}&avatar_id={}®ion={}".format(uid, char_id, server_id)), + 'DS' : get_ds_token('uid={}&avatar_id={}®ion={}'.format(uid, char_id, server_id)), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": ck}, + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : ck}, params={ - "avatar_id": char_id, - "uid": uid, - "region": server_id + 'avatar_id': char_id, + 'uid' : uid, + 'region' : server_id } ) data = await req.json() - data.update({"name": name}) + data.update({'name': name}) return data @@ -756,16 +756,16 @@ async def get_mihoyo_bbs_info(mysid, ck): try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi.mihoyo.com/game_record/card/wapi/getGameRecordCard", + url='https://api-takumi.mihoyo.com/game_record/card/wapi/getGameRecordCard', headers={ - 'DS': get_ds_token("uid=" + mysid), + 'DS' : get_ds_token('uid=' + mysid), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": ck}, - params={"uid": mysid} + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : ck}, + params={'uid': mysid} ) data = json.loads(req.text) return data @@ -773,48 +773,48 @@ async def get_mihoyo_bbs_info(mysid, ck): try: async with AsyncClient() as client: req = await client.get( - url="https://api-takumi-record.mihoyo.com/game_record/card/wapi/getGameRecordCard?uid=" + mysid, + url='https://api-takumi-record.mihoyo.com/game_record/card/wapi/getGameRecordCard?uid=' + mysid, headers={ - 'DS': get_ds_token("uid=" + mysid), + 'DS' : get_ds_token('uid=' + mysid), 'x-rpc-app_version': mhyVersion, - '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', + '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/', - "Cookie": ck}, - params={"uid": mysid} + 'Referer' : 'https://webstatic.mihoyo.com/', + 'Cookie' : ck}, + params={'uid': mysid} ) data = json.loads(req.text) return data except json.decoder.JSONDecodeError: - logger.info("米游社信息读取新Api失败!") + logger.info('米游社信息读取新Api失败!') except Exception as e: - logger.info("米游社信息读取老Api失败!") + logger.info('米游社信息读取老Api失败!') logger.info(e.with_traceback) -async def get_audio_info(name, audioid, language="cn"): - url = "https://genshin.minigg.cn/" +async def get_audio_info(name, audioid, language='cn'): + url = 'https://genshin.minigg.cn/' async with AsyncClient() as client: req = await client.get( url=url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/95.0.4638.69 Safari/537.36', - 'Referer': 'https://genshin.minigg.cn/index.html'}, - params={"characters": name, "audioid": audioid, "language": language} + 'Referer' : 'https://genshin.minigg.cn/index.html'}, + params={'characters': name, 'audioid': audioid, 'language': language} ) return req.text async def get_weapon_info(name, level=None): if level: - params = {"query": name, "stats": level} + params = {'query': name, 'stats': level} else: - params = {"query": name} + params = {'query': name} async with AsyncClient() as client: req = await client.get( - url="https://info.minigg.cn/weapons", + url='https://info.minigg.cn/weapons', headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/95.0.4638.69 Safari/537.36'}, @@ -825,34 +825,34 @@ async def get_weapon_info(name, level=None): async def get_misc_info(mode, name): - url = "https://info.minigg.cn/{}".format(mode) + url = 'https://info.minigg.cn/{}'.format(mode) async with AsyncClient() as client: req = await client.get( url=url, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/97.0.4692.71 Safari/537.36'}, - params={"query": name} + params={'query': name} ) data = json.loads(req.text) return data -async def get_char_info(name, mode="char", level=None): +async def get_char_info(name, mode='char', level=None): url2 = None url3 = None data2 = None - baseurl = "https://info.minigg.cn/characters?query=" - if mode == "talents": - url = "https://info.minigg.cn/talents?query=" + name - elif mode == "constellations": - url = "https://info.minigg.cn/constellations?query=" + name - elif mode == "costs": - url = baseurl + name + "&costs=1" - url2 = "https://info.minigg.cn/talents?query=" + name + "&costs=1" - url3 = "https://info.minigg.cn/talents?query=" + name + "&matchCategories=true" + baseurl = 'https://info.minigg.cn/characters?query=' + if mode == 'talents': + url = 'https://info.minigg.cn/talents?query=' + name + elif mode == 'constellations': + url = 'https://info.minigg.cn/constellations?query=' + name + elif mode == 'costs': + url = baseurl + name + '&costs=1' + url2 = 'https://info.minigg.cn/talents?query=' + name + '&costs=1' + url3 = 'https://info.minigg.cn/talents?query=' + name + '&matchCategories=true' elif level: - url = baseurl + name + "&stats=" + level + url = baseurl + name + '&stats=' + level else: url = baseurl + name @@ -863,16 +863,16 @@ async def get_char_info(name, mode="char", level=None): headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/95.0.4638.69 Safari/537.36', - 'Referer': 'https://genshin.minigg.cn/index.html'}) + 'Referer' : 'https://genshin.minigg.cn/index.html'}) data2 = json.loads(req.text) - if "errcode" in data2: + if 'errcode' in data2: async with AsyncClient() as client_: req = await client_.get( url=url3, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ' 'like Gecko) Chrome/95.0.4638.69 Safari/537.36', - 'Referer': 'https://genshin.minigg.cn/index.html'}) + 'Referer' : 'https://genshin.minigg.cn/index.html'}) data2 = json.loads(req.text) async with AsyncClient() as client: @@ -881,44 +881,44 @@ async def get_char_info(name, mode="char", level=None): headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/95.0.4638.69 Safari/537.36', - 'Referer': 'https://genshin.minigg.cn/index.html'}) + 'Referer' : 'https://genshin.minigg.cn/index.html'}) try: data = json.loads(req.text) - if "errcode" in data: + if 'errcode' in data: async with AsyncClient() as client_: req = await client_.get( - url=url + "&matchCategories=true", + url=url + '&matchCategories=true', headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ' 'like Gecko) Chrome/95.0.4638.69 Safari/537.36', - 'Referer': 'https://genshin.minigg.cn/index.html'}) + 'Referer' : 'https://genshin.minigg.cn/index.html'}) data = json.loads(req.text) except: data = None return data if data2 is None else [data, data2] -async def get_genshin_events(mode="List"): - if mode == "Calendar": +async def get_genshin_events(mode='List'): + if mode == 'Calendar': now_time = datetime.datetime.now().strftime('%Y-%m-%d') - base_url = "https://api-takumi.mihoyo.com/event/bbs_activity_calendar/getActList" + base_url = 'https://api-takumi.mihoyo.com/event/bbs_activity_calendar/getActList' params = { - "time": now_time, - "game_biz": "ys_cn", - "page": 1, - "tag_id": 0 + 'time' : now_time, + 'game_biz': 'ys_cn', + 'page' : 1, + 'tag_id' : 0 } else: - base_url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnn{}".format(mode) + base_url = 'https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnn{}'.format(mode) params = { - "game": "hk4e", - "game_biz": "hk4e_cn", - "lang": "zh-cn", - "bundle_id": "hk4e_cn", - "platform": "pc", - "region": "cn_gf01", - "level": 55, - "uid": 100000000 + 'game' : 'hk4e', + 'game_biz' : 'hk4e_cn', + 'lang' : 'zh-cn', + 'bundle_id': 'hk4e_cn', + 'platform' : 'pc', + 'region' : 'cn_gf01', + 'level' : 55, + 'uid' : 100000000 } async with AsyncClient() as client: diff --git a/mihoyo_libs/get_image.py b/mihoyo_libs/get_image.py index 358b0738..5b8dd35e 100644 --- a/mihoyo_libs/get_image.py +++ b/mihoyo_libs/get_image.py @@ -4,7 +4,7 @@ import threading from base64 import b64encode from io import BytesIO from re import Match, findall -from typing import Optional, Tuple, List +from typing import List, Optional, Tuple import numpy as np from PIL import Image, ImageDraw, ImageFilter, ImageFont @@ -132,9 +132,9 @@ class CustomizeImage: green_color = color[1] blue_color = color[2] - highlight_color = {"red": red_color - 127 if red_color > 127 else 127, - "green": green_color - 127 if green_color > 127 else 127, - "blue": blue_color - 127 if blue_color > 127 else 127} + highlight_color = {'red' : red_color - 127 if red_color > 127 else 127, + 'green': green_color - 127 if green_color > 127 else 127, + 'blue' : blue_color - 127 if blue_color > 127 else 127} max_color = max(highlight_color.values()) @@ -143,18 +143,18 @@ class CustomizeImage: if highlight_color[_highlight_color] == max_color: name = str(_highlight_color) - if name == "red": - return red_color, highlight_color["green"], highlight_color["blue"] - elif name == "green": - return highlight_color["red"], green_color, highlight_color["blue"] - elif name == "blue": - return highlight_color["red"], highlight_color["green"], blue_color + if name == 'red': + return red_color, highlight_color['green'], highlight_color['blue'] + elif name == 'green': + return highlight_color['red'], green_color, highlight_color['blue'] + elif name == 'blue': + return highlight_color['red'], highlight_color['green'], blue_color else: return 0, 0, 0 # Error def genshin_font(size: int): - return ImageFont.truetype(os.path.join(FILE2_PATH, "yuanshen.ttf"), size=size) + return ImageFont.truetype(os.path.join(FILE2_PATH, 'yuanshen.ttf'), size=size) def get_char_pic(_id: str, url: str): @@ -203,15 +203,15 @@ class GetCookies: self.nickname: Optional[int] = None self.schedule_type: Optional[str] = None - async def get_useable_cookies(self, uid: str, mode: int = 2, schedule_type: str = "1"): + async def get_useable_cookies(self, uid: str, mode: int = 2, schedule_type: str = '1'): self.uid = uid self.schedule_type = schedule_type while True: self.useable_cookies = cache_db(uid, mode - 1) if self.useable_cookies == '': - return "绑定记录不存在。" - elif self.useable_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" + return '绑定记录不存在。' + elif self.useable_cookies == '没有可以使用的Cookies!': + return '没有可以使用的Cookies!' if mode == 3: await self.get_mihoyo_bbs_data() else: @@ -240,30 +240,30 @@ class GetCookies: async def check_cookies_useable(self): if self.raw_data: - if self.raw_data["retcode"] != 0: - if self.raw_data["retcode"] == 10001: - error_db(self.useable_cookies, "error") + if self.raw_data['retcode'] != 0: + if self.raw_data['retcode'] == 10001: + error_db(self.useable_cookies, 'error') return False - elif self.raw_data["retcode"] == 10101: - error_db(self.useable_cookies, "limit30") + elif self.raw_data['retcode'] == 10101: + error_db(self.useable_cookies, 'limit30') return False - elif self.raw_data["retcode"] == 10102: - return "当前查询id已经设置了隐私,无法查询!" + elif self.raw_data['retcode'] == 10102: + return '当前查询id已经设置了隐私,无法查询!' else: return ( - "Api报错,返回内容为:\r\n" - + str(self.raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + 'Api报错,返回内容为:\r\n' + + str(self.raw_data) + '\r\n出现这种情况可能的UID输入错误 or 不存在' ) else: return True else: - return "没有可以使用的Cookies!" + return '没有可以使用的Cookies!' async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2): def create_rounded_rectangle_mask(rectangle, _radius): solid_fill = (50, 50, 50, 255) - img = Image.new("RGBA", rectangle.size, (0, 0, 0, 0)) + img = Image.new('RGBA', rectangle.size, (0, 0, 0, 0)) corner = Image.new('RGBA', (_radius, _radius), (0, 0, 0, 0)) draw = ImageDraw.Draw(corner) @@ -286,9 +286,9 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 while True: use_cookies = cache_db(uid, mode - 1) if use_cookies == '': - return "绑定记录不存在。" - elif use_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" + return '绑定记录不存在。' + elif use_cookies == '没有可以使用的Cookies!': + return '没有可以使用的Cookies!' if mode == 3: mys_data = await get_mihoyo_bbs_info(uid, use_cookies) @@ -304,19 +304,19 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 raw_abyss_data = await get_spiral_abyss_info(uid, use_cookies) raw_data = await get_info(uid, use_cookies) - if raw_data["retcode"] != 0: - if raw_data["retcode"] == 10001: - # return ("Cookie错误/过期,请重置Cookie") - error_db(use_cookies, "error") - elif raw_data["retcode"] == 10101: - # return ("当前cookies已达到30人上限!") - error_db(use_cookies, "limit30") - elif raw_data["retcode"] == 10102: - return "当前查询id已经设置了隐私,无法查询!" + if raw_data['retcode'] != 0: + if raw_data['retcode'] == 10001: + # return ('Cookie错误/过期,请重置Cookie') + error_db(use_cookies, 'error') + elif raw_data['retcode'] == 10101: + # return ('当前cookies已达到30人上限!') + error_db(use_cookies, 'limit30') + elif raw_data['retcode'] == 10102: + return '当前查询id已经设置了隐私,无法查询!' else: return ( - "Api报错,返回内容为:\r\n" - + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + 'Api报错,返回内容为:\r\n' + + str(raw_data) + '\r\n出现这种情况可能的UID输入错误 or 不存在' ) else: break @@ -324,8 +324,8 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 raw_abyss_data = raw_abyss_data['data'] raw_data = raw_data['data'] - # char_data = raw_data["avatars"] - # char_num = len(raw_data["avatars"]) + # char_data = raw_data['avatars'] + # char_num = len(raw_data['avatars']) char_datas = [] @@ -333,8 +333,8 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 for char in range(start, end): char_rawdata = get_character(uid, [char], use_cookies) - if char_rawdata["retcode"] != -1: - char_datas.append(char_rawdata["data"]['avatars'][0]) + if char_rawdata['retcode'] != -1: + char_datas.append(char_rawdata['data']['avatars'][0]) thread_list = [] st = 8 @@ -380,37 +380,37 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 star5num_con = 0 for i in char_datas: - if i["name"] in ['雷电将军', '温迪', '钟离', '枫原万叶']: + if i['name'] in ['雷电将军', '温迪', '钟离', '枫原万叶']: g3d1 += 1 - if i["name"] in ['甘雨', '魈', '胡桃']: + if i['name'] in ['甘雨', '魈', '胡桃']: ly3c += 1 if i['rarity'] == 5: star5num += 1 if i['name'] != '旅行者': star5num_con += 1 + i['actived_constellation_num'] - if i["level"] >= 80: - if i['name'] == "迪卢克": - word_str["落魄了家人们"] = l3_size - if i['name'] == "刻晴": - word_str["斩尽牛杂"] = l3_size - if i['name'] == "旅行者": - word_str["旅行者真爱党"] = l3_size + if i['level'] >= 80: + if i['name'] == '迪卢克': + word_str['落魄了家人们'] = l3_size + if i['name'] == '刻晴': + word_str['斩尽牛杂'] = l3_size + if i['name'] == '旅行者': + word_str['旅行者真爱党'] = l3_size if i['actived_constellation_num'] == 6: if i['rarity'] == 5: - if i['name'] == "旅行者": - word_str["满命{}".format(i['name'])] = l1_size - if i['name'] == "魈": + if i['name'] == '旅行者': + word_str['满命{}'.format(i['name'])] = l1_size + if i['name'] == '魈': word_str['魈深氪的救赎'] = l5_size - if i['name'] == "甘雨": + if i['name'] == '甘雨': word_str['璃月自走归终机'] = l5_size - if i['name'] == "胡桃": + if i['name'] == '胡桃': word_str['一波送走全送走'] = l5_size else: - word_str["满命{}".format(i['name'])] = l5_size + word_str['满命{}'.format(i['name'])] = l5_size else: - word_str["满命{}".format(i['name'])] = l2_size + word_str['满命{}'.format(i['name'])] = l2_size game_time = time.mktime(time.strptime('20200915', '%Y%m%d')) now_time = time.time() @@ -418,59 +418,59 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 total_d = ((total_s / 60) / 60) / 24 if math.floor(total_d) - 5 <= raw_data['stats']['active_day_number']: - word_str["开服玩家"] = l4_size + word_str['开服玩家'] = l4_size if g3d1 >= 4: - word_str["三神一帝"] = l3_size + word_str['三神一帝'] = l3_size if ly3c >= 3: - word_str["璃月3C"] = l3_size + word_str['璃月3C'] = l3_size if star5num >= 16: - word_str["五星众多"] = l3_size + word_str['五星众多'] = l3_size if len(weapons_datas) - star4weapon <= 3: - word_str["武器基本四星"] = l3_size + word_str['武器基本四星'] = l3_size if raw_data['stats']['achievement_number'] // (star5weapon_con + star5num_con) >= 23: - word_str["平民玩家"] = l2_size + word_str['平民玩家'] = l2_size elif raw_data['stats']['achievement_number'] // (star5weapon_con + star5num_con) <= 15: - word_str["氪金玩家"] = l3_size + word_str['氪金玩家'] = l3_size if raw_data['stats']['anemoculus_number'] + raw_data['stats']['geoculus_number'] + \ raw_data['stats']['electroculus_number'] == 378: - word_str["全神瞳"] = l2_size + word_str['全神瞳'] = l2_size if raw_data['world_explorations'][3]['exploration_percentage'] + raw_data['world_explorations'][2][ 'exploration_percentage'] + raw_data['world_explorations'][1]['exploration_percentage'] + \ raw_data['world_explorations'][0]['exploration_percentage'] >= 3950: - word_str["全探索"] = l4_size + word_str['全探索'] = l4_size if raw_data['stats']['achievement_number'] >= 510: - word_str["全成就"] = l5_size + word_str['全成就'] = l5_size elif raw_data['stats']['achievement_number'] >= 490: - word_str["成就达人"] = l3_size + word_str['成就达人'] = l3_size if raw_data['stats']['spiral_abyss'] == '12-3': - word_str["深境的探究者"] = l2_size + word_str['深境的探究者'] = l2_size if len(raw_data['avatars']) >= 42: - word_str["全角色"] = l3_size + word_str['全角色'] = l3_size if raw_data['stats']['active_day_number'] <= 40: - word_str["刚入坑"] = l1_size + word_str['刚入坑'] = l1_size elif raw_data['stats']['active_day_number'] <= 100: - word_str["初心者"] = l2_size + word_str['初心者'] = l2_size elif raw_data['stats']['active_day_number'] <= 300: - word_str["老玩家"] = l2_size + word_str['老玩家'] = l2_size if raw_data['stats']['active_day_number'] >= 365 and raw_data['stats']['magic_chest_number'] + raw_data['stats'][ 'common_chest_number'] + raw_data['stats']['exquisite_chest_number'] + \ raw_data['stats']['precious_chest_number'] + raw_data['stats']['luxurious_chest_number'] <= 2500: - word_str["老咸鱼"] = l3_size + word_str['老咸鱼'] = l3_size if raw_data['stats']['magic_chest_number'] >= 46: - word_str["迷失在黑夜里"] = l2_size + word_str['迷失在黑夜里'] = l2_size if raw_data['homes'][0]['comfort_num'] >= 25000: - word_str["团雀附体"] = l2_size + word_str['团雀附体'] = l2_size - if raw_abyss_data["reveal_rank"]: + if raw_abyss_data['reveal_rank']: if raw_abyss_data['total_battle_times'] <= 12 and raw_abyss_data['max_floor'] == '12-3': - word_str["PVP资格证"] = l4_size - if raw_abyss_data["damage_rank"][0]["value"] >= 150000: - word_str["这一击,贯穿星辰"] = l4_size + word_str['PVP资格证'] = l4_size + if raw_abyss_data['damage_rank'][0]['value'] >= 150000: + word_str['这一击,贯穿星辰'] = l4_size else: pass @@ -486,12 +486,12 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 is_edit = False if image: image_data = image.group(2) - with open(os.path.join(TEXT_PATH, nickname + '.png'), "wb") as f: + with open(os.path.join(TEXT_PATH, nickname + '.png'), 'wb') as f: f.write(get(image_data).content) is_edit = True if is_edit: - bg_path_edit = os.path.join(TEXT_PATH, f"{nickname}.png") + bg_path_edit = os.path.join(TEXT_PATH, f'{nickname}.png') else: bg_path_edit = bg2_path @@ -510,7 +510,7 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 x, y = 50, 153 radius = 50 cropped_img = bg_img.crop((x, y, x + 800, y + 800)) - blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5), ).convert("RGBA") + blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5), ).convert('RGBA') bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img, radius)) panle = Image.open(os.path.join(TEXT_PATH, 'wordcloud_0.png')) @@ -518,10 +518,10 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 mask = np.array([Image.open(os.path.join(TEXT_PATH, 'wordcloudmask.png'))]) wc = WordCloud( - font_path=os.path.join(FILE2_PATH, "yuanshen.ttf"), + font_path=os.path.join(FILE2_PATH, 'yuanshen.ttf'), mask=mask, - background_color="rgba(255, 255, 255, 0)", - mode="RGBA", + background_color='rgba(255, 255, 255, 0)', + mode='RGBA', max_words=200, max_font_size=80 # color_func=multi_color_func @@ -535,7 +535,7 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 bg_img = bg_img.convert('RGB') text_draw = ImageDraw.Draw(bg_img) - text_draw.text((450, 105), 'UID ' + f"{uid}", (40, 136, 168), genshin_font(26), anchor="mm") + text_draw.text((450, 105), 'UID ' + f'{uid}', (40, 136, 168), genshin_font(26), anchor='mm') result_buffer = BytesIO() bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) @@ -544,7 +544,7 @@ async def draw_word_cloud(uid: str, image: Optional[Match] = None, mode: int = 2 return resultmes -async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): +async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date='1'): # 获取Cookies data_def = GetCookies() retcode = await data_def.get_useable_cookies(uid, mode, date) @@ -556,8 +556,8 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): nickname = data_def.nickname if data_def.nickname else nickname # 获取数据 - raw_data = raw_data["data"] - raw_char_data = raw_char_data['data']["avatars"] + raw_data = raw_data['data'] + raw_char_data = raw_char_data['data']['avatars'] # 获取查询者数据 floors_data = raw_data['floors'][-1] @@ -573,18 +573,18 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): # highlight_color = image_def.highlight_color # 确定贴图路径 - abyss0_path = os.path.join(TEXT_PATH, "abyss_0.png") - abyss3_path = os.path.join(TEXT_PATH, "abyss_3.png") - abyss_star0_path = os.path.join(TEXT_PATH, "abyss_star0.png") - abyss_star1_path = os.path.join(TEXT_PATH, "abyss_star1.png") - avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png") - avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png") + abyss0_path = os.path.join(TEXT_PATH, 'abyss_0.png') + abyss3_path = os.path.join(TEXT_PATH, 'abyss_3.png') + abyss_star0_path = os.path.join(TEXT_PATH, 'abyss_star0.png') + abyss_star1_path = os.path.join(TEXT_PATH, 'abyss_star1.png') + avatar_bg_path = os.path.join(TEXT_PATH, 'avatar_bg.png') + avatar_fg_path = os.path.join(TEXT_PATH, 'avatar_fg.png') - all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png") + all_mask_path = os.path.join(TEXT_PATH, 'All_Mask.png') # 转换遮罩的颜色、大小匹配,并paste上去 all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS) - all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color) + all_mask_img = Image.new('RGBA', (based_w, based_h), bg_color) bg_img.paste(all_mask_img, (0, 0), all_mask) # 开启图片 @@ -592,7 +592,7 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): avatar_fg = Image.open(avatar_fg_path) # 确定主体框架 - avatar_bg_color = Image.new("RGBA", (316, 100), bg_color) + avatar_bg_color = Image.new('RGBA', (316, 100), bg_color) bg_img.paste(avatar_bg_color, (113, 98), avatar_bg) bg_img.paste(avatar_fg, (114, 95), avatar_fg) @@ -600,18 +600,18 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): x1, y1 = 65, 276 radius = 15 cropped_img1 = bg_img.crop((x1, y1, 836, 607)) - blurred_img1 = cropped_img1.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") + blurred_img1 = cropped_img1.filter(ImageFilter.GaussianBlur(5),).convert('RGBA') bg_img.paste(blurred_img1, (x1, y1), create_rounded_rectangle_mask(cropped_img1,radius)) for i in range(0,len(floors_data['levels'])): x2, y2 = 65, 630 + 315*i radius = 15 cropped_img2 = bg_img.crop((x2, y2, 836, 925+315*i)) - blurred_img2 = cropped_img2.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") + blurred_img2 = cropped_img2.filter(ImageFilter.GaussianBlur(5),).convert('RGBA') bg_img.paste(blurred_img2, (x2, y2), create_rounded_rectangle_mask(cropped_img2,radius)) """ - abyss0_bg_color = Image.new("RGBA", (900, 620), text_color) - abyss0 = Image.new("RGBA", (900, 620), (0, 0, 0, 0)) + abyss0_bg_color = Image.new('RGBA', (900, 620), text_color) + abyss0 = Image.new('RGBA', (900, 620), (0, 0, 0, 0)) abyss0_pic = Image.open(abyss0_path) abyss0.paste(abyss0_bg_color, (0, 0), abyss0_pic) @@ -620,76 +620,76 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): abyss_star1 = Image.open(abyss_star1_path) for i in range(0, 4): - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["reveal_rank"][i]["avatar_id"], raw_data["reveal_rank"][i]["avatar_icon"], - raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png") + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data['reveal_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['reveal_rank'][i]['avatar_id'], raw_data['reveal_rank'][i]['avatar_icon'], + raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['reveal_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["reveal_rank"][i]["avatar_id"]: + if k['id'] == raw_data['reveal_rank'][i]['avatar_id']: char_draw.text((63.5, 117), f'{str(raw_data["reveal_rank"][i]["value"])}次', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (82 + 130 * i, 300) abyss0.paste(char_img, char_crop, char_img) for i in range(0, 1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["damage_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["damage_rank"][i]["avatar_id"], raw_data["damage_rank"][i]["avatar_icon"], - raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["damage_rank"][i]["avatar_id"]) + ".png") + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data['damage_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['damage_rank'][i]['avatar_id'], raw_data['damage_rank'][i]['avatar_icon'], + raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['damage_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["damage_rank"][i]["avatar_id"]: + if k['id'] == raw_data['damage_rank'][i]['avatar_id']: char_draw.text((63.5, 117), f'{str(raw_data["damage_rank"][i]["value"])}', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (685, 470) abyss0.paste(char_img, char_crop, char_img) for i in range(0, 1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["defeat_rank"][i]["avatar_id"], raw_data["defeat_rank"][i]["avatar_icon"], - raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png") + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data['defeat_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['defeat_rank'][i]['avatar_id'], raw_data['defeat_rank'][i]['avatar_icon'], + raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['defeat_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["defeat_rank"][i]["avatar_id"]: + if k['id'] == raw_data['defeat_rank'][i]['avatar_id']: char_draw.text((63.5, 117), f'{str(raw_data["defeat_rank"][i]["value"])}', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (82 + 123 * i, 470) abyss0.paste(char_img, char_crop, char_img) for i in range(0, 1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["take_damage_rank"][i]["avatar_id"], - raw_data["take_damage_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png") + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data['take_damage_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['take_damage_rank'][i]['avatar_id'], + raw_data['take_damage_rank'][i]['avatar_icon'], raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['take_damage_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["take_damage_rank"][i]["avatar_id"]: + if k['id'] == raw_data['take_damage_rank'][i]['avatar_id']: char_draw.text((63.5, 117), f'{str(raw_data["take_damage_rank"][i]["value"])}', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (232 + 123 * i, 470) @@ -697,19 +697,19 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): for i in range(0, 1): if not os.path.exists( - os.path.join(CHAR_DONE_PATH, str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["normal_skill_rank"][i]["avatar_id"], - raw_data["normal_skill_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png") + os.path.join(CHAR_DONE_PATH, str(raw_data['normal_skill_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['normal_skill_rank'][i]['avatar_id'], + raw_data['normal_skill_rank'][i]['avatar_icon'], raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['normal_skill_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["normal_skill_rank"][i]["avatar_id"]: + if k['id'] == raw_data['normal_skill_rank'][i]['avatar_id']: char_draw.text((63.5, 117), f'{str(raw_data["normal_skill_rank"][i]["value"])}', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (382 + 123 * i, 470) @@ -717,19 +717,19 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): for i in range(0, 1): if not os.path.exists( - os.path.join(CHAR_DONE_PATH, str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png")): - get_char_done_pic(raw_data["energy_skill_rank"][i]["avatar_id"], - raw_data["energy_skill_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH, str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png") + os.path.join(CHAR_DONE_PATH, str(raw_data['energy_skill_rank'][i]['avatar_id']) + '.png')): + get_char_done_pic(raw_data['energy_skill_rank'][i]['avatar_id'], + raw_data['energy_skill_rank'][i]['avatar_icon'], raw_data['reveal_rank'][i]['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(raw_data['energy_skill_rank'][i]['avatar_id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: - if k['id'] == raw_data["energy_skill_rank"][i]["avatar_id"]: + if k['id'] == raw_data['energy_skill_rank'][i]['avatar_id']: char_draw.text((63.5, 118), f'{str(raw_data["energy_skill_rank"][i]["value"])}', (21, 21, 21), - genshin_font(18), anchor="mm") + genshin_font(18), anchor='mm') char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (532 + 123 * i, 470) @@ -737,22 +737,22 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): bg_img.paste(abyss0, (0, 0), abyss0) - for j in range(0, len(floors_data["levels"])): - abyss2 = Image.new("RGBA", (900, 340), (0, 0, 0, 0)) + for j in range(0, len(floors_data['levels'])): + abyss2 = Image.new('RGBA', (900, 340), (0, 0, 0, 0)) # abyss2 = Image.open(abyss2_path) num_1 = 0 for i in floors_data['levels'][j]['battles'][0]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png')): get_char_done_pic(i['id'], i['icon'], i['rarity']) - char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: if k['id'] == i['id']: char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (70 + 125 * (num_1 % 4), 46) @@ -760,17 +760,17 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): num_1 = num_1 + 1 num_2 = 0 for i in floors_data['levels'][j]['battles'][1]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png')): get_char_done_pic(i['id'], i['icon'], i['rarity']) - char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: if k['id'] == i['id']: char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (70 + 125 * (num_2 % 4), 180) @@ -794,21 +794,21 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): abyss2.paste(abyss_star1, (685, 155), abyss_star1) abyss2.paste(abyss_star1, (730, 155), abyss_star1) abyss2_text_draw = ImageDraw.Draw(abyss2) - abyss2_text_draw.text((87, 30), f"第{j + 1}间", text_color, genshin_font(21)) + abyss2_text_draw.text((87, 30), f'第{j + 1}间', text_color, genshin_font(21)) timestamp1 = int(floors_data['levels'][j]['battles'][0]['timestamp']) timestamp2 = int(floors_data['levels'][j]['battles'][1]['timestamp']) time_array1 = time.localtime(timestamp1) time_array2 = time.localtime(timestamp2) - other_style_time1 = time.strftime("%Y--%m--%d %H:%M:%S", time_array1) - other_style_time2 = time.strftime("%Y--%m--%d %H:%M:%S", time_array2) - abyss2_text_draw.text((167, 33), f"{other_style_time1}/{other_style_time2}", text_color, genshin_font(19)) + other_style_time1 = time.strftime('%Y--%m--%d %H:%M:%S', time_array1) + other_style_time2 = time.strftime('%Y--%m--%d %H:%M:%S', time_array2) + abyss2_text_draw.text((167, 33), f'{other_style_time1}/{other_style_time2}', text_color, genshin_font(19)) bg_img.paste(abyss2, (0, 605 + j * 315), abyss2) - bg_img.paste(abyss3, (0, len(floors_data["levels"]) * 315 + 610), abyss3) + bg_img.paste(abyss3, (0, len(floors_data['levels']) * 315 + 610), abyss3) text_draw = ImageDraw.Draw(bg_img) - text_draw.text((220, 123), f"{nickname}", text_color, genshin_font(32)) - text_draw.text((235, 163), 'UID ' + f"{uid}", text_color, genshin_font(14)) + text_draw.text((220, 123), f'{nickname}', text_color, genshin_font(32)) + text_draw.text((235, 163), 'UID ' + f'{uid}', text_color, genshin_font(14)) text_draw.text((690, 82), raw_data['max_floor'], text_color, genshin_font(26)) text_draw.text((690, 127), str(raw_data['total_battle_times']), text_color, genshin_font(26)) @@ -819,13 +819,13 @@ async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) # bg_img.save(result_buffer, format='PNG') imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - # resultmes = f"[CQ:image,file={imgmes}]" + # resultmes = f'[CQ:image,file={imgmes}]' resultmes = imgmes return resultmes async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optional[Match] = None, mode: int = 2, - date: str = "1"): + date: str = '1'): # 获取Cookies data_def = GetCookies() retcode = await data_def.get_useable_cookies(uid, mode, date) @@ -837,8 +837,8 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona nickname = data_def.nickname if data_def.nickname else nickname # 获取数据 - raw_data = raw_data["data"] - raw_char_data = raw_char_data['data']["avatars"] + raw_data = raw_data['data'] + raw_char_data = raw_char_data['data']['avatars'] floors_data = raw_data['floors'] based_data = {} for i in floors_data: @@ -856,22 +856,22 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona # highlight_color = image_def.highlight_color # 打开图片 - abyss1_path = os.path.join(TEXT_PATH, "abyss_1.png") - abyss3_path = os.path.join(TEXT_PATH, "abyss_3.png") - abyss_star0_path = os.path.join(TEXT_PATH, "abyss_star0.png") - abyss_star1_path = os.path.join(TEXT_PATH, "abyss_star1.png") + abyss1_path = os.path.join(TEXT_PATH, 'abyss_1.png') + abyss3_path = os.path.join(TEXT_PATH, 'abyss_3.png') + abyss_star0_path = os.path.join(TEXT_PATH, 'abyss_star0.png') + abyss_star1_path = os.path.join(TEXT_PATH, 'abyss_star1.png') abyss1 = Image.open(abyss1_path) abyss3 = Image.open(abyss3_path) abyss_star0 = Image.open(abyss_star0_path) abyss_star1 = Image.open(abyss_star1_path) - avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png") - avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png") + avatar_bg_path = os.path.join(TEXT_PATH, 'avatar_bg.png') + avatar_fg_path = os.path.join(TEXT_PATH, 'avatar_fg.png') - all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png") + all_mask_path = os.path.join(TEXT_PATH, 'All_Mask.png') # 转换遮罩的颜色、大小匹配,并paste上去 all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS) - all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color) + all_mask_img = Image.new('RGBA', (based_w, based_h), bg_color) bg_img.paste(all_mask_img, (0, 0), all_mask) # 开启图片 @@ -879,7 +879,7 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona avatar_fg = Image.open(avatar_fg_path) # 确定主体框架 - avatar_bg_color = Image.new("RGBA", (316, 100), bg_color) + avatar_bg_color = Image.new('RGBA', (316, 100), bg_color) bg_img.paste(avatar_bg_color, (113, 145), avatar_bg) bg_img.paste(avatar_fg, (114, 142), avatar_fg) @@ -888,29 +888,29 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona x, y = 65, 220 + 340*i radius = 10 cropped_img = bg_img.crop((x, y, 836, 517+340*i)) - blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") + blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert('RGBA') bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img,radius)) """ - abyss1_bg_color = Image.new("RGBA", (900, 400), bg_color) + abyss1_bg_color = Image.new('RGBA', (900, 400), bg_color) bg_img.paste(abyss1_bg_color, (0, 0), abyss1) for j in range(0, len(based_data['levels'])): - abyss2 = Image.new("RGBA", (900, 340), (0, 0, 0, 0)) + abyss2 = Image.new('RGBA', (900, 340), (0, 0, 0, 0)) num_1 = 0 # avatars = based_data['levels'][j]['battles'][0]['avatars'] + based_data['levels'][j]['battles'][1]['avatars'] for i in based_data['levels'][j]['battles'][0]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png')): get_char_done_pic(i['id'], i['icon'], i['rarity']) - char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: if k['id'] == i['id']: char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (70 + 125 * (num_1 % 4), 46) @@ -918,17 +918,17 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona num_1 = num_1 + 1 num_2 = 0 for i in based_data['levels'][j]['battles'][1]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png')): get_char_done_pic(i['id'], i['icon'], i['rarity']) - char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + '.png') char_img = Image.open(char) char_draw = ImageDraw.Draw(char_img) for k in raw_char_data: if k['id'] == i['id']: char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + if str(k['fetter']) == '10' or str(k['name']) == '旅行者': + char_draw.text((93, 41.5), '♥', (21, 21, 21), genshin_font(15)) else: char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) char_crop = (70 + 125 * (num_2 % 4), 180) @@ -952,30 +952,30 @@ async def draw_abyss_pic(uid: str, nickname: str, floor_num: int, image: Optiona abyss2.paste(abyss_star1, (685, 155), abyss_star1) abyss2.paste(abyss_star1, (730, 155), abyss_star1) abyss2_text_draw = ImageDraw.Draw(abyss2) - abyss2_text_draw.text((87, 30), f"第{j + 1}间", text_color, genshin_font(21)) + abyss2_text_draw.text((87, 30), f'第{j + 1}间', text_color, genshin_font(21)) timestamp1 = int(based_data['levels'][j]['battles'][0]['timestamp']) timestamp2 = int(based_data['levels'][j]['battles'][1]['timestamp']) time_array1 = time.localtime(timestamp1) time_array2 = time.localtime(timestamp2) - other_style_time1 = time.strftime("%Y--%m--%d %H:%M:%S", time_array1) - other_style_time2 = time.strftime("%Y--%m--%d %H:%M:%S", time_array2) - abyss2_text_draw.text((167, 33), f"{other_style_time1}/{other_style_time2}", text_color, genshin_font(19)) + other_style_time1 = time.strftime('%Y--%m--%d %H:%M:%S', time_array1) + other_style_time2 = time.strftime('%Y--%m--%d %H:%M:%S', time_array2) + abyss2_text_draw.text((167, 33), f'{other_style_time1}/{other_style_time2}', text_color, genshin_font(19)) bg_img.paste(abyss2, (0, 350 + j * 340), abyss2) bg_img.paste(abyss3, (0, len(based_data['levels']) * 340 + 400), abyss3) text_draw = ImageDraw.Draw(bg_img) - text_draw.text((220, 163), f"{nickname}", text_color, genshin_font(32)) - text_draw.text((235, 203), 'UID ' + f"{uid}", text_color, genshin_font(14)) - text_draw.text((710, 190), f"{floor_num}", text_color, genshin_font(50), anchor="mm") + text_draw.text((220, 163), f'{nickname}', text_color, genshin_font(32)) + text_draw.text((235, 203), 'UID ' + f'{uid}', text_color, genshin_font(14)) + text_draw.text((710, 190), f'{floor_num}', text_color, genshin_font(50), anchor='mm') bg_img = bg_img.convert('RGB') result_buffer = BytesIO() bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) # bg_img.save(result_buffer, format='PNG') imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - # resultmes = f"[CQ:image,file={imgmes}]" + # resultmes = f'[CQ:image,file={imgmes}]' resultmes = imgmes return resultmes @@ -999,38 +999,38 @@ async def draw_char_pic(img: Image, char_data: dict, index: int, bg_color: Tuple if k['is_actived']: char_mingzuo += 1 if char_data['rarity'] == 5: - char_0 = Image.new("RGBA", (180, 90), char_high_color) + char_0 = Image.new('RGBA', (180, 90), char_high_color) else: - char_0 = Image.new("RGBA", (180, 90), bg_color) - char_0_raw = Image.open(os.path.join(TEXT_PATH, "char_0.png")) + char_0 = Image.new('RGBA', (180, 90), bg_color) + char_0_raw = Image.open(os.path.join(TEXT_PATH, 'char_0.png')) alpha = char_0_raw.getchannel('A') char_0.putalpha(alpha) - char_2 = Image.new("RGBA", (180, 90), bg_detail_color) - char_2_raw = Image.open(os.path.join(TEXT_PATH, "char_2.png")) + char_2 = Image.new('RGBA', (180, 90), bg_detail_color) + char_2_raw = Image.open(os.path.join(TEXT_PATH, 'char_2.png')) alpha = char_2_raw.getchannel('A') char_2.putalpha(alpha) """ - char_3 = Image.new("RGBA", (180, 90), bg_detail_color) - char_3_raw = Image.open(os.path.join(TEXT_PATH, "char_3.png")) + char_3 = Image.new('RGBA', (180, 90), bg_detail_color) + char_3_raw = Image.open(os.path.join(TEXT_PATH, 'char_3.png')) alpha = char_3_raw.getchannel('A') char_3.putalpha(alpha) """ - char_1_mask = Image.open(os.path.join(TEXT_PATH, "char_1_mask.png")) + char_1_mask = Image.open(os.path.join(TEXT_PATH, 'char_1_mask.png')) STATUS.append(char_data['name']) if not os.path.exists(os.path.join(WEAPON_PATH, str(char_data['weapon']['icon'].split('/')[-1]))): get_weapon_pic(char_data['weapon']['icon']) - if not os.path.exists(os.path.join(CHAR_PATH, str(char_data['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_PATH, str(char_data['id']) + '.png')): get_char_pic(char_data['id'], char_data['icon']) - char_img = Image.open(os.path.join(CHAR_PATH, str(char_data["id"]) + ".png")).resize((81, 81), + char_img = Image.open(os.path.join(CHAR_PATH, str(char_data['id']) + '.png')).resize((81, 81), Image.ANTIALIAS) weapon_img = Image.open( os.path.join(WEAPON_PATH, str(char_data['weapon']['icon'].split('/')[-1]))).resize((40, 40), Image.ANTIALIAS) weapon_1_mask = char_1_mask.resize((40, 40), Image.ANTIALIAS) - char_0_temp = Image.new("RGBA", (180, 90)) + char_0_temp = Image.new('RGBA', (180, 90)) char_0_temp.paste(char_img, (8, 5), char_1_mask) char_0_temp.paste(weapon_img, (70, 45), weapon_1_mask) char_0.paste(char_0_temp, (0, 0), char_0_temp) @@ -1040,30 +1040,30 @@ async def draw_char_pic(img: Image, char_data: dict, index: int, bg_color: Tuple for i in range(0, 2): draw_text.text((106 + 23 * i, 17), f'{str(char_talent_data["data"]["skill_list"][i]["level_current"])}', text_color, - genshin_font(15), anchor="mm") + genshin_font(15), anchor='mm') - if len(char_talent_data["data"]["skill_list"]) == 7 and char_data["name"] != "珊瑚宫心海": + if len(char_talent_data['data']['skill_list']) == 7 and char_data['name'] != '珊瑚宫心海': draw_text.text((106 + 23 * 2, 17), f'{str(char_talent_data["data"]["skill_list"][3]["level_current"])}', text_color, - genshin_font(15), anchor="mm") + genshin_font(15), anchor='mm') else: draw_text.text((106 + 23 * 2, 17), f'{str(char_talent_data["data"]["skill_list"][2]["level_current"])}', text_color, - genshin_font(15), anchor="mm") + genshin_font(15), anchor='mm') - draw_text.text((42, 77), "Lv.{}".format(str(char_data["level"])), text_color, genshin_font(16), - anchor="mm") - draw_text.text((162, 38), "{}命".format(char_mingzuo), text_color, genshin_font(18), anchor="rm") + draw_text.text((42, 77), 'Lv.{}'.format(str(char_data['level'])), text_color, genshin_font(16), + anchor='mm') + draw_text.text((162, 38), '{}命'.format(char_mingzuo), text_color, genshin_font(18), anchor='rm') draw_text.text((115, 57), 'Lv.{}'.format(str(char_data['weapon']['level'])), text_color, - genshin_font(18), anchor="lm") + genshin_font(18), anchor='lm') draw_text.text((115, 75), '{}精'.format(str(char_data['weapon']['affix_level'])), text_color, - genshin_font(16), anchor="lm") + genshin_font(16), anchor='lm') - if str(char_data["fetter"]) == "10" or str(char_data["name"]) == "旅行者": - draw_text.text((74, 19), "♥", text_color, genshin_font(14), anchor="mm") + if str(char_data['fetter']) == '10' or str(char_data['name']) == '旅行者': + draw_text.text((74, 19), '♥', text_color, genshin_font(14), anchor='mm') else: draw_text.text((73, 18), '{}'.format(str(char_data['fetter'])), text_color, genshin_font(16), - anchor="mm") + anchor='mm') char_crop = (75 + 190 * (index % 4), 900 + 100 * (index // 4)) STATUS.remove(char_data['name']) @@ -1084,17 +1084,17 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: # 记录数据 raw_data = raw_data['data'] - char_data = raw_data["avatars"] + char_data = raw_data['avatars'] char_ids = [] char_names = [] for i in char_data: - char_ids.append(i["id"]) - char_names.append(i["name"]) + char_ids.append(i['id']) + char_names.append(i['name']) char_rawdata = get_character(uid, char_ids, use_cookies) - char_datas = char_rawdata["data"]["avatars"] + char_datas = char_rawdata['data']['avatars'] # 确定角色占用行数 char_num = len(char_datas) @@ -1113,17 +1113,17 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: char_high_color = image_def.char_high_color # 确定texture2D路径 - panle1_path = os.path.join(TEXT_PATH, "panle_1.png") - panle3_path = os.path.join(TEXT_PATH, "panle_3.png") + panle1_path = os.path.join(TEXT_PATH, 'panle_1.png') + panle3_path = os.path.join(TEXT_PATH, 'panle_3.png') - avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png") - avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png") + avatar_bg_path = os.path.join(TEXT_PATH, 'avatar_bg.png') + avatar_fg_path = os.path.join(TEXT_PATH, 'avatar_fg.png') - all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png") + all_mask_path = os.path.join(TEXT_PATH, 'All_Mask.png') # 转换遮罩的颜色、大小匹配,并paste上去 all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS) - all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color) + all_mask_img = Image.new('RGBA', (based_w, based_h), bg_color) bg_img.paste(all_mask_img, (0, 0), all_mask) # 操作图片 @@ -1133,8 +1133,8 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: avatar_fg = Image.open(avatar_fg_path) # 确定主体框架 - avatar_bg_color = Image.new("RGBA", (316, 100), bg_color) - panle1_color = Image.new("RGBA", (900, 900), text_color) + avatar_bg_color = Image.new('RGBA', (316, 100), bg_color) + panle1_color = Image.new('RGBA', (900, 900), text_color) bg_img.paste(panle1_color, (0, 0), panle1) bg_img.paste(panle3, (0, char_hang * 100 + 880) if char_num > 8 else (0, char_hang * 110 + 900), panle3) bg_img.paste(avatar_bg_color, (113, 98), avatar_bg) @@ -1144,10 +1144,10 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: text_draw = ImageDraw.Draw(bg_img) if role_level: - text_draw.text((140, 200), "冒险等级:" + f"{role_level}", text_color, genshin_font(20)) + text_draw.text((140, 200), '冒险等级:' + f'{role_level}', text_color, genshin_font(20)) - text_draw.text((220, 123), f"{nickname}", text_color, genshin_font(32)) - text_draw.text((235, 163), 'UID ' + f"{uid}", text_color, genshin_font(14)) + text_draw.text((220, 123), f'{nickname}', text_color, genshin_font(32)) + text_draw.text((235, 163), 'UID ' + f'{uid}', text_color, genshin_font(14)) # 活跃天数/成就数量/深渊信息 text_draw.text((640, 94.8), str(raw_data['stats']['active_day_number']), text_color, genshin_font(26)) @@ -1172,19 +1172,19 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: mondstadt = liyue = dragonspine = inazuma = offering = chasms_maw = under_chasms_maw = dict() for i in raw_data['world_explorations']: - if i["name"] == "蒙德": + if i['name'] == '蒙德': mondstadt = i - elif i["name"] == "璃月": + elif i['name'] == '璃月': liyue = i - elif i["name"] == "龙脊雪山": + elif i['name'] == '龙脊雪山': dragonspine = i - elif i["name"] == "稻妻": + elif i['name'] == '稻妻': inazuma = i - elif i["name"] == "渊下宫": + elif i['name'] == '渊下宫': offering = i - elif i["name"] == "璃月层岩巨渊": + elif i['name'] == '璃月层岩巨渊': chasms_maw = i - elif i["name"] == "璃月层岩巨渊·地下矿区": + elif i['name'] == '璃月层岩巨渊·地下矿区': under_chasms_maw = i # 层岩巨渊 @@ -1231,17 +1231,17 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: text_draw.text((720, 477), str(raw_data['homes'][0]['item_num']), text_color, genshin_font(24)) text_draw.text((720, 528), str(raw_data['homes'][0]['comfort_num']), text_color, genshin_font(24)) else: - text_draw.text((720, 375), "未开", text_color, genshin_font(24)) - text_draw.text((720, 426), "未开", text_color, genshin_font(24)) - text_draw.text((720, 477), "未开", text_color, genshin_font(24)) - text_draw.text((720, 528), "未开", text_color, genshin_font(24)) + text_draw.text((720, 375), '未开', text_color, genshin_font(24)) + text_draw.text((720, 426), '未开', text_color, genshin_font(24)) + text_draw.text((720, 477), '未开', text_color, genshin_font(24)) + text_draw.text((720, 528), '未开', text_color, genshin_font(24)) # 确定texture2D路径 - charpic_mask_path = os.path.join(TEXT_PATH, "charpic_mask.png") - weaponpic_mask_path = os.path.join(TEXT_PATH, "weaponpic_mask.png") + charpic_mask_path = os.path.join(TEXT_PATH, 'charpic_mask.png') + weaponpic_mask_path = os.path.join(TEXT_PATH, 'weaponpic_mask.png') def get_text(star, step): - return os.path.join(TEXT_PATH, "{}s_{}.png".format(str(star), str(step))) + return os.path.join(TEXT_PATH, '{}s_{}.png'.format(str(star), str(step))) charpic_mask = Image.open(charpic_mask_path) weaponpic_mask = Image.open(weaponpic_mask_path) @@ -1258,8 +1258,8 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: s2s3 = Image.open(get_text(2, 3)) s1s3 = Image.open(get_text(1, 3)) """ - char_bg_path = os.path.join(TEXT_PATH, "char_bg.png") - char_fg_path = os.path.join(TEXT_PATH, "char_fg.png") + char_bg_path = os.path.join(TEXT_PATH, 'char_bg.png') + char_fg_path = os.path.join(TEXT_PATH, 'char_fg.png') char_bg = Image.open(char_bg_path) char_fg = Image.open(char_fg_path) @@ -1279,7 +1279,7 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: tasks = [] for index, i in enumerate(char_datas): for j in talent_data: - if j["name"] == i['name']: + if j['name'] == i['name']: tasks.append( draw_char_pic( bg_img, @@ -1299,9 +1299,9 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: if k['is_actived']: char_mingzuo += 1 - char_name = i["name"] - char_id = i["id"] - char_level = i["level"] + char_name = i['name'] + char_id = i['id'] + char_level = i['level'] char_fetter = i['fetter'] char_rarity = i['rarity'] @@ -1311,10 +1311,10 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: if not os.path.exists(os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))): get_weapon_pic(char_weapon_icon) - if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + '.png')): get_char_pic(i['id'], i['icon']) - char = os.path.join(CHAR_PATH, str(char_id) + ".png") + char = os.path.join(CHAR_PATH, str(char_id) + '.png') weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) char_img = Image.open(char) @@ -1322,11 +1322,11 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: weapon_img = Image.open(weapon) weapon_img = weapon_img.resize((47, 47), Image.ANTIALIAS) - charpic = Image.new("RGBA", (125, 140)) + charpic = Image.new('RGBA', (125, 140)) if char_rarity == 5: charpic.paste(s5s1, (0, 0), s5s1) - baseda = Image.new("RGBA", (100, 100)) + baseda = Image.new('RGBA', (100, 100)) cc = Image.composite(char_img, baseda, charpic_mask) charpic.paste(cc, (6, 15), cc) charpic.paste(s5s2, (0, 0), s5s2) @@ -1340,14 +1340,14 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: charpic.paste(s2s3, (0, 0), s2s3) elif char_weapon_star == 1: charpic.paste(s1s3, (0, 0), s1s3) - basedb = Image.new("RGBA", (47, 47)) + basedb = Image.new('RGBA', (47, 47)) dd = Image.composite(weapon_img, basedb, weaponpic_mask) charpic.paste(dd, (69, 62), dd) charpic.paste(s5s4, (0, 0), s5s4) else: charpic.paste(s4s1, (0, 0), s4s1) - baseda = Image.new("RGBA", (100, 100)) + baseda = Image.new('RGBA', (100, 100)) cc = Image.composite(char_img, baseda, charpic_mask) charpic.paste(cc, (6, 15), cc) charpic.paste(s4s2, (0, 0), s4s2) @@ -1361,7 +1361,7 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: charpic.paste(s2s3, (0, 0), s2s3) elif char_weapon_star == 1: charpic.paste(s1s3, (0, 0), s1s3) - basedb = Image.new("RGBA", (47, 47)) + basedb = Image.new('RGBA', (47, 47)) dd = Image.composite(weapon_img, basedb, weaponpic_mask) charpic.paste(dd, (69, 62), dd) charpic.paste(s4s4, (0, 0), s4s4) @@ -1370,8 +1370,8 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: char_draw.text((38, 106), f'Lv.{str(char_level)}', (21, 21, 21), genshin_font(18)) char_draw.text((104.5, 91.5), f'{str(char_weapon_jinglian)}', 'white', genshin_font(10)) char_draw.text((99, 19.5), f'{str(char_mingzuo)}', 'white', genshin_font(18)) - if str(i["fetter"]) == "10" or str(char_name) == "旅行者": - char_draw.text((98, 42), "♥", (21, 21, 21), genshin_font(14)) + if str(i['fetter']) == '10' or str(char_name) == '旅行者': + char_draw.text((98, 42), '♥', (21, 21, 21), genshin_font(14)) else: char_draw.text((100, 41), f'{str(char_fetter)}', (21, 21, 21), genshin_font(16)) @@ -1380,17 +1380,17 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: num = num + 1 """ else: - charset_mask = Image.new("RGBA", (900, 130), char_color) + charset_mask = Image.new('RGBA', (900, 130), char_color) for i in char_datas: char_mingzuo = 0 for k in i['constellations']: if k['is_actived']: char_mingzuo += 1 - char_name = i["name"] - char_id = i["id"] - char_level = i["level"] - char_img_icon = i["image"] + char_name = i['name'] + char_id = i['id'] + char_level = i['level'] + char_img_icon = i['image'] char_weapon_star = i['weapon']['rarity'] char_weapon_level = i['weapon']['level'] @@ -1401,13 +1401,13 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: get_weapon_pic(char_weapon_icon) if not os.path.exists(os.path.join(CHAR_IMG_PATH, str(char_img_icon.split('/')[-1]))): get_char_img_pic(char_img_icon) - if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + ".png")): + if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + '.png')): get_char_pic(i['id'], i['icon']) - char = os.path.join(CHAR_PATH, str(char_id) + ".png") + char = os.path.join(CHAR_PATH, str(char_id) + '.png') weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) char_stand_img = os.path.join(CHAR_IMG_PATH, str(char_img_icon.split('/')[-1])) - char_stand_mask = Image.open(os.path.join(TEXT_PATH, "stand_mask.png")) + char_stand_mask = Image.open(os.path.join(TEXT_PATH, 'stand_mask.png')) # char_namecard_img = Image.open(os.path.join(CHAR_NAMECARD_PATH,str(i['icon'].split('_')[-1]))) # char_namecard_img = char_namecard_img.resize((591,81), Image.ANTIALIAS) @@ -1418,8 +1418,8 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: weapon_img = Image.open(weapon) weapon_img = weapon_img.resize((47, 47), Image.ANTIALIAS) - charpic = Image.new("RGBA", (900, 130)) - charpic_temp = Image.new("RGBA", (900, 130)) + charpic = Image.new('RGBA', (900, 130)) + charpic_temp = Image.new('RGBA', (900, 130)) charpic.paste(charset_mask, (0, 0), char_bg) @@ -1433,38 +1433,38 @@ async def draw_pic(uid: str, nickname: str, image: Optional[Match] = None, mode: # temp = Image.composite(weapon_img, basedb, weaponpic_mask) charpic.paste(charpic_temp, (0, 0), charpic_temp) - for _, k in enumerate(i["reliquaries"]): - if not os.path.exists(os.path.join(REL_PATH, str(k["icon"].split('/')[-1]))): - get_rel_pic(k["icon"]) - rel = os.path.join(REL_PATH, str(k["icon"].split('/')[-1])) + for _, k in enumerate(i['reliquaries']): + if not os.path.exists(os.path.join(REL_PATH, str(k['icon'].split('/')[-1]))): + get_rel_pic(k['icon']) + rel = os.path.join(REL_PATH, str(k['icon'].split('/')[-1])) rel_img = Image.open(rel).resize((43, 43), Image.ANTIALIAS) - rel_bg = Image.open(get_text(k["rarity"], 3)) + rel_bg = Image.open(get_text(k['rarity'], 3)) - if k["pos_name"] == "生之花": + if k['pos_name'] == '生之花': charpic.paste(rel_bg, (287 + 55 * 0, -14), rel_bg) charpic.paste(rel_img, (360 + 55 * 0, 49), rel_img) - elif k["pos_name"] == "死之羽": + elif k['pos_name'] == '死之羽': charpic.paste(rel_bg, (287 + 55 * 1, -14), rel_bg) charpic.paste(rel_img, (360 + 55 * 1, 49), rel_img) - elif k["pos_name"] == "时之沙": + elif k['pos_name'] == '时之沙': charpic.paste(rel_bg, (287 + 55 * 2, -14), rel_bg) charpic.paste(rel_img, (360 + 55 * 2, 49), rel_img) - elif k["pos_name"] == "空之杯": + elif k['pos_name'] == '空之杯': charpic.paste(rel_bg, (287 + 55 * 3, -14), rel_bg) charpic.paste(rel_img, (360 + 55 * 3, 49), rel_img) - elif k["pos_name"] == "理之冠": + elif k['pos_name'] == '理之冠': charpic.paste(rel_bg, (287 + 55 * 4, -14), rel_bg) charpic.paste(rel_img, (360 + 55 * 4, 49), rel_img) char_draw = ImageDraw.Draw(charpic) - char_draw.text((188, 30), i["name"] + " " + f'Lv.{str(char_level)}', text_color, genshin_font(22)) - char_draw.text((222, 87), f'{str(i["fetter"])}' if str(char_name) != "旅行者" else "10", text_color, - genshin_font(15), anchor="mm") - char_draw.text((255, 87), f'{str(char_mingzuo)}', text_color, genshin_font(15), anchor="mm") + char_draw.text((188, 30), i['name'] + ' ' + f'Lv.{str(char_level)}', text_color, genshin_font(22)) + char_draw.text((222, 87), f'{str(i["fetter"])}' if str(char_name) != '旅行者' else '10', text_color, + genshin_font(15), anchor='mm') + char_draw.text((255, 87), f'{str(char_mingzuo)}', text_color, genshin_font(15), anchor='mm') char_draw.text((218, 67), f'{str(char_weapon_level)}级{str(char_weapon_jinglian)}精', text_color, genshin_font(15), - anchor="lm") + anchor='lm') char_crop = (0, 900 + 110 * num) num += 1 bg_img.paste(charpic, char_crop, charpic) @@ -1482,7 +1482,7 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: def seconds2hours(seconds: int) -> str: m, s = divmod(int(seconds), 60) h, m = divmod(m, 60) - return "%02d:%02d:%02d" % (h, m, s) + return '%02d:%02d:%02d' % (h, m, s) # 获取Cookies data_def = GetCookies() @@ -1490,11 +1490,11 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: if not retcode: return retcode raw_data = data_def.raw_data - char_data = raw_data["data"]["avatars"] + char_data = raw_data['data']['avatars'] # 获取数据 award_data = await get_award(uid) daily_data = await get_daily_data(uid) - daily_data = daily_data["data"] + daily_data = daily_data['data'] nickname = award_data['data']['nickname'] # 获取背景图片各项参数 @@ -1508,18 +1508,18 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: char_color = image_def.char_color # 确定texture2D路径 - info1_path = os.path.join(TEXT_PATH, "info_1.png") - info2_path = os.path.join(TEXT_PATH, "info_2.png") - info3_path = os.path.join(TEXT_PATH, "info_3.png") + info1_path = os.path.join(TEXT_PATH, 'info_1.png') + info2_path = os.path.join(TEXT_PATH, 'info_2.png') + info3_path = os.path.join(TEXT_PATH, 'info_3.png') - avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png") - avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png") + avatar_bg_path = os.path.join(TEXT_PATH, 'avatar_bg.png') + avatar_fg_path = os.path.join(TEXT_PATH, 'avatar_fg.png') - all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png") + all_mask_path = os.path.join(TEXT_PATH, 'All_Mask.png') # 转换遮罩的颜色、大小匹配,并paste上去 all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS) - all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color) + all_mask_img = Image.new('RGBA', (based_w, based_h), bg_color) bg_img.paste(all_mask_img, (0, 0), all_mask) # 操作图片 @@ -1529,14 +1529,14 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: avatar_bg = Image.open(avatar_bg_path) avatar_fg = Image.open(avatar_fg_path) - avatar_bg_color = Image.new("RGBA", (316, 100), bg_color) + avatar_bg_color = Image.new('RGBA', (316, 100), bg_color) bg_img.paste(avatar_bg_color, (113, 98), avatar_bg) bg_img.paste(avatar_fg, (114, 95), avatar_fg) - info1_color = Image.new("RGBA", (900, 1400), bg_color) + info1_color = Image.new('RGBA', (900, 1400), bg_color) bg_img.paste(info1_color, (0, 0), info1) - info2_color = Image.new("RGBA", (900, 1400), text_color) + info2_color = Image.new('RGBA', (900, 1400), text_color) bg_img.paste(info2_color, (0, 0), info2) bg_img.paste(info3, (0, 0), info3) @@ -1544,121 +1544,121 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: text_draw = ImageDraw.Draw(bg_img) # 用户信息 - text_draw.text((220, 137), f"{nickname}", text_color, genshin_font(32), anchor="lm") - text_draw.text((235, 170), 'UID ' + f"{uid}", text_color, genshin_font(14), anchor="lm") + text_draw.text((220, 137), f'{nickname}', text_color, genshin_font(32), anchor='lm') + text_draw.text((235, 170), 'UID ' + f'{uid}', text_color, genshin_font(14), anchor='lm') # 本日原石/摩拉 text_draw.text((675, 148), - f"{award_data['data']['day_data']['current_primogems']}/" - f"{award_data['data']['day_data']['last_primogems']}", - text_color, genshin_font(28), anchor="lm") + f'{award_data["data"]["day_data"]["current_primogems"]}/' + f'{award_data["data"]["day_data"]["last_primogems"]}', + text_color, genshin_font(28), anchor='lm') text_draw.text((675, 212), - f"{award_data['data']['day_data']['current_mora']}\n{award_data['data']['day_data']['last_mora']}", - text_color, genshin_font(28), anchor="lm") + f'{award_data["data"]["day_data"]["current_mora"]}\n{award_data["data"]["day_data"]["last_mora"]}', + text_color, genshin_font(28), anchor='lm') # 本月/上月原石 - text_draw.text((722, 287), f"{award_data['data']['month_data']['current_primogems']}", text_color, genshin_font(21), - anchor="lm") - text_draw.text((722, 323), f"{award_data['data']['month_data']['last_primogems']}", text_color, genshin_font(21), - anchor="lm") + text_draw.text((722, 287), f'{award_data["data"]["month_data"]["current_primogems"]}', text_color, genshin_font(21), + anchor='lm') + text_draw.text((722, 323), f'{award_data["data"]["month_data"]["last_primogems"]}', text_color, genshin_font(21), + anchor='lm') # 本月/上月摩拉 - text_draw.text((722, 359), f"{award_data['data']['month_data']['current_mora']}", text_color, genshin_font(21), - anchor="lm") - text_draw.text((722, 395), f"{award_data['data']['month_data']['last_mora']}", text_color, genshin_font(21), - anchor="lm") + text_draw.text((722, 359), f'{award_data["data"]["month_data"]["current_mora"]}', text_color, genshin_font(21), + anchor='lm') + text_draw.text((722, 395), f'{award_data["data"]["month_data"]["last_mora"]}', text_color, genshin_font(21), + anchor='lm') # 收入比例 group_by = award_data['data']['month_data']['group_by'] group_by.sort(key=lambda x: (-x['action_id'])) for index, i in enumerate(group_by): - text_draw.text((681, 447 + index * 42), f"{str(i['num'])}({str(i['percent'])}%)", text_color, genshin_font(21), - anchor="lm") + text_draw.text((681, 447 + index * 42), f'{str(i["num"])}({str(i["percent"])}%)', text_color, genshin_font(21), + anchor='lm') # 基本四项 - text_draw.text((390, 314), f"{daily_data['current_resin']}/{daily_data['max_resin']}", text_color, genshin_font(26), - anchor="lm") + text_draw.text((390, 314), f'{daily_data["current_resin"]}/{daily_data["max_resin"]}', text_color, genshin_font(26), + anchor='lm') text_draw.text((390, 408), f'{daily_data["current_home_coin"]}/{daily_data["max_home_coin"]}', text_color, - genshin_font(26), anchor="lm") - text_draw.text((390, 503), f"{daily_data['finished_task_num']}/{daily_data['total_task_num']}", text_color, - genshin_font(26), anchor="lm") + genshin_font(26), anchor='lm') + text_draw.text((390, 503), f'{daily_data["finished_task_num"]}/{daily_data["total_task_num"]}', text_color, + genshin_font(26), anchor='lm') text_draw.text((390, 597), - f"{str(daily_data['resin_discount_num_limit'] - daily_data['remain_resin_discount_num'])}/" - f"{daily_data['resin_discount_num_limit']}", - text_color, genshin_font(26), anchor="lm") + f'{str(daily_data["resin_discount_num_limit"] - daily_data["remain_resin_discount_num"])}/' + f'{daily_data["resin_discount_num_limit"]}', + text_color, genshin_font(26), anchor='lm') # 参量质变仪 if daily_data['transformer']['recovery_time']['reached']: - transformer_status = "已处于可用状态" - text_draw.text((170, 707), f"{transformer_status}", highlight_color, genshin_font(18), anchor="lm") + transformer_status = '已处于可用状态' + text_draw.text((170, 707), f'{transformer_status}', highlight_color, genshin_font(18), anchor='lm') else: transformer_time = daily_data['transformer']['recovery_time'] - transformer_status = "还剩{}天{}小时{}分钟可用".format(transformer_time['Day'], transformer_time['Hour'], - transformer_time['Minute']) - text_draw.text((170, 707), f"{transformer_status}", text_color, genshin_font(18), anchor="lm") + transformer_status = '还剩{}天{}小时{}分钟可用'.format(transformer_time['Day'], transformer_time['Hour'], + transformer_time['Minute']) + text_draw.text((170, 707), f'{transformer_status}', text_color, genshin_font(18), anchor='lm') # 树脂恢复时间计算 if int(daily_data['resin_recovery_time']) <= 0: - text_draw.text((170, 331), f"已全部恢复", text_color, genshin_font(18), anchor="lm") + text_draw.text((170, 331), f'已全部恢复', text_color, genshin_font(18), anchor='lm') else: resin_recovery_time = seconds2hours( daily_data['resin_recovery_time']) next_resin_rec_time = seconds2hours( 8 * 60 - ((daily_data['max_resin'] - daily_data['current_resin']) * 8 * 60 - int( daily_data['resin_recovery_time']))) - text_draw.text((268, 305), f" {next_resin_rec_time}", text_color, genshin_font(18), anchor="lm") + text_draw.text((268, 305), f' {next_resin_rec_time}', text_color, genshin_font(18), anchor='lm') - text_draw.text((170, 331), f"预计 后全部恢复", text_color, genshin_font(18), anchor="lm") - text_draw.text((208, 331), f"{resin_recovery_time}", highlight_color, genshin_font(18), anchor="lm") + text_draw.text((170, 331), f'预计 后全部恢复', text_color, genshin_font(18), anchor='lm') + text_draw.text((208, 331), f'{resin_recovery_time}', highlight_color, genshin_font(18), anchor='lm') # 洞天宝钱时间计算 - coin_rec_time = seconds2hours(int(daily_data["home_coin_recovery_time"])) + coin_rec_time = seconds2hours(int(daily_data['home_coin_recovery_time'])) - if int(daily_data["home_coin_recovery_time"]) <= 0: - text_draw.text((170, 425), f"已达到上限", text_color, genshin_font(18), anchor="lm") + if int(daily_data['home_coin_recovery_time']) <= 0: + text_draw.text((170, 425), f'已达到上限', text_color, genshin_font(18), anchor='lm') else: - coin_add_speed = math.ceil((daily_data["max_home_coin"] - daily_data["current_home_coin"]) / ( - int(daily_data["home_coin_recovery_time"]) / 60 / 60)) - text_draw.text((270, 399), f"约{coin_add_speed}/h", text_color, genshin_font(18), anchor="lm") - text_draw.text((170, 425), f"预计 后达到上限", text_color, genshin_font(18), anchor="lm") - text_draw.text((208, 425), f"{coin_rec_time}", highlight_color, genshin_font(18), anchor="lm") + coin_add_speed = math.ceil((daily_data['max_home_coin'] - daily_data['current_home_coin']) / ( + int(daily_data['home_coin_recovery_time']) / 60 / 60)) + text_draw.text((270, 399), f'约{coin_add_speed}/h', text_color, genshin_font(18), anchor='lm') + text_draw.text((170, 425), f'预计 后达到上限', text_color, genshin_font(18), anchor='lm') + text_draw.text((208, 425), f'{coin_rec_time}', highlight_color, genshin_font(18), anchor='lm') if daily_data['is_extra_task_reward_received']: - daily_task_status = "「每日委托」奖励已领取" + daily_task_status = '「每日委托」奖励已领取' else: - daily_task_status = "「每日委托」奖励未领取" + daily_task_status = '「每日委托」奖励未领取' # 详细信息 - text_draw.text((170, 518), f"{daily_task_status}", text_color, genshin_font(18), anchor="lm") - text_draw.text((170, 614), f"本周剩余消耗减半次数", text_color, genshin_font(18), anchor="lm") + text_draw.text((170, 518), f'{daily_task_status}', text_color, genshin_font(18), anchor='lm') + text_draw.text((170, 614), f'本周剩余消耗减半次数', text_color, genshin_font(18), anchor='lm') # 派遣图片准备 - char_bg_path = os.path.join(TEXT_PATH, "char_bg.png") + char_bg_path = os.path.join(TEXT_PATH, 'char_bg.png') char_bg = Image.open(char_bg_path) - charset_mask = Image.new("RGBA", (900, 130), char_color) + charset_mask = Image.new('RGBA', (900, 130), char_color) # 派遣 - for index, i in enumerate(daily_data["expeditions"]): + for index, i in enumerate(daily_data['expeditions']): name = '' for j in char_data: - if i["avatar_side_icon"].split("_")[-1] == j["image"].split("_")[-1]: - name = j["name"] + if i['avatar_side_icon'].split('_')[-1] == j['image'].split('_')[-1]: + name = j['name'] if not os.path.exists( - os.path.join(CHAR_IMG_PATH, f"UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][:-4]}@2x.png")): + os.path.join(CHAR_IMG_PATH, f'UI_AvatarIcon_{i["avatar_side_icon"].split("_")[-1][:-4]}@2x.png')): get_char_img_pic( - f"https://upload-bbs.mihoyo.com/game_record/genshin/character_image" - f"/UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][:-4]}@2x.png") - # char_stand_img = os.path.join(CHAR_IMG_PATH, f"UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][ - # :-4]}@2x.png") char_stand = Image.open(char_stand_img) char_stand_mask = Image.open(os.path.join(TEXT_PATH, - # "stand_mask.png")) + f'https://upload-bbs.mihoyo.com/game_record/genshin/character_image' + f'/UI_AvatarIcon_{i["avatar_side_icon"].split("_")[-1][:-4]}@2x.png') + # char_stand_img = os.path.join(CHAR_IMG_PATH, f'UI_AvatarIcon_{i['avatar_side_icon'].split('_')[-1][ + # :-4]}@2x.png') char_stand = Image.open(char_stand_img) char_stand_mask = Image.open(os.path.join(TEXT_PATH, + # 'stand_mask.png')) - # charpic_temp = Image.new("RGBA", (900, 130)) + # charpic_temp = Image.new('RGBA', (900, 130)) # charpic_temp.paste(char_stand, (395, -99), char_stand_mask) - charpic = Image.new("RGBA", (900, 130)) + charpic = Image.new('RGBA', (900, 130)) char_icon = Image.open(BytesIO(get(i['avatar_side_icon']).content)) - char_namecard_img = Image.open(os.path.join(CHAR_NAMECARD_PATH, str(name + ".png"))) + char_namecard_img = Image.open(os.path.join(CHAR_NAMECARD_PATH, str(name + '.png'))) char_namecard_img = char_namecard_img.resize((591, 81), Image.ANTIALIAS) char_namecard_img.putalpha(char_namecard_img.getchannel('A').point(lambda x: round(x * 0.8) if x > 0 else 0)) @@ -1670,14 +1670,14 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: charpic_draw = ImageDraw.Draw(charpic) if i['status'] == 'Finished': - charpic_draw.text((200, 65), f"探索完成", text_color, genshin_font(24), anchor="lm") + charpic_draw.text((200, 65), f'探索完成', text_color, genshin_font(24), anchor='lm') else: remained_timed: str = seconds2hours(i['remained_time']) - charpic_draw.text((200, 65), f"剩余时间 {remained_timed}", text_color, genshin_font(24), anchor="lm") + charpic_draw.text((200, 65), f'剩余时间 {remained_timed}', text_color, genshin_font(24), anchor='lm') bg_img.paste(charpic, (-15, 848 + 115 * index), charpic) - end_pic = Image.open(os.path.join(TEXT_PATH, "abyss_3.png")) + end_pic = Image.open(os.path.join(TEXT_PATH, 'abyss_3.png')) bg_img.paste(end_pic, (0, 1440), end_pic) bg_img = bg_img.convert('RGB') @@ -1689,62 +1689,62 @@ async def draw_info_pic(uid: str, image: Optional[Match] = None) -> str: async def draw_event_pic() -> None: - raw_data = await get_genshin_events("List") - raw_time_data = await get_genshin_events("Content") + raw_data = await get_genshin_events('List') + raw_time_data = await get_genshin_events('Content') - data = raw_data["data"]["list"][1]["list"] + data = raw_data['data']['list'][1]['list'] - event_data = {"gacha_event": [], "normal_event": [], "other_event": []} + event_data = {'gacha_event': [], 'normal_event': [], 'other_event': []} for k in data: - for i in raw_time_data["data"]["list"]: - if k["title"] in i["title"]: + for i in raw_time_data['data']['list']: + if k['title'] in i['title']: content_bs = BeautifulSoup(i['content'], 'lxml') - for index, value in enumerate(content_bs.find_all("p")): - if value.text == "〓任务开放时间〓": - time_data = content_bs.find_all("p")[index + 1].text - if "([\s\S]*?)", time_data)[0] - k["time_data"] = time_data - elif value.text == "〓活动时间〓": - time_data = content_bs.find_all("p")[index + 1].text - if "([\s\S]*?)", s)[0]) + for s in time_data.split(' ~ '): + if '([\s\S]*?)', s)[0]) else: time_datas.append(s) - k["time_data"] = "——".join(time_datas) + k['time_data'] = '——'.join(time_datas) else: - k["time_data"] = time_data - elif value.text == "〓祈愿介绍〓": - start_time = content_bs.find_all("tr")[1].td.find_all("p")[0].text - if "([\s\S]*?)", start_time)[0] - end_time = findall("<[a-zA-Z]+.*?>([\s\S]*?)", - content_bs.find_all("tr")[1].td.find_all("p")[2].text)[0] - if "([\s\S]*?)", end_time)[0] - time_data = start_time + "——" + end_time - k["time_data"] = time_data + k['time_data'] = time_data + elif value.text == '〓祈愿介绍〓': + start_time = content_bs.find_all('tr')[1].td.find_all('p')[0].text + if '([\s\S]*?)', start_time)[0] + end_time = findall('<[a-zA-Z]+.*?>([\s\S]*?)', + content_bs.find_all('tr')[1].td.find_all('p')[2].text)[0] + if '([\s\S]*?)', end_time)[0] + time_data = start_time + '——' + end_time + k['time_data'] = time_data - if "冒险助力礼包" in k["title"] or "纪行" in k["title"]: + if '冒险助力礼包' in k['title'] or '纪行' in k['title']: continue - # if "角色试用" in k["title"] or "传说任务" in k["title"]: + # if '角色试用' in k['title'] or '传说任务' in k['title']: # event_data['other_event'].append(k) - elif k["tag_label"] == "扭蛋": + elif k['tag_label'] == '扭蛋': event_data['gacha_event'].append(k) - elif k["tag_label"] == "活动": + elif k['tag_label'] == '活动': event_data['normal_event'].append(k) # base_h = 900 + ((1 + (len(event_data['normal_event'])+len(event_data['other_event'])))//2)*390 + ((1 + len( # event_data['gacha_event']))//2)*533 base_h = 600 + len(event_data['normal_event']) * (390 + 90) + len(event_data['gacha_event']) * (533 + 90) - base_img = Image.new(mode="RGB", size=(1080, base_h), color=(237, 217, 195)) + base_img = Image.new(mode='RGB', size=(1080, base_h), color=(237, 217, 195)) - event1_path = os.path.join(TEXT_PATH, "event_1.png") - event2_path = os.path.join(TEXT_PATH, "event_2.png") - # event3_path = os.path.join(TEXT_PATH,"event_3.png") + event1_path = os.path.join(TEXT_PATH, 'event_1.png') + event2_path = os.path.join(TEXT_PATH, 'event_2.png') + # event3_path = os.path.join(TEXT_PATH,'event_3.png') event1 = Image.open(event1_path) event2 = Image.open(event2_path) # event3 = Image.open(event3_path) @@ -1755,28 +1755,28 @@ async def draw_event_pic() -> None: # base_img.paste(event3,(0,600+((1+len(event_data['normal_event']))//2)*390 + ((1 + len(event_data[ # 'gacha_event']))//2)*533),event3) - time_img1 = Image.new(mode="RGB", size=(1080, len(event_data['normal_event']) * (390 + 90)), color=(237, 130, 116)) - time_img2 = Image.new(mode="RGB", size=(1080, len(event_data['gacha_event']) * (533 + 90)), color=(237, 130, 116)) + time_img1 = Image.new(mode='RGB', size=(1080, len(event_data['normal_event']) * (390 + 90)), color=(237, 130, 116)) + time_img2 = Image.new(mode='RGB', size=(1080, len(event_data['gacha_event']) * (533 + 90)), color=(237, 130, 116)) base_img.paste(time_img1, (0, 300)) base_img.paste(time_img2, (0, 600 + len(event_data['normal_event']) * (390 + 90))) base_draw = ImageDraw.Draw(base_img) for index, value in enumerate(event_data['normal_event']): - img = Image.open(BytesIO(get(value["banner"]).content)) + img = Image.open(BytesIO(get(value['banner']).content)) base_draw.text((540, 300 + 45 + 390 + (390 + 90) * index + 1), - value["time_data"], (255, 255, 255), genshin_font(42), - anchor="mm") + value['time_data'], (255, 255, 255), genshin_font(42), + anchor='mm') # base_img.paste(img,((index%2)*1080,300 + 390*(index//2))) base_img.paste(img, (0, 300 + (390 + 90) * index)) for index, value in enumerate(event_data['gacha_event']): - img = Image.open(BytesIO(get(value["banner"]).content)) + img = Image.open(BytesIO(get(value['banner']).content)) base_draw.text((540, 600 + 45 + (390 + 90) * len(event_data['normal_event']) + 533 + index * (533 + 90)), - value["time_data"], (255, 255, 255), genshin_font(42), - anchor="mm") + value['time_data'], (255, 255, 255), genshin_font(42), + anchor='mm') # base_img.paste(img,((index%2)*1080,600 + ((1 + len(event_data['normal_event']))//2)*390 + 533*(index//2))) base_img.paste(img, (0, 600 + (390 + 90) * len(event_data['normal_event']) + index * (533 + 90))) # for index,value in enumerate(event_data['other_event']): img = Image.open(BytesIO(requests.get(value[ - # "banner"]).content)) base_img.paste(img,((index%2)*1080,900 + ((1 + len(event_data['normal_event']))//2)*390 + + # 'banner']).content)) base_img.paste(img,((index%2)*1080,900 + ((1 + len(event_data['normal_event']))//2)*390 + # ((1 + len(event_data['gacha_event']))//2)*533 + 390*(index//2))) base_img = base_img.convert('RGB') diff --git a/mihoyo_libs/get_mihoyo_bbs_coin.py b/mihoyo_libs/get_mihoyo_bbs_coin.py index b0b85eef..4eed60ba 100644 --- a/mihoyo_libs/get_mihoyo_bbs_coin.py +++ b/mihoyo_libs/get_mihoyo_bbs_coin.py @@ -7,47 +7,47 @@ from httpx import AsyncClient from get_data import old_version_get_ds_token, random_hex # 米游社的API列表 -bbs_Cookieurl = "https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}" -bbs_Cookieurl2 = "https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket" \ - "?login_ticket={}&token_types=3&uid={}" -bbs_Taskslist = "https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState" # 获取任务列表 -bbs_Signurl = "https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}" # post -bbs_Listurl = "https://bbs-api.mihoyo.com/post/api/getForumPostList?" \ - "forum_id={}&is_good=false&is_hot=false&page_size=20&sort_type=1" -bbs_Detailurl = "https://bbs-api.mihoyo.com/post/api/getPostFull?post_id={}" -bbs_Shareurl = "https://bbs-api.mihoyo.com/apihub/api/getShareConf?entity_id={}&entity_type=1" -bbs_Likeurl = "https://bbs-api.mihoyo.com/apihub/sapi/upvotePost" # post json +bbs_Cookieurl = 'https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}' +bbs_Cookieurl2 = 'https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket' \ + '?login_ticket={}&token_types=3&uid={}' +bbs_Taskslist = 'https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState' # 获取任务列表 +bbs_Signurl = 'https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}' # post +bbs_Listurl = 'https://bbs-api.mihoyo.com/post/api/getForumPostList?' \ + 'forum_id={}&is_good=false&is_hot=false&page_size=20&sort_type=1' +bbs_Detailurl = 'https://bbs-api.mihoyo.com/post/api/getPostFull?post_id={}' +bbs_Shareurl = 'https://bbs-api.mihoyo.com/apihub/api/getShareConf?entity_id={}&entity_type=1' +bbs_Likeurl = 'https://bbs-api.mihoyo.com/apihub/sapi/upvotePost' # post json mihoyobbs_List = [{ - "id": "1", - "forumId": "1", - "name": "崩坏3", - "url": "https://bbs.mihoyo.com/bh3/" + 'id' : '1', + 'forumId': '1', + 'name' : '崩坏3', + 'url' : 'https://bbs.mihoyo.com/bh3/' }, { - "id": "2", - "forumId": "26", - "name": "原神", - "url": "https://bbs.mihoyo.com/ys/" + 'id' : '2', + 'forumId': '26', + 'name' : '原神', + 'url' : 'https://bbs.mihoyo.com/ys/' }, { - "id": "3", - "forumId": "30", - "name": "崩坏2", - "url": "https://bbs.mihoyo.com/bh2/" + 'id' : '3', + 'forumId': '30', + 'name' : '崩坏2', + 'url' : 'https://bbs.mihoyo.com/bh2/' }, { - "id": "4", - "forumId": "37", - "name": "未定事件簿", - "url": "https://bbs.mihoyo.com/wd/" + 'id' : '4', + 'forumId': '37', + 'name' : '未定事件簿', + 'url' : 'https://bbs.mihoyo.com/wd/' }, { - "id": "5", - "forumId": "34", - "name": "大别野", - "url": "https://bbs.mihoyo.com/dby/" + 'id' : '5', + 'forumId': '34', + 'name' : '大别野', + 'url' : 'https://bbs.mihoyo.com/dby/' }, { - "id": "6", - "forumId": "52", - "name": "崩坏:星穹铁道", - "url": "https://bbs.mihoyo.com/sr/" + 'id' : '6', + 'forumId': '52', + 'name' : '崩坏:星穹铁道', + 'url' : 'https://bbs.mihoyo.com/sr/' }] @@ -58,26 +58,26 @@ def random_text(num: int) -> str: class MihoyoBBSCoin: def __init__(self, cookies): self.headers = { - "DS": old_version_get_ds_token(True), - "cookie": cookies, - "x-rpc-client_type": "2", - "x-rpc-app_version": "2.7.0", - "x-rpc-sys_version": "6.0.1", - "x-rpc-channel": "mihoyo", - "x-rpc-device_id": random_hex(32), - "x-rpc-device_name": random_text(random.randint(1, 10)), - "x-rpc-device_model": "Mi 10", - "Referer": "https://app.mihoyo.com", - "Host": "bbs-api.mihoyo.com", - "User-Agent": "okhttp/4.8.0" + 'DS' : old_version_get_ds_token(True), + 'cookie' : cookies, + 'x-rpc-client_type' : '2', + 'x-rpc-app_version' : '2.7.0', + 'x-rpc-sys_version' : '6.0.1', + 'x-rpc-channel' : 'mihoyo', + 'x-rpc-device_id' : random_hex(32), + 'x-rpc-device_name' : random_text(random.randint(1, 10)), + 'x-rpc-device_model': 'Mi 10', + 'Referer' : 'https://app.mihoyo.com', + 'Host' : 'bbs-api.mihoyo.com', + 'User-Agent' : 'okhttp/4.8.0' } self.Task_do = { - "bbs_Sign": False, - "bbs_Read_posts": False, - "bbs_Read_posts_num": 3, - "bbs_Like_posts": False, - "bbs_Like_posts_num": 5, - "bbs_Share": False + 'bbs_Sign' : False, + 'bbs_Read_posts' : False, + 'bbs_Read_posts_num': 3, + 'bbs_Like_posts' : False, + 'bbs_Like_posts_num': 5, + 'bbs_Share' : False } self.mihoyobbs_List_Use = [] self.Today_getcoins = 0 @@ -92,145 +92,145 @@ class MihoyoBBSCoin: read = await self.read_posts() like = await self.like_posts() share = await self.share_post() - im = start + "\n" + sign + "\n" + read + "\n" + like + "\n" + share + im = start + '\n' + sign + '\n' + read + '\n' + like + '\n' + share return im async def load_mihoyo_bbs_list_use(self): for i in [2, 5]: for k in mihoyobbs_List: - if i == int(k["id"]): + if i == int(k['id']): self.mihoyobbs_List_Use.append(k) # 获取任务列表,用来判断做了哪些任务 async def get_tasks_list(self): - # log.info("正在获取任务列表") + # log.info('正在获取任务列表') async with AsyncClient() as client: req = await client.get(url=bbs_Taskslist, headers=self.headers) data = req.json() - if "err" in data["message"] or data["retcode"] == -100: - return "你的Cookies已失效。" - # log.error("获取任务列表失败,你的cookie可能已过期,请重新设置cookie。") + if 'err' in data['message'] or data['retcode'] == -100: + return '你的Cookies已失效。' + # log.error('获取任务列表失败,你的cookie可能已过期,请重新设置cookie。') else: - self.Today_getcoins = data["data"]["can_get_points"] - self.Today_have_getcoins = data["data"]["already_received_points"] - self.Have_coins = data["data"]["total_points"] + self.Today_getcoins = data['data']['can_get_points'] + self.Today_have_getcoins = data['data']['already_received_points'] + self.Have_coins = data['data']['total_points'] # 如果当日可获取米游币数量为0直接判断全部任务都完成了 if self.Today_getcoins == 0: - self.Task_do["bbs_Sign"] = True - self.Task_do["bbs_Read_posts"] = True - self.Task_do["bbs_Like_posts"] = True - self.Task_do["bbs_Share"] = True + self.Task_do['bbs_Sign'] = True + self.Task_do['bbs_Read_posts'] = True + self.Task_do['bbs_Like_posts'] = True + self.Task_do['bbs_Share'] = True else: # 如果第0个大于或等于62则直接判定任务没做 - if data["data"]["states"][0]["mission_id"] >= 62: - # log.info(f"新的一天,今天可以获得{self.Today_getcoins}个米游币") + if data['data']['states'][0]['mission_id'] >= 62: + # log.info(f'新的一天,今天可以获得{self.Today_getcoins}个米游币') pass else: - # log.info(f"似乎还有任务没完成,今天还能获得{self.Today_getcoins}") - for i in data["data"]["states"]: + # log.info(f'似乎还有任务没完成,今天还能获得{self.Today_getcoins}') + for i in data['data']['states']: # 58是讨论区签到 - if i["mission_id"] == 58: - if i["is_get_award"]: - self.Task_do["bbs_Sign"] = True + if i['mission_id'] == 58: + if i['is_get_award']: + self.Task_do['bbs_Sign'] = True # 59是看帖子 - elif i["mission_id"] == 59: - if i["is_get_award"]: - self.Task_do["bbs_Read_posts"] = True + elif i['mission_id'] == 59: + if i['is_get_award']: + self.Task_do['bbs_Read_posts'] = True else: - self.Task_do["bbs_Read_posts_num"] -= i["happened_times"] + self.Task_do['bbs_Read_posts_num'] -= i['happened_times'] # 60是给帖子点赞 - elif i["mission_id"] == 60: - if i["is_get_award"]: - self.Task_do["bbs_Like_posts"] = True + elif i['mission_id'] == 60: + if i['is_get_award']: + self.Task_do['bbs_Like_posts'] = True else: - self.Task_do["bbs_Like_posts_num"] -= i["happened_times"] + self.Task_do['bbs_Like_posts_num'] -= i['happened_times'] # 61是分享帖子 - elif i["mission_id"] == 61: - if i["is_get_award"]: - self.Task_do["bbs_Share"] = True + elif i['mission_id'] == 61: + if i['is_get_award']: + self.Task_do['bbs_Share'] = True # 分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环 break - return "开始执行~" + return '开始执行~' # 获取要帖子列表 async def get_list(self) -> list: temp_list = [] - print("正在获取帖子列表......") + print('正在获取帖子列表......') async with AsyncClient() as client: - req = await client.get(url=bbs_Listurl.format(self.mihoyobbs_List_Use[0]["forumId"]), headers=self.headers) + req = await client.get(url=bbs_Listurl.format(self.mihoyobbs_List_Use[0]['forumId']), headers=self.headers) data = req.json() for n in range(5): - temp_list.append([data["data"]["list"][n]["post"]["post_id"], data["data"]["list"][n]["post"]["subject"]]) - # log.info("已获取{}个帖子".format(len(temp_list))) + temp_list.append([data['data']['list'][n]['post']['post_id'], data['data']['list'][n]['post']['subject']]) + # log.info('已获取{}个帖子'.format(len(temp_list))) return temp_list # 进行签到操作 async def signing(self): - if self.Task_do["bbs_Sign"]: - return "讨论区任务已经完成过了~" + if self.Task_do['bbs_Sign']: + return '讨论区任务已经完成过了~' else: for i in self.mihoyobbs_List_Use: async with AsyncClient() as client: - req = await client.post(url=bbs_Signurl.format(i["id"]), data={}, headers=self.headers) + req = await client.post(url=bbs_Signurl.format(i['id']), data={}, headers=self.headers) data = req.json() - if "err" not in data["message"]: + if 'err' not in data['message']: time.sleep(random.randint(2, 8)) else: - return "你的Cookies已失效。" - return "已完成签到任务~" + return '你的Cookies已失效。' + return '已完成签到任务~' # 看帖子 async def read_posts(self): - if self.Task_do["bbs_Read_posts"]: - return "看帖任务已经完成过了~" + if self.Task_do['bbs_Read_posts']: + return '看帖任务已经完成过了~' else: num_ok = 0 - for i in range(self.Task_do["bbs_Read_posts_num"]): + for i in range(self.Task_do['bbs_Read_posts_num']): async with AsyncClient() as client: req = await client.get(url=bbs_Detailurl.format(self.postsList[i][0]), headers=self.headers) data = req.json() - if data["message"] == "OK": + if data['message'] == 'OK': num_ok += 1 time.sleep(random.randint(2, 8)) - return "已完成看帖任务~共计成功{}次~".format(str(num_ok)) + return '已完成看帖任务~共计成功{}次~'.format(str(num_ok)) # 点赞 async def like_posts(self): - if self.Task_do["bbs_Like_posts"]: - return "点赞任务已经完成过了~" + if self.Task_do['bbs_Like_posts']: + return '点赞任务已经完成过了~' else: num_ok = 0 num_cancel = 0 - for i in range(self.Task_do["bbs_Like_posts_num"]): + for i in range(self.Task_do['bbs_Like_posts_num']): async with AsyncClient() as client: req = await client.post(url=bbs_Likeurl, headers=self.headers, - json={"post_id": self.postsList[i][0], "is_cancel": False}) + json={'post_id': self.postsList[i][0], 'is_cancel': False}) data = req.json() - if data["message"] == "OK": + if data['message'] == 'OK': num_ok += 1 # 判断取消点赞是否打开 if True: time.sleep(random.randint(2, 8)) async with AsyncClient() as client: req = await client.post(url=bbs_Likeurl, headers=self.headers, - json={"post_id": self.postsList[i][0], "is_cancel": True}) + json={'post_id': self.postsList[i][0], 'is_cancel': True}) data = req.json() - if data["message"] == "OK": + if data['message'] == 'OK': num_cancel += 1 time.sleep(random.randint(2, 8)) - return "已完成点赞任务~共计点赞{}次,取消点赞{}次~".format(str(num_ok), str(num_cancel)) + return '已完成点赞任务~共计点赞{}次,取消点赞{}次~'.format(str(num_ok), str(num_cancel)) # 分享操作 async def share_post(self): - if self.Task_do["bbs_Share"]: - return "分享任务已经完成过了~" + if self.Task_do['bbs_Share']: + return '分享任务已经完成过了~' else: for _ in range(3): async with AsyncClient() as client: req = await client.get(url=bbs_Shareurl.format(self.postsList[0][0]), headers=self.headers) data = req.json() - if data["message"] == "OK": - return "已完成分享任务~获得10米游币~" + if data['message'] == 'OK': + return '已完成分享任务~获得10米游币~' else: time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8)) diff --git a/mihoyo_libs/get_mihoyo_bbs_data.py b/mihoyo_libs/get_mihoyo_bbs_data.py index 02eacd8f..1f8eb8d3 100644 --- a/mihoyo_libs/get_mihoyo_bbs_data.py +++ b/mihoyo_libs/get_mihoyo_bbs_data.py @@ -19,50 +19,50 @@ INDEX_PATH = os.path.join(FILE2_PATH, 'index') Texture_PATH = os.path.join(FILE2_PATH, 'texture2d') avatar_json = { - "Albedo": "阿贝多", - "Ambor": "安柏", - "Barbara": "芭芭拉", - "Beidou": "北斗", - "Bennett": "班尼特", - "Chongyun": "重云", - "Diluc": "迪卢克", - "Diona": "迪奥娜", - "Eula": "优菈", - "Fischl": "菲谢尔", - "Ganyu": "甘雨", - "Hutao": "胡桃", - "Jean": "琴", - "Kazuha": "枫原万叶", - "Kaeya": "凯亚", - "Ayaka": "神里绫华", - "Keqing": "刻晴", - "Klee": "可莉", - "Lisa": "丽莎", - "Mona": "莫娜", - "Ningguang": "凝光", - "Noel": "诺艾尔", - "Qiqi": "七七", - "Razor": "雷泽", - "Rosaria": "罗莎莉亚", - "Sucrose": "砂糖", - "Tartaglia": "达达利亚", - "Venti": "温迪", - "Xiangling": "香菱", - "Xiao": "魈", - "Xingqiu": "行秋", - "Xinyan": "辛焱", - "Yanfei": "烟绯", - "Zhongli": "钟离", - "Yoimiya": "宵宫", - "Sayu": "早柚", - "Shogun": "雷电将军", - "Aloy": "埃洛伊", - "Sara": "九条裟罗", - "Kokomi": "珊瑚宫心海", - "Shenhe": "申鹤" + 'Albedo' : '阿贝多', + 'Ambor' : '安柏', + 'Barbara' : '芭芭拉', + 'Beidou' : '北斗', + 'Bennett' : '班尼特', + 'Chongyun' : '重云', + 'Diluc' : '迪卢克', + 'Diona' : '迪奥娜', + 'Eula' : '优菈', + 'Fischl' : '菲谢尔', + 'Ganyu' : '甘雨', + 'Hutao' : '胡桃', + 'Jean' : '琴', + 'Kazuha' : '枫原万叶', + 'Kaeya' : '凯亚', + 'Ayaka' : '神里绫华', + 'Keqing' : '刻晴', + 'Klee' : '可莉', + 'Lisa' : '丽莎', + 'Mona' : '莫娜', + 'Ningguang': '凝光', + 'Noel' : '诺艾尔', + 'Qiqi' : '七七', + 'Razor' : '雷泽', + 'Rosaria' : '罗莎莉亚', + 'Sucrose' : '砂糖', + 'Tartaglia': '达达利亚', + 'Venti' : '温迪', + 'Xiangling': '香菱', + 'Xiao' : '魈', + 'Xingqiu' : '行秋', + 'Xinyan' : '辛焱', + 'Yanfei' : '烟绯', + 'Zhongli' : '钟离', + 'Yoimiya' : '宵宫', + 'Sayu' : '早柚', + 'Shogun' : '雷电将军', + 'Aloy' : '埃洛伊', + 'Sara' : '九条裟罗', + 'Kokomi' : '珊瑚宫心海', + 'Shenhe' : '申鹤' } -daily_im = ''' +daily_im = """ *数据刷新可能存在一定延迟,请以当前游戏实际数据为准{} ============== 原粹树脂:{}/{}{} @@ -72,9 +72,9 @@ daily_im = ''' 参量质变仪:{} 探索派遣: 总数/完成/上限:{}/{}/{} -{}''' +{}""" -month_im = ''' +month_im = """ ============== {} UID:{} @@ -92,15 +92,15 @@ UID:{} 上月获取摩拉:{} ============== 原石收入组成: -{}==============''' +{}==============""" -weapon_im = '''【名称】:{} +weapon_im = """【名称】:{} 【类型】:{} 【稀有度】:{} 【介绍】:{} -【攻击力】:{}{}{}''' +【攻击力】:{}{}{}""" -char_info_im = '''{} +char_info_im = """{} 【稀有度】:{} 【武器】:{} 【元素】:{} @@ -108,9 +108,9 @@ char_info_im = '''{} 【生日】:{} 【命之座】:{} 【cv】:{} -【介绍】:{}''' +【介绍】:{}""" -artifacts_im = '''【{}】 +artifacts_im = """【{}】 【稀有度】:{} 【2件套】:{} 【4件套】:{} @@ -118,54 +118,54 @@ artifacts_im = '''【{}】 【{}】:{} 【{}】:{} 【{}】:{} -【{}】:{}''' +【{}】:{}""" -food_im = '''【{}】 +food_im = """【{}】 【稀有度】:{} 【食物类型】:{} 【食物类别】:{} 【效果】:{} 【介绍】:{} 【材料】: -{}''' +{}""" -audio_json = '''{ - "357":["357_01","357_02","357_03"], - "1000000":["1000000_01","1000000_02","1000000_03","1000000_04","1000000_05","1000000_06","1000000_07"], - "1000001":["1000001_01","1000001_02","1000001_03"], - "1000002":["1000002_01","1000002_02","1000002_03"], - "1000100":["1000100_01","1000100_02","1000100_03","1000100_04","1000100_05"], - "1000101":["1000101_01","1000101_02","1000101_03","1000101_04","1000101_05","1000101_06"], - "1000200":["1000200_01","1000200_02","1000200_03"], - "1010201":["1010201_01"], - "1000300":["1000300_01","1000300_02"], - "1000400":["1000400_01","1000400_02","1000400_03"], - "1000500":["1000500_01","1000500_02","1000500_03"], - "1010000":["1010000_01","1010000_02","1010000_03","1010000_04","1010000_05"], - "1010001":["1010001_01","1010001_02"], - "1010100":["1010100_01","1010100_02","1010100_03","1010100_04","1010100_05"], - "1010200":["1010200_01","1010200_02","1010200_03","1010200_04","1010200_05"], - "1010300":["1010300_01","1010300_02","1010300_03","1010300_04","1010300_05"], - "1010301":["1010301_01","1010301_02","1010301_03","1010301_04","1010301_05"], - "1010400":["1010400_01","1010400_02","1010400_03"], - "1020000":["1020000_01"] -}''' +audio_json = """{ + '357':['357_01','357_02','357_03'], + '1000000':['1000000_01','1000000_02','1000000_03','1000000_04','1000000_05','1000000_06','1000000_07'], + '1000001':['1000001_01','1000001_02','1000001_03'], + '1000002':['1000002_01','1000002_02','1000002_03'], + '1000100':['1000100_01','1000100_02','1000100_03','1000100_04','1000100_05'], + '1000101':['1000101_01','1000101_02','1000101_03','1000101_04','1000101_05','1000101_06'], + '1000200':['1000200_01','1000200_02','1000200_03'], + '1010201':['1010201_01'], + '1000300':['1000300_01','1000300_02'], + '1000400':['1000400_01','1000400_02','1000400_03'], + '1000500':['1000500_01','1000500_02','1000500_03'], + '1010000':['1010000_01','1010000_02','1010000_03','1010000_04','1010000_05'], + '1010001':['1010001_01','1010001_02'], + '1010100':['1010100_01','1010100_02','1010100_03','1010100_04','1010100_05'], + '1010200':['1010200_01','1010200_02','1010200_03','1010200_04','1010200_05'], + '1010300':['1010300_01','1010300_02','1010300_03','1010300_04','1010300_05'], + '1010301':['1010301_01','1010301_02','1010301_03','1010301_04','1010301_05'], + '1010400':['1010400_01','1010400_02','1010400_03'], + '1020000':['1020000_01'] +}""" -char_adv_im = '''【{}】 +char_adv_im = """【{}】 【五星武器】:{} 【四星武器】:{} 【三星武器】:{} 【圣遗物】: -{}''' +{}""" async def weapon_adv(name): - char_adv_path = os.path.join(FILE_PATH, "Genshin All Char.xlsx") + char_adv_path = os.path.join(FILE_PATH, 'Genshin All Char.xlsx') # char_adv_path = FILE_PATH wb = load_workbook(char_adv_path) ws = wb.active - weapon_name = "" + weapon_name = '' char_list = [] for c in range(2, 5): for r in range(2, 300): @@ -177,19 +177,19 @@ async def weapon_adv(name): if char_list: im = ','.join(char_list) - im = im + "可能会用到【{}】".format(weapon_name) + im = im + '可能会用到【{}】'.format(weapon_name) else: - im = "没有角色能使用【{}】".format(weapon_name) + im = '没有角色能使用【{}】'.format(weapon_name) return im async def char_adv(name): char_name = None - char_adv_path = os.path.join(FILE_PATH, "Genshin All Char.xlsx") + char_adv_path = os.path.join(FILE_PATH, 'Genshin All Char.xlsx') # char_adv_path = FILE_PATH wb = load_workbook(char_adv_path) ws = wb.active - char_list = ws["A"] + char_list = ws['A'] index = None for i in char_list: if i.value: @@ -198,68 +198,68 @@ async def char_adv(name): index = i.row char_name = i.value if index: - weapon_5star = "" + weapon_5star = '' for i in range(index, index + 5): if ws.cell(i, 2).value: - weapon_5star += ws.cell(i, 2).value + ">" - if weapon_5star != "": + weapon_5star += ws.cell(i, 2).value + '>' + if weapon_5star != '': weapon_5star = weapon_5star[:-1] else: - weapon_5star = "无推荐" + weapon_5star = '无推荐' - weapon_4star = "" + weapon_4star = '' for i in range(index, index + 5): if ws.cell(i, 3).value: - weapon_4star += ws.cell(i, 3).value + ">" - if weapon_4star != "": + weapon_4star += ws.cell(i, 3).value + '>' + if weapon_4star != '': weapon_4star = weapon_4star[:-1] else: - weapon_4star = "无推荐" + weapon_4star = '无推荐' - weapon_3star = "" + weapon_3star = '' for i in range(index, index + 5): if ws.cell(i, 4).value: - weapon_3star += ws.cell(i, 4).value + ">" - if weapon_3star != "": + weapon_3star += ws.cell(i, 4).value + '>' + if weapon_3star != '': weapon_3star = weapon_3star[:-1] else: - weapon_3star = "无推荐" + weapon_3star = '无推荐' - artifacts = "" + artifacts = '' for i in range(index, index + 5): if ws.cell(i, 5).value: if ws.cell(i, 6).value: - artifacts += ws.cell(i, 5).value + "*2" + ws.cell(i, 6).value + "*2" + "\n" + artifacts += ws.cell(i, 5).value + '*2' + ws.cell(i, 6).value + '*2' + '\n' else: - artifacts += ws.cell(i, 5).value + "*4" + "\n" + artifacts += ws.cell(i, 5).value + '*4' + '\n' - if artifacts != "": + if artifacts != '': artifacts = artifacts[:-1] else: - artifacts = "无推荐" + artifacts = '无推荐' im = char_adv_im.format(char_name, weapon_5star, weapon_4star, weapon_3star, artifacts) return im async def deal_ck(mes, qid): - if "stoken" in mes: - login_ticket = re.search(r"login_ticket=([0-9a-zA-Z]+)", mes).group(0).split('=')[1] - uid = await select_db(qid, "uid") - # mys_id = re.search(r"login_uid=([0-9]+)", mes).group(0).split('=')[1] + if 'stoken' in mes: + login_ticket = re.search(r'login_ticket=([0-9a-zA-Z]+)', mes).group(0).split('=')[1] + uid = await select_db(qid, 'uid') + # mys_id = re.search(r'login_uid=([0-9]+)', mes).group(0).split('=')[1] ck = await owner_cookies(uid[0]) - mys_id = re.search(r"account_id=(\d*)", ck).group(0).split('=')[1] + mys_id = re.search(r'account_id=(\d*)', ck).group(0).split('=')[1] raw_data = await get_stoken_by_login_ticket(login_ticket, mys_id) - stoken = raw_data["data"]["list"][0]["token"] - s_cookies = "stuid={};stoken={}".format(mys_id, stoken) + stoken = raw_data['data']['list'][0]['token'] + s_cookies = 'stuid={};stoken={}'.format(mys_id, stoken) await stoken_db(s_cookies, uid[0]) - return "添加Stoken成功!" + return '添加Stoken成功!' else: - aid = re.search(r"account_id=(\d*)", mes) + aid = re.search(r'account_id=(\d*)', mes) mysid_data = aid.group(0).split('=') mysid = mysid_data[1] cookie = ';'.join(filter(lambda x: x.split('=')[0] in [ - "cookie_token", "account_id"], [i.strip() for i in mes.split(';')])) + 'cookie_token', 'account_id'], [i.strip() for i in mes.split(';')])) mys_data = await get_mihoyo_bbs_info(mysid, cookie) for i in mys_data['data']['list']: if i['game_id'] != 2: @@ -270,7 +270,7 @@ async def deal_ck(mes, qid): c = conn.cursor() try: - c.execute("DELETE from CookiesCache where uid=? or mysid = ?", (uid, mysid)) + c.execute('DELETE from CookiesCache where uid=? or mysid = ?', (uid, mysid)) except: pass @@ -296,8 +296,8 @@ async def award(uid): group_str = '' for i in data['data']['month_data']['group_by']: group_str = group_str + \ - i['action'] + ":" + str(i['num']) + \ - "(" + str(i['percent']) + "%)" + '\n' + i['action'] + ':' + str(i['num']) + \ + '(' + str(i['percent']) + '%)' + '\n' im = month_im.format(nickname, uid, day_stone, day_mora, lastday_stone, lastday_mora, month_stone, month_mora, lastmonth_stone, lastmonth_mora, group_str) @@ -322,73 +322,73 @@ async def audio_wiki(name, message): if _audioid in tmp_json: tmp_json[_audioid].remove(audioid1) - if name == "列表": - imgmes = 'base64://' + b64encode(open(os.path.join(INDEX_PATH, "语音.png"), "rb").read()).decode() + if name == '列表': + imgmes = 'base64://' + b64encode(open(os.path.join(INDEX_PATH, '语音.png'), 'rb').read()).decode() return imgmes - elif name == "": - return "请输入角色名。" + elif name == '': + return '请输入角色名。' else: - audioid = re.findall(r"[0-9]+", message)[0] + audioid = re.findall(r'[0-9]+', message)[0] try: audio = await get(audioid) except: - return "语音获取失败" + return '语音获取失败' if audio: audios = 'base64://' + b64encode(audio.getvalue()).decode() return audios else: - return "没有找到语音,请检查语音ID与角色名是否正确,如无误则可能未收录该语音" + return '没有找到语音,请检查语音ID与角色名是否正确,如无误则可能未收录该语音' async def artifacts_wiki(name): - data = await get_misc_info("artifacts", name) - if "errcode" in data: - im = "该圣遗物不存在。" + data = await get_misc_info('artifacts', name) + if 'errcode' in data: + im = '该圣遗物不存在。' else: - star = "" - for i in data["rarity"]: - star = star + i + "星、" + star = '' + for i in data['rarity']: + star = star + i + '星、' star = star[:-1] - im = artifacts_im.format(data["name"], star, data["2pc"], data["4pc"], data["flower"]["name"], - data["flower"]["description"], - data["plume"]["name"], data["plume"]["description"], data["sands"]["name"], - data["sands"]["description"], - data["goblet"]["name"], data["goblet"]["description"], data["circlet"]["name"], - data["circlet"]["description"]) + im = artifacts_im.format(data['name'], star, data['2pc'], data['4pc'], data['flower']['name'], + data['flower']['description'], + data['plume']['name'], data['plume']['description'], data['sands']['name'], + data['sands']['description'], + data['goblet']['name'], data['goblet']['description'], data['circlet']['name'], + data['circlet']['description']) return im async def foods_wiki(name): - data = await get_misc_info("foods", name) - if "errcode" in data: - im = "该食物不存在。" + data = await get_misc_info('foods', name) + if 'errcode' in data: + im = '该食物不存在。' else: - ingredients = "" + ingredients = '' food_temp = {} - for i in data["ingredients"]: - if i["name"] not in food_temp: - food_temp[i["name"]] = i["count"] + for i in data['ingredients']: + if i['name'] not in food_temp: + food_temp[i['name']] = i['count'] else: - food_temp[i["name"]] = food_temp[i["name"]] + i["count"] + food_temp[i['name']] = food_temp[i['name']] + i['count'] for i in food_temp: - ingredients += i + ":" + str(food_temp[i]) + "\n" + ingredients += i + ':' + str(food_temp[i]) + '\n' ingredients = ingredients[:-1] - im = food_im.format(data["name"], data["rarity"], data["foodtype"], data["foodfilter"], data["effect"], - data["description"], ingredients) + im = food_im.format(data['name'], data['rarity'], data['foodtype'], data['foodfilter'], data['effect'], + data['description'], ingredients) return im async def enemies_wiki(name): - raw_data = await get_misc_info("enemies", name) - if "errcode" in raw_data: - im = "该原魔不存在。" + raw_data = await get_misc_info('enemies', name) + if 'errcode' in raw_data: + im = '该原魔不存在。' else: - reward = "" - for i in raw_data["rewardpreview"]: - reward += i["name"] + ":" + str(i["count"]) if "count" in i.keys() else i["name"] + ":" + "可能" - reward += "\n" - im = "【{}】\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}".format(raw_data["name"], raw_data["specialname"], - raw_data["category"], raw_data["description"], reward) + reward = '' + for i in raw_data['rewardpreview']: + reward += i['name'] + ':' + str(i['count']) if 'count' in i.keys() else i['name'] + ':' + '可能' + reward += '\n' + im = '【{}】\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}'.format(raw_data['name'], raw_data['specialname'], + raw_data['category'], raw_data['description'], reward) return im @@ -404,43 +404,43 @@ async def sign(uid): sign_info['total_sign_day']) - 1]['name'] getnum = sign_list['data']['awards'][int( sign_info['total_sign_day']) - 1]['cnt'] - get_im = f"本次签到获得{getitem}x{getnum}" - if status == "OK" and sign_info['is_sign'] == True: - mes_im = "签到成功" + get_im = f'本次签到获得{getitem}x{getnum}' + if status == 'OK' and sign_info['is_sign'] == True: + mes_im = '签到成功' else: mes_im = status sign_missed = sign_info['sign_cnt_missed'] - im = mes_im + "!" + "\n" + get_im + "\n" + f"本月漏签次数:{sign_missed}" + im = mes_im + '!' + '\n' + get_im + '\n' + f'本月漏签次数:{sign_missed}' except: - im = "签到失败,请检查Cookies是否失效。" + im = '签到失败,请检查Cookies是否失效。' return im # 统计状态函数 -async def daily(mode="push", uid=None): +async def daily(mode='push', uid=None): def seconds2hours(seconds: int) -> str: m, s = divmod(int(seconds), 60) h, m = divmod(m, 60) - return "%02d:%02d:%02d" % (h, m, s) + return '%02d:%02d:%02d' % (h, m, s) temp_list = [] conn = sqlite3.connect('ID_DATA.db') c = conn.cursor() c_data = None - if mode == "push": + if mode == 'push': cursor = c.execute( - "SELECT * FROM NewCookiesTable WHERE StatusA != ?", ("off",)) + 'SELECT * FROM NewCookiesTable WHERE StatusA != ?', ('off',)) c_data = cursor.fetchall() - elif mode == "ask": + elif mode == 'ask': c_data = ([uid, 0, 0, 0, 0, 0, 0],) for row in c_data: raw_data = await get_daily_data(str(row[0])) - if raw_data["retcode"] != 0: + if raw_data['retcode'] != 0: temp_list.append( - {"qid": row[2], "gid": row[3], "message": "你的推送状态有误;可能是uid绑定错误或没有在米游社打开“实时便筏”功能。"}) + {'qid': row[2], 'gid': row[3], 'message': '你的推送状态有误;可能是uid绑定错误或没有在米游社打开“实时便筏”功能。'}) else: - dailydata = raw_data["data"] + dailydata = raw_data['data'] current_resin = dailydata['current_resin'] current_expedition_num = dailydata['current_expedition_num'] @@ -455,32 +455,32 @@ async def daily(mode="push", uid=None): avatar_name: str = avatar if expedition['status'] == 'Finished': - expedition_info.append(f"{avatar_name} 探索完成") + expedition_info.append(f'{avatar_name} 探索完成') finished_expedition_num += 1 else: remained_timed: str = seconds2hours( expedition['remained_time']) expedition_info.append( - f"{avatar_name} 剩余时间{remained_timed}") + f'{avatar_name} 剩余时间{remained_timed}') if dailydata['transformer']['recovery_time']['reached']: - transformer_status = "可用" + transformer_status = '可用' else: transformer_time = dailydata['transformer']['recovery_time'] - transformer_status = "还剩{}天{}小时{}分钟可用".format(transformer_time['Day'], transformer_time['Hour'], + transformer_status = '还剩{}天{}小时{}分钟可用'.format(transformer_time['Day'], transformer_time['Hour'], transformer_time['Minute']) # 推送条件检查,在指令查询时 row[6] 为 0 ,而自动推送时 row[6] 为 140,这样保证用指令查询时必回复 # 说实话我仔细看了一会才理解… - if current_resin >= row[6] or dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: + if current_resin >= row[6] or dailydata['max_home_coin'] - dailydata['current_home_coin'] <= 100: tip = '' tips = [] if current_resin >= row[6] != 0: - tips.append("你的树脂快满了!") - if dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: - tips.append("你的洞天宝钱快满了!") + tips.append('你的树脂快满了!') + if dailydata['max_home_coin'] - dailydata['current_home_coin'] <= 100: + tips.append('你的洞天宝钱快满了!') if finished_expedition_num == current_expedition_num: - tips.append("你的所有探索派遣完成了!") # emmmm + tips.append('你的所有探索派遣完成了!') # emmmm if tips: tips.insert(0, '\n==============') tip = '\n'.join(tips) @@ -505,13 +505,13 @@ async def daily(mode="push", uid=None): dailydata['remain_resin_discount_num'] home_coin = f'{dailydata["current_home_coin"]}/{dailydata["max_home_coin"]}' - if dailydata["current_home_coin"] < dailydata["max_home_coin"]: - coin_rec_time = seconds2hours(int(dailydata["home_coin_recovery_time"])) - coin_add_speed = math.ceil((dailydata["max_home_coin"] - dailydata["current_home_coin"]) / ( - int(dailydata["home_coin_recovery_time"]) / 60 / 60)) + if dailydata['current_home_coin'] < dailydata['max_home_coin']: + coin_rec_time = seconds2hours(int(dailydata['home_coin_recovery_time'])) + coin_add_speed = math.ceil((dailydata['max_home_coin'] - dailydata['current_home_coin']) / ( + int(dailydata['home_coin_recovery_time']) / 60 / 60)) home_coin += f'({coin_rec_time} 约{coin_add_speed}/h)' - expedition_data = "\n".join(expedition_info) + expedition_data = '\n'.join(expedition_info) send_mes = daily_im.format(tip, current_resin, max_resin, rec_time, finished_task_num, total_task_num, is_extra_got, used_resin_discount_num, resin_discount_num_limit, home_coin, transformer_status, @@ -519,12 +519,12 @@ async def daily(mode="push", uid=None): max_expedition_num, expedition_data) temp_list.append( - {"qid": row[2], "gid": row[3], "message": send_mes}) + {'qid': row[2], 'gid': row[3], 'message': send_mes}) return temp_list async def mihoyo_coin(qid, s_cookies=None): - uid = await select_db(qid, mode="uid") + uid = await select_db(qid, mode='uid') uid = uid[0] if s_cookies is None: s_cookies = await get_stoken(uid) @@ -533,12 +533,12 @@ async def mihoyo_coin(qid, s_cookies=None): get_coin = coin.MihoyoBBSCoin(s_cookies) im = await get_coin.task_run() else: - im = "你还没有绑定Stoken~" + im = '你还没有绑定Stoken~' return im async def get_event_pic(): - img_path = os.path.join(FILE2_PATH, "event.jpg") + img_path = os.path.join(FILE2_PATH, 'event.jpg') while True: if os.path.exists(img_path): f = open(img_path, 'rb') @@ -553,68 +553,68 @@ async def get_event_pic(): async def weapon_wiki(name, level=None): data = await get_weapon_info(name) - if "errcode" in data: - im = "武器不存在。" + if 'errcode' in data: + im = '武器不存在。' elif level: data2 = await get_weapon_info(name, level) - if data["substat"] != "": - sp = data["substat"] + ":" + '%.1f%%' % (data2["specialized"] * 100) \ - if data["substat"] != "元素精通" else data["substat"] + ":" + str(math.floor(data2["specialized"])) + if data['substat'] != '': + sp = data['substat'] + ':' + '%.1f%%' % (data2['specialized'] * 100) \ + if data['substat'] != '元素精通' else data['substat'] + ':' + str(math.floor(data2['specialized'])) else: - sp = "" - im = (data["name"] + "\n等级:" + str(data2["level"]) + "(突破" + str(data2["ascension"]) + ")" + - "\n攻击力:" + str(round(data2["attack"])) + "\n" + sp) + sp = '' + im = (data['name'] + '\n等级:' + str(data2['level']) + '(突破' + str(data2['ascension']) + ')' + + '\n攻击力:' + str(round(data2['attack'])) + '\n' + sp) else: name = data['name'] _type = data['weapontype'] - star = data['rarity'] + "星" + star = data['rarity'] + '星' info = data['description'] atk = str(data['baseatk']) sub_name = data['substat'] - if data['subvalue'] != "": + if data['subvalue'] != '': sub_val = (data['subvalue'] + '%') if sub_name != '元素精通' else data['subvalue'] - sub = "\n" + "【" + sub_name + "】" + sub_val + sub = '\n' + '【' + sub_name + '】' + sub_val else: - sub = "" + sub = '' - if data['effectname'] != "": + if data['effectname'] != '': raw_effect = data['effect'] rw_ef = [] for i in range(len(data['r1'])): now = '' for j in range(1, 6): - now = now + data['r{}'.format(j)][i] + "/" + now = now + data['r{}'.format(j)][i] + '/' now = now[:-1] rw_ef.append(now) raw_effect = raw_effect.format(*rw_ef) - effect = "\n" + "【" + data['effectname'] + "】" + ":" + raw_effect + effect = '\n' + '【' + data['effectname'] + '】' + ':' + raw_effect else: - effect = "" + effect = '' im = weapon_im.format(name, _type, star, info, atk, sub, effect) return im -async def char_wiki(name, mode="char", level=None): +async def char_wiki(name, mode='char', level=None): im = '' - data = await get_char_info(name, mode, level if mode == "char" else None) - if mode == "char": + data = await get_char_info(name, mode, level if mode == 'char' else None) + if mode == 'char': if isinstance(data, list): im = ','.join(data) - elif "errcode" in data: - im = "不存在该角色或类型。" + elif 'errcode' in data: + im = '不存在该角色或类型。' elif level: data2 = await get_char_info(name, mode) - sp = data2["substat"] + ":" + '%.1f%%' % (data["specialized"] * 100) if data2["substat"] != "元素精通" else \ - data2["substat"] + ":" + str(math.floor(data["specialized"])) - im = (data2["name"] + "\n等级:" + str(data["level"]) + "\n血量:" + str(math.floor(data["hp"])) + - "\n攻击力:" + str(math.floor(data["attack"])) + "\n防御力:" + str(math.floor(data["defense"])) + - "\n" + sp) + sp = data2['substat'] + ':' + '%.1f%%' % (data['specialized'] * 100) if data2['substat'] != '元素精通' else \ + data2['substat'] + ':' + str(math.floor(data['specialized'])) + im = (data2['name'] + '\n等级:' + str(data['level']) + '\n血量:' + str(math.floor(data['hp'])) + + '\n攻击力:' + str(math.floor(data['attack'])) + '\n防御力:' + str(math.floor(data['defense'])) + + '\n' + sp) else: name = data['title'] + ' — ' + data['name'] star = data['rarity'] - _type = data["weapontype"] + _type = data['weapontype'] element = data['element'] up_val = data['substat'] bdday = data['birthday'] @@ -623,142 +623,142 @@ async def char_wiki(name, mode="char", level=None): info = data['description'] im = char_info_im.format( name, star, _type, element, up_val, bdday, polar, cv, info) - elif mode == "costs": + elif mode == 'costs': if isinstance(data[1], list): im = ','.join(data[1]) - elif "errcode" in data[1]: - im = "不存在该角色或类型。" + elif 'errcode' in data[1]: + im = '不存在该角色或类型。' else: - im = "【天赋材料(一份)】\n{}\n【突破材料】\n{}" - im1 = "" - im2 = "" + im = '【天赋材料(一份)】\n{}\n【突破材料】\n{}' + im1 = '' + im2 = '' talent_temp = {} talent_cost = data[1] for i in talent_cost.values(): for j in i: - if j["name"] not in talent_temp: - talent_temp[j["name"]] = j["count"] + if j['name'] not in talent_temp: + talent_temp[j['name']] = j['count'] else: - talent_temp[j["name"]] = talent_temp[j["name"]] + j["count"] + talent_temp[j['name']] = talent_temp[j['name']] + j['count'] for k in talent_temp: - im1 = im1 + k + ":" + str(talent_temp[k]) + "\n" + im1 = im1 + k + ':' + str(talent_temp[k]) + '\n' temp = {} cost = data[0] for i in range(1, 7): - for j in cost["ascend{}".format(i)]: - if j["name"] not in temp: - temp[j["name"]] = j["count"] + for j in cost['ascend{}'.format(i)]: + if j['name'] not in temp: + temp[j['name']] = j['count'] else: - temp[j["name"]] = temp[j["name"]] + j["count"] + temp[j['name']] = temp[j['name']] + j['count'] for k in temp: - im2 = im2 + k + ":" + str(temp[k]) + "\n" + im2 = im2 + k + ':' + str(temp[k]) + '\n' im = im.format(im1, im2) - elif mode == "constellations": - if "errcode" in data: - im = "不存在该角色或命座数量。" + elif mode == 'constellations': + if 'errcode' in data: + im = '不存在该角色或命座数量。' else: - im = "【" + data["c{}".format(level)]['name'] + "】" + ":" + \ - "\n" + data["c{}".format(level)]['effect'].replace("*", "") - elif mode == "talents": - if "errcode" in data: - im = "不存在该角色。" + im = '【' + data['c{}'.format(level)]['name'] + '】' + ':' + \ + '\n' + data['c{}'.format(level)]['effect'].replace('*', '') + elif mode == 'talents': + if 'errcode' in data: + im = '不存在该角色。' else: if 7 >= int(level) > 0: if int(level) <= 3: - if level == "1": - data = data["combat1"] - elif level == "2": - data = data["combat2"] - elif level == "3": - data = data["combat3"] - skill_name = data["name"] - skill_info = data["info"] - skill_detail = "" + if level == '1': + data = data['combat1'] + elif level == '2': + data = data['combat2'] + elif level == '3': + data = data['combat3'] + skill_name = data['name'] + skill_info = data['info'] + skill_detail = '' """ - for i in data["attributes"]["parameters"]: - temp = "" - for k in data["attributes"]["parameters"][i]: + for i in data['attributes']['parameters']: + temp = '' + for k in data['attributes']['parameters'][i]: if str(k).count('.') == 1: - temp += "%.2f%%" % (k * 100) + "/" + temp += '%.2f%%' % (k * 100) + '/' else: temp = k break - data["attributes"]["parameters"][i] = temp[:-1] + data['attributes']['parameters'][i] = temp[:-1] - for i in data["attributes"]["labels"]: - #i = i.replace("{","{{") - i = re.sub(r':[a-zA-Z0-9]+}', "}", i) + for i in data['attributes']['labels']: + #i = i.replace('{','{{') + i = re.sub(r':[a-zA-Z0-9]+}', '}', i) #i.replace(r':[a-zA-Z0-9]+}','}') - skill_detail += i + "\n" + skill_detail += i + '\n' - skill_detail = skill_detail.format(**data["attributes"]["parameters"]) + skill_detail = skill_detail.format(**data['attributes']['parameters']) """ mes_list = [] parameters = [] add_switch = True - for i in data["attributes"]["parameters"]: - for index, j in enumerate(data["attributes"]["parameters"][i]): + for i in data['attributes']['parameters']: + for index, j in enumerate(data['attributes']['parameters'][i]): if add_switch: parameters.append({}) if str(j).count('.') == 1 and j <= 20: - parameters[index].update({i: "%.2f%%" % (j * 100)}) + parameters[index].update({i: '%.2f%%' % (j * 100)}) elif str(j).count('.') == 1: - parameters[index].update({i: "%.2f" % (j * 100)}) + parameters[index].update({i: '%.2f' % (j * 100)}) else: parameters[index].update({i: j}) add_switch = False - for k in data["attributes"]["labels"]: - k = re.sub(r':[a-zA-Z0-9]+}', "}", k) - skill_detail += k + "\n" + for k in data['attributes']['labels']: + k = re.sub(r':[a-zA-Z0-9]+}', '}', k) + skill_detail += k + '\n' skill_detail = skill_detail[:-1] for i in range(1, 10): if i % 2 != 0: - skill_info = skill_info.replace("**", "「", 1) + skill_info = skill_info.replace('**', '「', 1) else: - skill_info = skill_info.replace("**", "」", 1) + skill_info = skill_info.replace('**', '」', 1) mes_list.append({ - "type": "node", - "data": { - "name": "小仙", - "uin": "3399214199", - "content": "【" + skill_name + "】" + "\n" + skill_info + 'type': 'node', + 'data': { + 'name' : '小仙', + 'uin' : '3399214199', + 'content': '【' + skill_name + '】' + '\n' + skill_info } }) for index, i in enumerate(parameters): mes = skill_detail.format(**i) node_data = { - "type": "node", - "data": { - "name": "小仙", - "uin": "3399214199", - "content": "lv." + str(index + 1) + "\n" + mes + 'type': 'node', + 'data': { + 'name' : '小仙', + 'uin' : '3399214199', + 'content': 'lv.' + str(index + 1) + '\n' + mes } } mes_list.append(node_data) im = mes_list else: - if level == "4": - data = data["passive1"] - elif level == "5": - data = data["passive2"] - elif level == "6": - data = data["passive3"] - elif level == "7": - data = data["passive4"] - skill_name = data["name"] - skill_info = data["info"] - im = "【{}】\n{}".format(skill_name, skill_info) + if level == '4': + data = data['passive1'] + elif level == '5': + data = data['passive2'] + elif level == '6': + data = data['passive3'] + elif level == '7': + data = data['passive4'] + skill_name = data['name'] + skill_info = data['info'] + im = '【{}】\n{}'.format(skill_name, skill_info) else: - im = "不存在该天赋。" + im = '不存在该天赋。' return im