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]*?)[a-zA-Z]*?>", time_data)[0]
- k["time_data"] = time_data
- elif value.text == "〓活动时间〓":
- time_data = content_bs.find_all("p")[index + 1].text
- if "([\s\S]*?)[a-zA-Z]*?>", s)[0])
+ for s in time_data.split(' ~ '):
+ if '([\s\S]*?)[a-zA-Z]*?>', 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]*?)[a-zA-Z]*?>", start_time)[0]
- end_time = findall("<[a-zA-Z]+.*?>([\s\S]*?)[a-zA-Z]*?>",
- content_bs.find_all("tr")[1].td.find_all("p")[2].text)[0]
- if "([\s\S]*?)[a-zA-Z]*?>", 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]*?)[a-zA-Z]*?>', start_time)[0]
+ end_time = findall('<[a-zA-Z]+.*?>([\s\S]*?)[a-zA-Z]*?>',
+ content_bs.find_all('tr')[1].td.find_all('p')[2].text)[0]
+ if '([\s\S]*?)[a-zA-Z]*?>', 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