Merge pull request #180 from lgc2333/main

规范引号
This commit is contained in:
MingxuanGame 2022-04-03 22:36:34 +08:00 committed by GitHub
commit d823089dfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 1511 additions and 1507 deletions

View File

@ -12,17 +12,18 @@
<a><img src="https://s2.loli.net/2022/02/01/QlS4piWXw5rZO3D.png"></a> <a><img src="https://s2.loli.net/2022/02/01/QlS4piWXw5rZO3D.png"></a>
</p> </p>
## 丨我该如何安装该插件? ## 丨我该如何安装该插件?
+ 如果你使用的是[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)
+ 如果你使用的是[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)**。(**开发者正在使用** & [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使用此插件你需要**做好以下准备**
- 拥有QQ频道机器人的开发者账号类型私域 - 拥有QQ频道机器人的开发者账号类型私域
- 拥有已经备案好的服务器地址(视情况后期官方放开本地图片发送而定) - 拥有已经备案好的服务器地址(视情况后期官方放开本地图片发送而定)
- **腾讯频道Bot官方的文档**,查看[此处](https://bot.q.qq.com/wiki/#) - **腾讯频道Bot官方的文档**,查看[此处](https://bot.q.qq.com/wiki/#)
- 安装方法:基于官方的[PythonSDK](https://github.com/tencent-connect/botpy),本插件的安装方法可自行摸索。 - 安装方法:基于官方的[PythonSDK](https://github.com/tencent-connect/botpy),本插件的安装方法可自行摸索。
## 丨我该如何获取Cookies[#92](https://github.com/KimigaiiWuyi/GenshinUID/issues/92)[@RemKeeper](https://github.com/RemKeeper) ## 丨我该如何获取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) - 插件原始代码来自于它 - [PaimonBot](https://github.com/XiaoMiku01/PaimonBot) - 插件原始代码来自于它
- [YuanShen_User_Info](https://github.com/Womsxd/YuanShen_User_Info) - 米游社API来自于它 - [YuanShen_User_Info](https://github.com/Womsxd/YuanShen_User_Info) - 米游社API来自于它
- *[MiniGG](https://www.minigg.cn/)* - Wiki API来自于它 - *[MiniGG](https://www.minigg.cn/)* - Wiki API来自于它
- [@MingxuanGame](https://github.com/MingxuanGame) - [Nonebot2-beta1](https://github.com/KimigaiiWuyi/GenshinUID/tree/nonebot2-beta1)分支新建与维护 - [@MingxuanGame](https://github.com/MingxuanGame)
- [@shirokurakana](https://github.com/shirokurakana) - [Nonebot2-beta1分支的修复与优化](https://github.com/KimigaiiWuyi/GenshinUID/pull/118) - [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) - 米游社签到部分的代码指导 - [@AMEKENN](https://github.com/AMEKENN) - 米游社签到部分的代码指导
- [@lgc233](https://github.com/lgc2333) - 众多优秀PR贡献 - [@lgc233](https://github.com/lgc2333) - 众多优秀PR贡献
- [@RemKeeper](https://github.com/RemKeeper) - 简易Cookies获取文档 - [@RemKeeper](https://github.com/RemKeeper) - 简易Cookies获取文档
@ -88,4 +91,5 @@ if (ask == true) {
+ 如果本插件对你有帮助不要忘了点个Star~ + 如果本插件对你有帮助不要忘了点个Star~
+ 本项目仅供学习使用,请勿用于商业用途 + 本项目仅供学习使用,请勿用于商业用途
+ [爱发电](https://afdian.net/@KimigaiiWuyi) + [爱发电](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)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,47 +7,47 @@ from httpx import AsyncClient
from get_data import old_version_get_ds_token, random_hex from get_data import old_version_get_ds_token, random_hex
# 米游社的API列表 # 米游社的API列表
bbs_Cookieurl = "https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}" bbs_Cookieurl = 'https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}'
bbs_Cookieurl2 = "https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket" \ bbs_Cookieurl2 = 'https://api-takumi.mihoyo.com/auth/api/getMultiTokenByLoginTicket' \
"?login_ticket={}&token_types=3&uid={}" '?login_ticket={}&token_types=3&uid={}'
bbs_Taskslist = "https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState" # 获取任务列表 bbs_Taskslist = 'https://bbs-api.mihoyo.com/apihub/sapi/getUserMissionsState' # 获取任务列表
bbs_Signurl = "https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}" # post bbs_Signurl = 'https://bbs-api.mihoyo.com/apihub/sapi/signIn?gids={}' # post
bbs_Listurl = "https://bbs-api.mihoyo.com/post/api/getForumPostList?" \ bbs_Listurl = 'https://bbs-api.mihoyo.com/post/api/getForumPostList?' \
"forum_id={}&is_good=false&is_hot=false&page_size=20&sort_type=1" '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_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_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_Likeurl = 'https://bbs-api.mihoyo.com/apihub/sapi/upvotePost' # post json
mihoyobbs_List = [{ mihoyobbs_List = [{
"id": "1", 'id' : '1',
"forumId": "1", 'forumId': '1',
"name": "崩坏3", 'name' : '崩坏3',
"url": "https://bbs.mihoyo.com/bh3/" 'url' : 'https://bbs.mihoyo.com/bh3/'
}, { }, {
"id": "2", 'id' : '2',
"forumId": "26", 'forumId': '26',
"name": "原神", 'name' : '原神',
"url": "https://bbs.mihoyo.com/ys/" 'url' : 'https://bbs.mihoyo.com/ys/'
}, { }, {
"id": "3", 'id' : '3',
"forumId": "30", 'forumId': '30',
"name": "崩坏2", 'name' : '崩坏2',
"url": "https://bbs.mihoyo.com/bh2/" 'url' : 'https://bbs.mihoyo.com/bh2/'
}, { }, {
"id": "4", 'id' : '4',
"forumId": "37", 'forumId': '37',
"name": "未定事件簿", 'name' : '未定事件簿',
"url": "https://bbs.mihoyo.com/wd/" 'url' : 'https://bbs.mihoyo.com/wd/'
}, { }, {
"id": "5", 'id' : '5',
"forumId": "34", 'forumId': '34',
"name": "大别野", 'name' : '大别野',
"url": "https://bbs.mihoyo.com/dby/" 'url' : 'https://bbs.mihoyo.com/dby/'
}, { }, {
"id": "6", 'id' : '6',
"forumId": "52", 'forumId': '52',
"name": "崩坏:星穹铁道", 'name' : '崩坏:星穹铁道',
"url": "https://bbs.mihoyo.com/sr/" 'url' : 'https://bbs.mihoyo.com/sr/'
}] }]
@ -58,26 +58,26 @@ def random_text(num: int) -> str:
class MihoyoBBSCoin: class MihoyoBBSCoin:
def __init__(self, cookies): def __init__(self, cookies):
self.headers = { self.headers = {
"DS": old_version_get_ds_token(True), 'DS' : old_version_get_ds_token(True),
"cookie": cookies, 'cookie' : cookies,
"x-rpc-client_type": "2", 'x-rpc-client_type' : '2',
"x-rpc-app_version": "2.7.0", 'x-rpc-app_version' : '2.7.0',
"x-rpc-sys_version": "6.0.1", 'x-rpc-sys_version' : '6.0.1',
"x-rpc-channel": "mihoyo", 'x-rpc-channel' : 'mihoyo',
"x-rpc-device_id": random_hex(32), 'x-rpc-device_id' : random_hex(32),
"x-rpc-device_name": random_text(random.randint(1, 10)), 'x-rpc-device_name' : random_text(random.randint(1, 10)),
"x-rpc-device_model": "Mi 10", 'x-rpc-device_model': 'Mi 10',
"Referer": "https://app.mihoyo.com", 'Referer' : 'https://app.mihoyo.com',
"Host": "bbs-api.mihoyo.com", 'Host' : 'bbs-api.mihoyo.com',
"User-Agent": "okhttp/4.8.0" 'User-Agent' : 'okhttp/4.8.0'
} }
self.Task_do = { self.Task_do = {
"bbs_Sign": False, 'bbs_Sign' : False,
"bbs_Read_posts": False, 'bbs_Read_posts' : False,
"bbs_Read_posts_num": 3, 'bbs_Read_posts_num': 3,
"bbs_Like_posts": False, 'bbs_Like_posts' : False,
"bbs_Like_posts_num": 5, 'bbs_Like_posts_num': 5,
"bbs_Share": False 'bbs_Share' : False
} }
self.mihoyobbs_List_Use = [] self.mihoyobbs_List_Use = []
self.Today_getcoins = 0 self.Today_getcoins = 0
@ -92,145 +92,145 @@ class MihoyoBBSCoin:
read = await self.read_posts() read = await self.read_posts()
like = await self.like_posts() like = await self.like_posts()
share = await self.share_post() 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 return im
async def load_mihoyo_bbs_list_use(self): async def load_mihoyo_bbs_list_use(self):
for i in [2, 5]: for i in [2, 5]:
for k in mihoyobbs_List: for k in mihoyobbs_List:
if i == int(k["id"]): if i == int(k['id']):
self.mihoyobbs_List_Use.append(k) self.mihoyobbs_List_Use.append(k)
# 获取任务列表,用来判断做了哪些任务 # 获取任务列表,用来判断做了哪些任务
async def get_tasks_list(self): async def get_tasks_list(self):
# log.info("正在获取任务列表") # log.info('正在获取任务列表')
async with AsyncClient() as client: async with AsyncClient() as client:
req = await client.get(url=bbs_Taskslist, headers=self.headers) req = await client.get(url=bbs_Taskslist, headers=self.headers)
data = req.json() data = req.json()
if "err" in data["message"] or data["retcode"] == -100: if 'err' in data['message'] or data['retcode'] == -100:
return "你的Cookies已失效。" return '你的Cookies已失效。'
# log.error("获取任务列表失败你的cookie可能已过期请重新设置cookie。") # log.error('获取任务列表失败你的cookie可能已过期请重新设置cookie。')
else: else:
self.Today_getcoins = data["data"]["can_get_points"] self.Today_getcoins = data['data']['can_get_points']
self.Today_have_getcoins = data["data"]["already_received_points"] self.Today_have_getcoins = data['data']['already_received_points']
self.Have_coins = data["data"]["total_points"] self.Have_coins = data['data']['total_points']
# 如果当日可获取米游币数量为0直接判断全部任务都完成了 # 如果当日可获取米游币数量为0直接判断全部任务都完成了
if self.Today_getcoins == 0: if self.Today_getcoins == 0:
self.Task_do["bbs_Sign"] = True self.Task_do['bbs_Sign'] = True
self.Task_do["bbs_Read_posts"] = True self.Task_do['bbs_Read_posts'] = True
self.Task_do["bbs_Like_posts"] = True self.Task_do['bbs_Like_posts'] = True
self.Task_do["bbs_Share"] = True self.Task_do['bbs_Share'] = True
else: else:
# 如果第0个大于或等于62则直接判定任务没做 # 如果第0个大于或等于62则直接判定任务没做
if data["data"]["states"][0]["mission_id"] >= 62: if data['data']['states'][0]['mission_id'] >= 62:
# log.info(f"新的一天,今天可以获得{self.Today_getcoins}个米游币") # log.info(f'新的一天,今天可以获得{self.Today_getcoins}个米游币')
pass pass
else: else:
# log.info(f"似乎还有任务没完成,今天还能获得{self.Today_getcoins}") # log.info(f'似乎还有任务没完成,今天还能获得{self.Today_getcoins}')
for i in data["data"]["states"]: for i in data['data']['states']:
# 58是讨论区签到 # 58是讨论区签到
if i["mission_id"] == 58: if i['mission_id'] == 58:
if i["is_get_award"]: if i['is_get_award']:
self.Task_do["bbs_Sign"] = True self.Task_do['bbs_Sign'] = True
# 59是看帖子 # 59是看帖子
elif i["mission_id"] == 59: elif i['mission_id'] == 59:
if i["is_get_award"]: if i['is_get_award']:
self.Task_do["bbs_Read_posts"] = True self.Task_do['bbs_Read_posts'] = True
else: else:
self.Task_do["bbs_Read_posts_num"] -= i["happened_times"] self.Task_do['bbs_Read_posts_num'] -= i['happened_times']
# 60是给帖子点赞 # 60是给帖子点赞
elif i["mission_id"] == 60: elif i['mission_id'] == 60:
if i["is_get_award"]: if i['is_get_award']:
self.Task_do["bbs_Like_posts"] = True self.Task_do['bbs_Like_posts'] = True
else: else:
self.Task_do["bbs_Like_posts_num"] -= i["happened_times"] self.Task_do['bbs_Like_posts_num'] -= i['happened_times']
# 61是分享帖子 # 61是分享帖子
elif i["mission_id"] == 61: elif i['mission_id'] == 61:
if i["is_get_award"]: if i['is_get_award']:
self.Task_do["bbs_Share"] = True self.Task_do['bbs_Share'] = True
# 分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环 # 分享帖子,是最后一个任务,到这里了下面都是一次性任务,直接跳出循环
break break
return "开始执行~" return '开始执行~'
# 获取要帖子列表 # 获取要帖子列表
async def get_list(self) -> list: async def get_list(self) -> list:
temp_list = [] temp_list = []
print("正在获取帖子列表......") print('正在获取帖子列表......')
async with AsyncClient() as client: 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() data = req.json()
for n in range(5): for n in range(5):
temp_list.append([data["data"]["list"][n]["post"]["post_id"], data["data"]["list"][n]["post"]["subject"]]) temp_list.append([data['data']['list'][n]['post']['post_id'], data['data']['list'][n]['post']['subject']])
# log.info("已获取{}个帖子".format(len(temp_list))) # log.info('已获取{}个帖子'.format(len(temp_list)))
return temp_list return temp_list
# 进行签到操作 # 进行签到操作
async def signing(self): async def signing(self):
if self.Task_do["bbs_Sign"]: if self.Task_do['bbs_Sign']:
return "讨论区任务已经完成过了~" return '讨论区任务已经完成过了~'
else: else:
for i in self.mihoyobbs_List_Use: for i in self.mihoyobbs_List_Use:
async with AsyncClient() as client: 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() data = req.json()
if "err" not in data["message"]: if 'err' not in data['message']:
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
else: else:
return "你的Cookies已失效。" return '你的Cookies已失效。'
return "已完成签到任务~" return '已完成签到任务~'
# 看帖子 # 看帖子
async def read_posts(self): async def read_posts(self):
if self.Task_do["bbs_Read_posts"]: if self.Task_do['bbs_Read_posts']:
return "看帖任务已经完成过了~" return '看帖任务已经完成过了~'
else: else:
num_ok = 0 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: async with AsyncClient() as client:
req = await client.get(url=bbs_Detailurl.format(self.postsList[i][0]), headers=self.headers) req = await client.get(url=bbs_Detailurl.format(self.postsList[i][0]), headers=self.headers)
data = req.json() data = req.json()
if data["message"] == "OK": if data['message'] == 'OK':
num_ok += 1 num_ok += 1
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
return "已完成看帖任务~共计成功{}次~".format(str(num_ok)) return '已完成看帖任务~共计成功{}次~'.format(str(num_ok))
# 点赞 # 点赞
async def like_posts(self): async def like_posts(self):
if self.Task_do["bbs_Like_posts"]: if self.Task_do['bbs_Like_posts']:
return "点赞任务已经完成过了~" return '点赞任务已经完成过了~'
else: else:
num_ok = 0 num_ok = 0
num_cancel = 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: async with AsyncClient() as client:
req = await client.post(url=bbs_Likeurl, headers=self.headers, 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() data = req.json()
if data["message"] == "OK": if data['message'] == 'OK':
num_ok += 1 num_ok += 1
# 判断取消点赞是否打开 # 判断取消点赞是否打开
if True: if True:
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
async with AsyncClient() as client: async with AsyncClient() as client:
req = await client.post(url=bbs_Likeurl, headers=self.headers, 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() data = req.json()
if data["message"] == "OK": if data['message'] == 'OK':
num_cancel += 1 num_cancel += 1
time.sleep(random.randint(2, 8)) 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): async def share_post(self):
if self.Task_do["bbs_Share"]: if self.Task_do['bbs_Share']:
return "分享任务已经完成过了~" return '分享任务已经完成过了~'
else: else:
for _ in range(3): for _ in range(3):
async with AsyncClient() as client: async with AsyncClient() as client:
req = await client.get(url=bbs_Shareurl.format(self.postsList[0][0]), headers=self.headers) req = await client.get(url=bbs_Shareurl.format(self.postsList[0][0]), headers=self.headers)
data = req.json() data = req.json()
if data["message"] == "OK": if data['message'] == 'OK':
return "已完成分享任务~获得10米游币~" return '已完成分享任务~获得10米游币~'
else: else:
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))
time.sleep(random.randint(2, 8)) time.sleep(random.randint(2, 8))

View File

@ -19,50 +19,50 @@ INDEX_PATH = os.path.join(FILE2_PATH, 'index')
Texture_PATH = os.path.join(FILE2_PATH, 'texture2d') Texture_PATH = os.path.join(FILE2_PATH, 'texture2d')
avatar_json = { avatar_json = {
"Albedo": "阿贝多", 'Albedo' : '阿贝多',
"Ambor": "安柏", 'Ambor' : '安柏',
"Barbara": "芭芭拉", 'Barbara' : '芭芭拉',
"Beidou": "北斗", 'Beidou' : '北斗',
"Bennett": "班尼特", 'Bennett' : '班尼特',
"Chongyun": "重云", 'Chongyun' : '重云',
"Diluc": "迪卢克", 'Diluc' : '迪卢克',
"Diona": "迪奥娜", 'Diona' : '迪奥娜',
"Eula": "优菈", 'Eula' : '优菈',
"Fischl": "菲谢尔", 'Fischl' : '菲谢尔',
"Ganyu": "甘雨", 'Ganyu' : '甘雨',
"Hutao": "胡桃", 'Hutao' : '胡桃',
"Jean": "", 'Jean' : '',
"Kazuha": "枫原万叶", 'Kazuha' : '枫原万叶',
"Kaeya": "凯亚", 'Kaeya' : '凯亚',
"Ayaka": "神里绫华", 'Ayaka' : '神里绫华',
"Keqing": "刻晴", 'Keqing' : '刻晴',
"Klee": "可莉", 'Klee' : '可莉',
"Lisa": "丽莎", 'Lisa' : '丽莎',
"Mona": "莫娜", 'Mona' : '莫娜',
"Ningguang": "凝光", 'Ningguang': '凝光',
"Noel": "诺艾尔", 'Noel' : '诺艾尔',
"Qiqi": "七七", 'Qiqi' : '七七',
"Razor": "雷泽", 'Razor' : '雷泽',
"Rosaria": "罗莎莉亚", 'Rosaria' : '罗莎莉亚',
"Sucrose": "砂糖", 'Sucrose' : '砂糖',
"Tartaglia": "达达利亚", 'Tartaglia': '达达利亚',
"Venti": "温迪", 'Venti' : '温迪',
"Xiangling": "香菱", 'Xiangling': '香菱',
"Xiao": "", 'Xiao' : '',
"Xingqiu": "行秋", 'Xingqiu' : '行秋',
"Xinyan": "辛焱", 'Xinyan' : '辛焱',
"Yanfei": "烟绯", 'Yanfei' : '烟绯',
"Zhongli": "钟离", 'Zhongli' : '钟离',
"Yoimiya": "宵宫", 'Yoimiya' : '宵宫',
"Sayu": "早柚", 'Sayu' : '早柚',
"Shogun": "雷电将军", 'Shogun' : '雷电将军',
"Aloy": "埃洛伊", 'Aloy' : '埃洛伊',
"Sara": "九条裟罗", 'Sara' : '九条裟罗',
"Kokomi": "珊瑚宫心海", 'Kokomi' : '珊瑚宫心海',
"Shenhe": "申鹤" 'Shenhe' : '申鹤'
} }
daily_im = ''' daily_im = """
*数据刷新可能存在一定延迟请以当前游戏实际数据为准{} *数据刷新可能存在一定延迟请以当前游戏实际数据为准{}
============== ==============
原粹树脂{}/{}{} 原粹树脂{}/{}{}
@ -72,9 +72,9 @@ daily_im = '''
参量质变仪{} 参量质变仪{}
探索派遣 探索派遣
总数/完成/上限{}/{}/{} 总数/完成/上限{}/{}/{}
{}''' {}"""
month_im = ''' month_im = """
============== ==============
{} {}
UID{} UID{}
@ -92,15 +92,15 @@ UID{}
上月获取摩拉{} 上月获取摩拉{}
============== ==============
原石收入组成 原石收入组成
{}==============''' {}=============="""
weapon_im = '''【名称】:{} weapon_im = """【名称】:{}
类型{} 类型{}
稀有度{} 稀有度{}
介绍{} 介绍{}
攻击力{}{}{}''' 攻击力{}{}{}"""
char_info_im = '''{} char_info_im = """{}
稀有度{} 稀有度{}
武器{} 武器{}
元素{} 元素{}
@ -108,9 +108,9 @@ char_info_im = '''{}
生日{} 生日{}
命之座{} 命之座{}
cv{} cv{}
介绍{}''' 介绍{}"""
artifacts_im = '''{} artifacts_im = """{}
稀有度{} 稀有度{}
2件套{} 2件套{}
4件套{} 4件套{}
@ -118,54 +118,54 @@ artifacts_im = '''【{}】
{}{} {}{}
{}{} {}{}
{}{} {}{}
{}{}''' {}{}"""
food_im = '''{} food_im = """{}
稀有度{} 稀有度{}
食物类型{} 食物类型{}
食物类别{} 食物类别{}
效果{} 效果{}
介绍{} 介绍{}
材料 材料
{}''' {}"""
audio_json = '''{ audio_json = """{
"357":["357_01","357_02","357_03"], '357':['357_01','357_02','357_03'],
"1000000":["1000000_01","1000000_02","1000000_03","1000000_04","1000000_05","1000000_06","1000000_07"], '1000000':['1000000_01','1000000_02','1000000_03','1000000_04','1000000_05','1000000_06','1000000_07'],
"1000001":["1000001_01","1000001_02","1000001_03"], '1000001':['1000001_01','1000001_02','1000001_03'],
"1000002":["1000002_01","1000002_02","1000002_03"], '1000002':['1000002_01','1000002_02','1000002_03'],
"1000100":["1000100_01","1000100_02","1000100_03","1000100_04","1000100_05"], '1000100':['1000100_01','1000100_02','1000100_03','1000100_04','1000100_05'],
"1000101":["1000101_01","1000101_02","1000101_03","1000101_04","1000101_05","1000101_06"], '1000101':['1000101_01','1000101_02','1000101_03','1000101_04','1000101_05','1000101_06'],
"1000200":["1000200_01","1000200_02","1000200_03"], '1000200':['1000200_01','1000200_02','1000200_03'],
"1010201":["1010201_01"], '1010201':['1010201_01'],
"1000300":["1000300_01","1000300_02"], '1000300':['1000300_01','1000300_02'],
"1000400":["1000400_01","1000400_02","1000400_03"], '1000400':['1000400_01','1000400_02','1000400_03'],
"1000500":["1000500_01","1000500_02","1000500_03"], '1000500':['1000500_01','1000500_02','1000500_03'],
"1010000":["1010000_01","1010000_02","1010000_03","1010000_04","1010000_05"], '1010000':['1010000_01','1010000_02','1010000_03','1010000_04','1010000_05'],
"1010001":["1010001_01","1010001_02"], '1010001':['1010001_01','1010001_02'],
"1010100":["1010100_01","1010100_02","1010100_03","1010100_04","1010100_05"], '1010100':['1010100_01','1010100_02','1010100_03','1010100_04','1010100_05'],
"1010200":["1010200_01","1010200_02","1010200_03","1010200_04","1010200_05"], '1010200':['1010200_01','1010200_02','1010200_03','1010200_04','1010200_05'],
"1010300":["1010300_01","1010300_02","1010300_03","1010300_04","1010300_05"], '1010300':['1010300_01','1010300_02','1010300_03','1010300_04','1010300_05'],
"1010301":["1010301_01","1010301_02","1010301_03","1010301_04","1010301_05"], '1010301':['1010301_01','1010301_02','1010301_03','1010301_04','1010301_05'],
"1010400":["1010400_01","1010400_02","1010400_03"], '1010400':['1010400_01','1010400_02','1010400_03'],
"1020000":["1020000_01"] '1020000':['1020000_01']
}''' }"""
char_adv_im = '''{} char_adv_im = """{}
五星武器{} 五星武器{}
四星武器{} 四星武器{}
三星武器{} 三星武器{}
圣遗物 圣遗物
{}''' {}"""
async def weapon_adv(name): 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 # char_adv_path = FILE_PATH
wb = load_workbook(char_adv_path) wb = load_workbook(char_adv_path)
ws = wb.active ws = wb.active
weapon_name = "" weapon_name = ''
char_list = [] char_list = []
for c in range(2, 5): for c in range(2, 5):
for r in range(2, 300): for r in range(2, 300):
@ -177,19 +177,19 @@ async def weapon_adv(name):
if char_list: if char_list:
im = ','.join(char_list) im = ','.join(char_list)
im = im + "可能会用到【{}".format(weapon_name) im = im + '可能会用到【{}'.format(weapon_name)
else: else:
im = "没有角色能使用【{}".format(weapon_name) im = '没有角色能使用【{}'.format(weapon_name)
return im return im
async def char_adv(name): async def char_adv(name):
char_name = None 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 # char_adv_path = FILE_PATH
wb = load_workbook(char_adv_path) wb = load_workbook(char_adv_path)
ws = wb.active ws = wb.active
char_list = ws["A"] char_list = ws['A']
index = None index = None
for i in char_list: for i in char_list:
if i.value: if i.value:
@ -198,68 +198,68 @@ async def char_adv(name):
index = i.row index = i.row
char_name = i.value char_name = i.value
if index: if index:
weapon_5star = "" weapon_5star = ''
for i in range(index, index + 5): for i in range(index, index + 5):
if ws.cell(i, 2).value: if ws.cell(i, 2).value:
weapon_5star += ws.cell(i, 2).value + ">" weapon_5star += ws.cell(i, 2).value + '>'
if weapon_5star != "": if weapon_5star != '':
weapon_5star = weapon_5star[:-1] weapon_5star = weapon_5star[:-1]
else: else:
weapon_5star = "无推荐" weapon_5star = '无推荐'
weapon_4star = "" weapon_4star = ''
for i in range(index, index + 5): for i in range(index, index + 5):
if ws.cell(i, 3).value: if ws.cell(i, 3).value:
weapon_4star += ws.cell(i, 3).value + ">" weapon_4star += ws.cell(i, 3).value + '>'
if weapon_4star != "": if weapon_4star != '':
weapon_4star = weapon_4star[:-1] weapon_4star = weapon_4star[:-1]
else: else:
weapon_4star = "无推荐" weapon_4star = '无推荐'
weapon_3star = "" weapon_3star = ''
for i in range(index, index + 5): for i in range(index, index + 5):
if ws.cell(i, 4).value: if ws.cell(i, 4).value:
weapon_3star += ws.cell(i, 4).value + ">" weapon_3star += ws.cell(i, 4).value + '>'
if weapon_3star != "": if weapon_3star != '':
weapon_3star = weapon_3star[:-1] weapon_3star = weapon_3star[:-1]
else: else:
weapon_3star = "无推荐" weapon_3star = '无推荐'
artifacts = "" artifacts = ''
for i in range(index, index + 5): for i in range(index, index + 5):
if ws.cell(i, 5).value: if ws.cell(i, 5).value:
if ws.cell(i, 6).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: else:
artifacts += ws.cell(i, 5).value + "*4" + "\n" artifacts += ws.cell(i, 5).value + '*4' + '\n'
if artifacts != "": if artifacts != '':
artifacts = artifacts[:-1] artifacts = artifacts[:-1]
else: else:
artifacts = "无推荐" artifacts = '无推荐'
im = char_adv_im.format(char_name, weapon_5star, weapon_4star, weapon_3star, artifacts) im = char_adv_im.format(char_name, weapon_5star, weapon_4star, weapon_3star, artifacts)
return im return im
async def deal_ck(mes, qid): async def deal_ck(mes, qid):
if "stoken" in mes: if 'stoken' in mes:
login_ticket = re.search(r"login_ticket=([0-9a-zA-Z]+)", mes).group(0).split('=')[1] login_ticket = re.search(r'login_ticket=([0-9a-zA-Z]+)', mes).group(0).split('=')[1]
uid = await select_db(qid, "uid") uid = await select_db(qid, 'uid')
# mys_id = re.search(r"login_uid=([0-9]+)", mes).group(0).split('=')[1] # mys_id = re.search(r'login_uid=([0-9]+)', mes).group(0).split('=')[1]
ck = await owner_cookies(uid[0]) 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) raw_data = await get_stoken_by_login_ticket(login_ticket, mys_id)
stoken = raw_data["data"]["list"][0]["token"] stoken = raw_data['data']['list'][0]['token']
s_cookies = "stuid={};stoken={}".format(mys_id, stoken) s_cookies = 'stuid={};stoken={}'.format(mys_id, stoken)
await stoken_db(s_cookies, uid[0]) await stoken_db(s_cookies, uid[0])
return "添加Stoken成功" return '添加Stoken成功'
else: else:
aid = re.search(r"account_id=(\d*)", mes) aid = re.search(r'account_id=(\d*)', mes)
mysid_data = aid.group(0).split('=') mysid_data = aid.group(0).split('=')
mysid = mysid_data[1] mysid = mysid_data[1]
cookie = ';'.join(filter(lambda x: x.split('=')[0] in [ 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) mys_data = await get_mihoyo_bbs_info(mysid, cookie)
for i in mys_data['data']['list']: for i in mys_data['data']['list']:
if i['game_id'] != 2: if i['game_id'] != 2:
@ -270,7 +270,7 @@ async def deal_ck(mes, qid):
c = conn.cursor() c = conn.cursor()
try: try:
c.execute("DELETE from CookiesCache where uid=? or mysid = ?", (uid, mysid)) c.execute('DELETE from CookiesCache where uid=? or mysid = ?', (uid, mysid))
except: except:
pass pass
@ -296,8 +296,8 @@ async def award(uid):
group_str = '' group_str = ''
for i in data['data']['month_data']['group_by']: for i in data['data']['month_data']['group_by']:
group_str = group_str + \ group_str = group_str + \
i['action'] + "" + str(i['num']) + \ i['action'] + '' + str(i['num']) + \
"" + str(i['percent']) + "%" + '\n' '' + str(i['percent']) + '%' + '\n'
im = month_im.format(nickname, uid, day_stone, day_mora, lastday_stone, lastday_mora, im = month_im.format(nickname, uid, day_stone, day_mora, lastday_stone, lastday_mora,
month_stone, month_mora, lastmonth_stone, lastmonth_mora, group_str) 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: if _audioid in tmp_json:
tmp_json[_audioid].remove(audioid1) tmp_json[_audioid].remove(audioid1)
if name == "列表": if name == '列表':
imgmes = 'base64://' + b64encode(open(os.path.join(INDEX_PATH, "语音.png"), "rb").read()).decode() imgmes = 'base64://' + b64encode(open(os.path.join(INDEX_PATH, '语音.png'), 'rb').read()).decode()
return imgmes return imgmes
elif name == "": elif name == '':
return "请输入角色名。" return '请输入角色名。'
else: else:
audioid = re.findall(r"[0-9]+", message)[0] audioid = re.findall(r'[0-9]+', message)[0]
try: try:
audio = await get(audioid) audio = await get(audioid)
except: except:
return "语音获取失败" return '语音获取失败'
if audio: if audio:
audios = 'base64://' + b64encode(audio.getvalue()).decode() audios = 'base64://' + b64encode(audio.getvalue()).decode()
return audios return audios
else: else:
return "没有找到语音请检查语音ID与角色名是否正确如无误则可能未收录该语音" return '没有找到语音请检查语音ID与角色名是否正确如无误则可能未收录该语音'
async def artifacts_wiki(name): async def artifacts_wiki(name):
data = await get_misc_info("artifacts", name) data = await get_misc_info('artifacts', name)
if "errcode" in data: if 'errcode' in data:
im = "该圣遗物不存在。" im = '该圣遗物不存在。'
else: else:
star = "" star = ''
for i in data["rarity"]: for i in data['rarity']:
star = star + i + "星、" star = star + i + '星、'
star = star[:-1] star = star[:-1]
im = artifacts_im.format(data["name"], star, data["2pc"], data["4pc"], data["flower"]["name"], im = artifacts_im.format(data['name'], star, data['2pc'], data['4pc'], data['flower']['name'],
data["flower"]["description"], data['flower']['description'],
data["plume"]["name"], data["plume"]["description"], data["sands"]["name"], data['plume']['name'], data['plume']['description'], data['sands']['name'],
data["sands"]["description"], data['sands']['description'],
data["goblet"]["name"], data["goblet"]["description"], data["circlet"]["name"], data['goblet']['name'], data['goblet']['description'], data['circlet']['name'],
data["circlet"]["description"]) data['circlet']['description'])
return im return im
async def foods_wiki(name): async def foods_wiki(name):
data = await get_misc_info("foods", name) data = await get_misc_info('foods', name)
if "errcode" in data: if 'errcode' in data:
im = "该食物不存在。" im = '该食物不存在。'
else: else:
ingredients = "" ingredients = ''
food_temp = {} food_temp = {}
for i in data["ingredients"]: for i in data['ingredients']:
if i["name"] not in food_temp: if i['name'] not in food_temp:
food_temp[i["name"]] = i["count"] food_temp[i['name']] = i['count']
else: 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: for i in food_temp:
ingredients += i + ":" + str(food_temp[i]) + "\n" ingredients += i + ':' + str(food_temp[i]) + '\n'
ingredients = ingredients[:-1] ingredients = ingredients[:-1]
im = food_im.format(data["name"], data["rarity"], data["foodtype"], data["foodfilter"], data["effect"], im = food_im.format(data['name'], data['rarity'], data['foodtype'], data['foodfilter'], data['effect'],
data["description"], ingredients) data['description'], ingredients)
return im return im
async def enemies_wiki(name): async def enemies_wiki(name):
raw_data = await get_misc_info("enemies", name) raw_data = await get_misc_info('enemies', name)
if "errcode" in raw_data: if 'errcode' in raw_data:
im = "该原魔不存在。" im = '该原魔不存在。'
else: else:
reward = "" reward = ''
for i in raw_data["rewardpreview"]: for i in raw_data['rewardpreview']:
reward += i["name"] + "" + str(i["count"]) if "count" in i.keys() else i["name"] + "" + "可能" reward += i['name'] + '' + str(i['count']) if 'count' in i.keys() else i['name'] + '' + '可能'
reward += "\n" reward += '\n'
im = "{}\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}".format(raw_data["name"], raw_data["specialname"], im = '{}\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}'.format(raw_data['name'], raw_data['specialname'],
raw_data["category"], raw_data["description"], reward) raw_data['category'], raw_data['description'], reward)
return im return im
@ -404,43 +404,43 @@ async def sign(uid):
sign_info['total_sign_day']) - 1]['name'] sign_info['total_sign_day']) - 1]['name']
getnum = sign_list['data']['awards'][int( getnum = sign_list['data']['awards'][int(
sign_info['total_sign_day']) - 1]['cnt'] sign_info['total_sign_day']) - 1]['cnt']
get_im = f"本次签到获得{getitem}x{getnum}" get_im = f'本次签到获得{getitem}x{getnum}'
if status == "OK" and sign_info['is_sign'] == True: if status == 'OK' and sign_info['is_sign'] == True:
mes_im = "签到成功" mes_im = '签到成功'
else: else:
mes_im = status mes_im = status
sign_missed = sign_info['sign_cnt_missed'] 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: except:
im = "签到失败请检查Cookies是否失效。" im = '签到失败请检查Cookies是否失效。'
return im return im
# 统计状态函数 # 统计状态函数
async def daily(mode="push", uid=None): async def daily(mode='push', uid=None):
def seconds2hours(seconds: int) -> str: def seconds2hours(seconds: int) -> str:
m, s = divmod(int(seconds), 60) m, s = divmod(int(seconds), 60)
h, m = divmod(m, 60) h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s) return '%02d:%02d:%02d' % (h, m, s)
temp_list = [] temp_list = []
conn = sqlite3.connect('ID_DATA.db') conn = sqlite3.connect('ID_DATA.db')
c = conn.cursor() c = conn.cursor()
c_data = None c_data = None
if mode == "push": if mode == 'push':
cursor = c.execute( cursor = c.execute(
"SELECT * FROM NewCookiesTable WHERE StatusA != ?", ("off",)) 'SELECT * FROM NewCookiesTable WHERE StatusA != ?', ('off',))
c_data = cursor.fetchall() c_data = cursor.fetchall()
elif mode == "ask": elif mode == 'ask':
c_data = ([uid, 0, 0, 0, 0, 0, 0],) c_data = ([uid, 0, 0, 0, 0, 0, 0],)
for row in c_data: for row in c_data:
raw_data = await get_daily_data(str(row[0])) raw_data = await get_daily_data(str(row[0]))
if raw_data["retcode"] != 0: if raw_data['retcode'] != 0:
temp_list.append( temp_list.append(
{"qid": row[2], "gid": row[3], "message": "你的推送状态有误可能是uid绑定错误或没有在米游社打开“实时便筏”功能。"}) {'qid': row[2], 'gid': row[3], 'message': '你的推送状态有误可能是uid绑定错误或没有在米游社打开“实时便筏”功能。'})
else: else:
dailydata = raw_data["data"] dailydata = raw_data['data']
current_resin = dailydata['current_resin'] current_resin = dailydata['current_resin']
current_expedition_num = dailydata['current_expedition_num'] current_expedition_num = dailydata['current_expedition_num']
@ -455,32 +455,32 @@ async def daily(mode="push", uid=None):
avatar_name: str = avatar avatar_name: str = avatar
if expedition['status'] == 'Finished': if expedition['status'] == 'Finished':
expedition_info.append(f"{avatar_name} 探索完成") expedition_info.append(f'{avatar_name} 探索完成')
finished_expedition_num += 1 finished_expedition_num += 1
else: else:
remained_timed: str = seconds2hours( remained_timed: str = seconds2hours(
expedition['remained_time']) expedition['remained_time'])
expedition_info.append( expedition_info.append(
f"{avatar_name} 剩余时间{remained_timed}") f'{avatar_name} 剩余时间{remained_timed}')
if dailydata['transformer']['recovery_time']['reached']: if dailydata['transformer']['recovery_time']['reached']:
transformer_status = "可用" transformer_status = '可用'
else: else:
transformer_time = dailydata['transformer']['recovery_time'] 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']) transformer_time['Minute'])
# 推送条件检查,在指令查询时 row[6] 为 0 ,而自动推送时 row[6] 为 140这样保证用指令查询时必回复 # 推送条件检查,在指令查询时 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 = '' tip = ''
tips = [] tips = []
if current_resin >= row[6] != 0: if current_resin >= row[6] != 0:
tips.append("你的树脂快满了!") tips.append('你的树脂快满了!')
if dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: if dailydata['max_home_coin'] - dailydata['current_home_coin'] <= 100:
tips.append("你的洞天宝钱快满了!") tips.append('你的洞天宝钱快满了!')
if finished_expedition_num == current_expedition_num: if finished_expedition_num == current_expedition_num:
tips.append("你的所有探索派遣完成了!") # emmmm tips.append('你的所有探索派遣完成了!') # emmmm
if tips: if tips:
tips.insert(0, '\n==============') tips.insert(0, '\n==============')
tip = '\n'.join(tips) tip = '\n'.join(tips)
@ -505,13 +505,13 @@ async def daily(mode="push", uid=None):
dailydata['remain_resin_discount_num'] dailydata['remain_resin_discount_num']
home_coin = f'{dailydata["current_home_coin"]}/{dailydata["max_home_coin"]}' home_coin = f'{dailydata["current_home_coin"]}/{dailydata["max_home_coin"]}'
if 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_rec_time = seconds2hours(int(dailydata['home_coin_recovery_time']))
coin_add_speed = math.ceil((dailydata["max_home_coin"] - dailydata["current_home_coin"]) / ( coin_add_speed = math.ceil((dailydata['max_home_coin'] - dailydata['current_home_coin']) / (
int(dailydata["home_coin_recovery_time"]) / 60 / 60)) int(dailydata['home_coin_recovery_time']) / 60 / 60))
home_coin += f'{coin_rec_time}{coin_add_speed}/h' 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, 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, is_extra_got, used_resin_discount_num,
resin_discount_num_limit, home_coin, transformer_status, resin_discount_num_limit, home_coin, transformer_status,
@ -519,12 +519,12 @@ async def daily(mode="push", uid=None):
max_expedition_num, expedition_data) max_expedition_num, expedition_data)
temp_list.append( temp_list.append(
{"qid": row[2], "gid": row[3], "message": send_mes}) {'qid': row[2], 'gid': row[3], 'message': send_mes})
return temp_list return temp_list
async def mihoyo_coin(qid, s_cookies=None): 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] uid = uid[0]
if s_cookies is None: if s_cookies is None:
s_cookies = await get_stoken(uid) s_cookies = await get_stoken(uid)
@ -533,12 +533,12 @@ async def mihoyo_coin(qid, s_cookies=None):
get_coin = coin.MihoyoBBSCoin(s_cookies) get_coin = coin.MihoyoBBSCoin(s_cookies)
im = await get_coin.task_run() im = await get_coin.task_run()
else: else:
im = "你还没有绑定Stoken~" im = '你还没有绑定Stoken~'
return im return im
async def get_event_pic(): 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: while True:
if os.path.exists(img_path): if os.path.exists(img_path):
f = open(img_path, 'rb') f = open(img_path, 'rb')
@ -553,68 +553,68 @@ async def get_event_pic():
async def weapon_wiki(name, level=None): async def weapon_wiki(name, level=None):
data = await get_weapon_info(name) data = await get_weapon_info(name)
if "errcode" in data: if 'errcode' in data:
im = "武器不存在。" im = '武器不存在。'
elif level: elif level:
data2 = await get_weapon_info(name, level) data2 = await get_weapon_info(name, level)
if data["substat"] != "": if data['substat'] != '':
sp = data["substat"] + "" + '%.1f%%' % (data2["specialized"] * 100) \ sp = data['substat'] + '' + '%.1f%%' % (data2['specialized'] * 100) \
if data["substat"] != "元素精通" else data["substat"] + "" + str(math.floor(data2["specialized"])) if data['substat'] != '元素精通' else data['substat'] + '' + str(math.floor(data2['specialized']))
else: else:
sp = "" sp = ''
im = (data["name"] + "\n等级:" + str(data2["level"]) + "(突破" + str(data2["ascension"]) + "" + im = (data['name'] + '\n等级:' + str(data2['level']) + '(突破' + str(data2['ascension']) + '' +
"\n攻击力:" + str(round(data2["attack"])) + "\n" + sp) '\n攻击力:' + str(round(data2['attack'])) + '\n' + sp)
else: else:
name = data['name'] name = data['name']
_type = data['weapontype'] _type = data['weapontype']
star = data['rarity'] + "" star = data['rarity'] + ''
info = data['description'] info = data['description']
atk = str(data['baseatk']) atk = str(data['baseatk'])
sub_name = data['substat'] sub_name = data['substat']
if data['subvalue'] != "": if data['subvalue'] != '':
sub_val = (data['subvalue'] + sub_val = (data['subvalue'] +
'%') if sub_name != '元素精通' else data['subvalue'] '%') if sub_name != '元素精通' else data['subvalue']
sub = "\n" + "" + sub_name + "" + sub_val sub = '\n' + '' + sub_name + '' + sub_val
else: else:
sub = "" sub = ''
if data['effectname'] != "": if data['effectname'] != '':
raw_effect = data['effect'] raw_effect = data['effect']
rw_ef = [] rw_ef = []
for i in range(len(data['r1'])): for i in range(len(data['r1'])):
now = '' now = ''
for j in range(1, 6): for j in range(1, 6):
now = now + data['r{}'.format(j)][i] + "/" now = now + data['r{}'.format(j)][i] + '/'
now = now[:-1] now = now[:-1]
rw_ef.append(now) rw_ef.append(now)
raw_effect = raw_effect.format(*rw_ef) raw_effect = raw_effect.format(*rw_ef)
effect = "\n" + "" + data['effectname'] + "" + "" + raw_effect effect = '\n' + '' + data['effectname'] + '' + '' + raw_effect
else: else:
effect = "" effect = ''
im = weapon_im.format(name, _type, star, info, atk, im = weapon_im.format(name, _type, star, info, atk,
sub, effect) sub, effect)
return im return im
async def char_wiki(name, mode="char", level=None): async def char_wiki(name, mode='char', level=None):
im = '' im = ''
data = await get_char_info(name, mode, level if mode == "char" else None) data = await get_char_info(name, mode, level if mode == 'char' else None)
if mode == "char": if mode == 'char':
if isinstance(data, list): if isinstance(data, list):
im = ','.join(data) im = ','.join(data)
elif "errcode" in data: elif 'errcode' in data:
im = "不存在该角色或类型。" im = '不存在该角色或类型。'
elif level: elif level:
data2 = await get_char_info(name, mode) data2 = await get_char_info(name, mode)
sp = data2["substat"] + "" + '%.1f%%' % (data["specialized"] * 100) if data2["substat"] != "元素精通" else \ sp = data2['substat'] + '' + '%.1f%%' % (data['specialized'] * 100) if data2['substat'] != '元素精通' else \
data2["substat"] + "" + str(math.floor(data["specialized"])) data2['substat'] + '' + str(math.floor(data['specialized']))
im = (data2["name"] + "\n等级:" + str(data["level"]) + "\n血量:" + str(math.floor(data["hp"])) + 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攻击力:' + str(math.floor(data['attack'])) + '\n防御力:' + str(math.floor(data['defense'])) +
"\n" + sp) '\n' + sp)
else: else:
name = data['title'] + '' + data['name'] name = data['title'] + '' + data['name']
star = data['rarity'] star = data['rarity']
_type = data["weapontype"] _type = data['weapontype']
element = data['element'] element = data['element']
up_val = data['substat'] up_val = data['substat']
bdday = data['birthday'] bdday = data['birthday']
@ -623,142 +623,142 @@ async def char_wiki(name, mode="char", level=None):
info = data['description'] info = data['description']
im = char_info_im.format( im = char_info_im.format(
name, star, _type, element, up_val, bdday, polar, cv, info) name, star, _type, element, up_val, bdday, polar, cv, info)
elif mode == "costs": elif mode == 'costs':
if isinstance(data[1], list): if isinstance(data[1], list):
im = ','.join(data[1]) im = ','.join(data[1])
elif "errcode" in data[1]: elif 'errcode' in data[1]:
im = "不存在该角色或类型。" im = '不存在该角色或类型。'
else: else:
im = "【天赋材料(一份)】\n{}\n【突破材料】\n{}" im = '【天赋材料(一份)】\n{}\n【突破材料】\n{}'
im1 = "" im1 = ''
im2 = "" im2 = ''
talent_temp = {} talent_temp = {}
talent_cost = data[1] talent_cost = data[1]
for i in talent_cost.values(): for i in talent_cost.values():
for j in i: for j in i:
if j["name"] not in talent_temp: if j['name'] not in talent_temp:
talent_temp[j["name"]] = j["count"] talent_temp[j['name']] = j['count']
else: 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: for k in talent_temp:
im1 = im1 + k + ":" + str(talent_temp[k]) + "\n" im1 = im1 + k + ':' + str(talent_temp[k]) + '\n'
temp = {} temp = {}
cost = data[0] cost = data[0]
for i in range(1, 7): for i in range(1, 7):
for j in cost["ascend{}".format(i)]: for j in cost['ascend{}'.format(i)]:
if j["name"] not in temp: if j['name'] not in temp:
temp[j["name"]] = j["count"] temp[j['name']] = j['count']
else: else:
temp[j["name"]] = temp[j["name"]] + j["count"] temp[j['name']] = temp[j['name']] + j['count']
for k in temp: for k in temp:
im2 = im2 + k + ":" + str(temp[k]) + "\n" im2 = im2 + k + ':' + str(temp[k]) + '\n'
im = im.format(im1, im2) im = im.format(im1, im2)
elif mode == "constellations": elif mode == 'constellations':
if "errcode" in data: if 'errcode' in data:
im = "不存在该角色或命座数量。" im = '不存在该角色或命座数量。'
else: else:
im = "" + data["c{}".format(level)]['name'] + "" + "" + \ im = '' + data['c{}'.format(level)]['name'] + '' + '' + \
"\n" + data["c{}".format(level)]['effect'].replace("*", "") '\n' + data['c{}'.format(level)]['effect'].replace('*', '')
elif mode == "talents": elif mode == 'talents':
if "errcode" in data: if 'errcode' in data:
im = "不存在该角色。" im = '不存在该角色。'
else: else:
if 7 >= int(level) > 0: if 7 >= int(level) > 0:
if int(level) <= 3: if int(level) <= 3:
if level == "1": if level == '1':
data = data["combat1"] data = data['combat1']
elif level == "2": elif level == '2':
data = data["combat2"] data = data['combat2']
elif level == "3": elif level == '3':
data = data["combat3"] data = data['combat3']
skill_name = data["name"] skill_name = data['name']
skill_info = data["info"] skill_info = data['info']
skill_detail = "" skill_detail = ''
""" """
for i in data["attributes"]["parameters"]: for i in data['attributes']['parameters']:
temp = "" temp = ''
for k in data["attributes"]["parameters"][i]: for k in data['attributes']['parameters'][i]:
if str(k).count('.') == 1: if str(k).count('.') == 1:
temp += "%.2f%%" % (k * 100) + "/" temp += '%.2f%%' % (k * 100) + '/'
else: else:
temp = k temp = k
break break
data["attributes"]["parameters"][i] = temp[:-1] data['attributes']['parameters'][i] = temp[:-1]
for i in data["attributes"]["labels"]: for i in data['attributes']['labels']:
#i = i.replace("{","{{") #i = i.replace('{','{{')
i = re.sub(r':[a-zA-Z0-9]+}', "}", i) i = re.sub(r':[a-zA-Z0-9]+}', '}', i)
#i.replace(r':[a-zA-Z0-9]+}','}') #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 = [] mes_list = []
parameters = [] parameters = []
add_switch = True add_switch = True
for i in data["attributes"]["parameters"]: for i in data['attributes']['parameters']:
for index, j in enumerate(data["attributes"]["parameters"][i]): for index, j in enumerate(data['attributes']['parameters'][i]):
if add_switch: if add_switch:
parameters.append({}) parameters.append({})
if str(j).count('.') == 1 and j <= 20: 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: elif str(j).count('.') == 1:
parameters[index].update({i: "%.2f" % (j * 100)}) parameters[index].update({i: '%.2f' % (j * 100)})
else: else:
parameters[index].update({i: j}) parameters[index].update({i: j})
add_switch = False add_switch = False
for k in data["attributes"]["labels"]: for k in data['attributes']['labels']:
k = re.sub(r':[a-zA-Z0-9]+}', "}", k) k = re.sub(r':[a-zA-Z0-9]+}', '}', k)
skill_detail += k + "\n" skill_detail += k + '\n'
skill_detail = skill_detail[:-1] skill_detail = skill_detail[:-1]
for i in range(1, 10): for i in range(1, 10):
if i % 2 != 0: if i % 2 != 0:
skill_info = skill_info.replace("**", "", 1) skill_info = skill_info.replace('**', '', 1)
else: else:
skill_info = skill_info.replace("**", "", 1) skill_info = skill_info.replace('**', '', 1)
mes_list.append({ mes_list.append({
"type": "node", 'type': 'node',
"data": { 'data': {
"name": "小仙", 'name' : '小仙',
"uin": "3399214199", 'uin' : '3399214199',
"content": "" + skill_name + "" + "\n" + skill_info 'content': '' + skill_name + '' + '\n' + skill_info
} }
}) })
for index, i in enumerate(parameters): for index, i in enumerate(parameters):
mes = skill_detail.format(**i) mes = skill_detail.format(**i)
node_data = { node_data = {
"type": "node", 'type': 'node',
"data": { 'data': {
"name": "小仙", 'name' : '小仙',
"uin": "3399214199", 'uin' : '3399214199',
"content": "lv." + str(index + 1) + "\n" + mes 'content': 'lv.' + str(index + 1) + '\n' + mes
} }
} }
mes_list.append(node_data) mes_list.append(node_data)
im = mes_list im = mes_list
else: else:
if level == "4": if level == '4':
data = data["passive1"] data = data['passive1']
elif level == "5": elif level == '5':
data = data["passive2"] data = data['passive2']
elif level == "6": elif level == '6':
data = data["passive3"] data = data['passive3']
elif level == "7": elif level == '7':
data = data["passive4"] data = data['passive4']
skill_name = data["name"] skill_name = data['name']
skill_info = data["info"] skill_info = data['info']
im = "{}\n{}".format(skill_name, skill_info) im = '{}\n{}'.format(skill_name, skill_info)
else: else:
im = "不存在该天赋。" im = '不存在该天赋。'
return im return im