新增:命座查询的模糊匹配;优化:代码结构

This commit is contained in:
Wuyi无疑 2021-12-30 22:26:08 +08:00
parent a95b27c181
commit 089e69799f
2 changed files with 132 additions and 151 deletions

View File

@ -2,7 +2,7 @@ from .getImg import draw_pic,draw_abyss_pic,draw_abyss0_pic,draw_wordcloud,draw_
from .getDB import (CheckDB, GetAward, GetCharInfo, GetDaily, GetMysInfo, from .getDB import (CheckDB, GetAward, GetCharInfo, GetDaily, GetMysInfo,
GetSignInfo, GetSignList, GetWeaponInfo, MysSign, OpenPush, GetSignInfo, GetSignList, GetWeaponInfo, MysSign, OpenPush,
connectDB, cookiesDB, deletecache, selectDB, get_alots, connectDB, cookiesDB, deletecache, selectDB, get_alots,
GetCharTalentsInfo,GetEnemiesInfo) GetEnemiesInfo)
from nonebot import * from nonebot import *
from hoshino import Service,R,priv,util from hoshino import Service,R,priv,util
from hoshino.typing import MessageSegment,CQEvent, HoshinoBot from hoshino.typing import MessageSegment,CQEvent, HoshinoBot
@ -139,7 +139,7 @@ async def _(bot:HoshinoBot, ev: CQEvent):
async def _(bot:HoshinoBot, ev: CQEvent): async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text() message = ev.message.extract_plain_text()
message = message.replace(' ', "") message = message.replace(' ', "")
im = await char_wiki(message,extra="cost") im = await char_wiki(message,"costs")
await bot.send(ev,im) await bot.send(ev,im)
@sv.on_prefix('原魔') @sv.on_prefix('原魔')
@ -154,7 +154,7 @@ async def _(bot:HoshinoBot, ev: CQEvent):
name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) 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: if len(num) == 1:
im = await talents_wiki(name,num[0]) im = await char_wiki(name,"talents",num[0])
else: else:
im = "参数不正确。" im = "参数不正确。"
await bot.send(ev,im) await bot.send(ev,im)
@ -177,7 +177,7 @@ async def _(bot:HoshinoBot, ev: CQEvent):
name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) 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: if len(level) == 1:
im = await char_wiki(name,extra="stats",num=level[0]) im = await char_wiki(name,"char",level=level[0])
else: else:
im = await char_wiki(name) im = await char_wiki(name)
await bot.send(ev,im) await bot.send(ev,im)
@ -192,60 +192,15 @@ async def enemies_wiki(name):
raw_data["category"],raw_data["description"],reward) raw_data["category"],raw_data["description"],reward)
return im return im
async def talents_wiki(name,num):
raw_data = await GetCharTalentsInfo(name)
if int(num) <= 3 :
if num == "1":
data = raw_data["combat1"]
elif num == "2":
data = raw_data["combat2"]
elif num == "3":
data = raw_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]:
temp += "%.2f%%" % (k * 100) + "/"
data["attributes"]["parameters"][i] = temp[:-1]
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 = skill_detail.format(**data["attributes"]["parameters"])
im = "{}\n{}\n————\n{}".format(skill_name,skill_info,skill_detail)
else:
if num == "4":
data = raw_data["passive1"]
elif num == "5":
data = raw_data["passive2"]
elif num == "6":
data = raw_data["passive3"]
elif num == "7":
data = raw_data["passive4"]
skill_name = data["name"]
skill_info = data["info"]
im = "{}\n{}".format(skill_name,skill_info)
return im
@sv.on_prefix('命座') @sv.on_prefix('命座')
async def _(bot:HoshinoBot, ev: CQEvent): async def _(bot:HoshinoBot, ev: CQEvent):
message = ev.message.extract_plain_text() message = ev.message.extract_plain_text()
num = int(re.findall(r"\d+", message)[0]) num = int(re.findall(r"\d+", message)[0]) # str
m = ''.join(re.findall('[\u4e00-\u9fa5]',message)) m = ''.join(re.findall('[\u4e00-\u9fa5]', message))
if num<= 0 or num >6: 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: else:
im = await char_wiki(m,2,num) im = await char_wiki(m, "constellations", num)
await bot.send(ev,im,at_sender=True) await bot.send(ev,im,at_sender=True)
#每日零点清空cookies使用缓存 #每日零点清空cookies使用缓存
@ -760,69 +715,103 @@ async def weapon_wiki(name,level = None):
sub, effect) sub, effect)
return im return im
async def char_wiki(name, mode=0, num="", extra=""): async def char_wiki(name, mode="char", level=None):
data = await GetCharInfo(name, mode) data = await GetCharInfo(name, mode, level if mode == "char" else None)
if mode == 0: if mode == "char":
if isinstance(data,str): if isinstance(data,str):
raw_data = data.replace("[","").replace("\n","").replace("]","").replace(" ","").replace("'","").split(',') raw_data = data.replace("[","").replace("\n","").replace("]","").replace(" ","").replace("'","").split(',')
if data.replace("\n","").replace(" ","") == "undefined": if data.replace("\n","").replace(" ","") == "undefined":
im = "不存在该角色或类型。" im = "不存在该角色或类型。"
else: else:
im = ','.join(raw_data) im = ','.join(raw_data)
elif level:
data2 = await GetCharInfo(name, mode)
sp = data2["substat"] + "" + '%.1f%%' % (data["specialized"] * 100) if data2["substat"] != "元素精通" else data2["substat"] + "" + str(math.floor(data2["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: else:
if extra == "cost": name = data['title'] + '' + data['name']
talent_data = await GetCharInfo(name, 1) star = data['rarity']
type = data["weapontype"]
element = data['element']
up_val = data['substat']
bdday = data['birthday']
polar = data['constellation']
cv = data['cv']['chinese']
info = data['description']
im = char_info_im.format(
name, star, type, element, up_val, bdday, polar, cv, info)
elif mode == "costs":
im = "【天赋材料(一份)】\n{}\n【突破材料】\n{}"
im1 = ""
im2 = ""
talent_temp = {}
talent_cost = data[1]["costs"]
for i in talent_cost.values():
for j in i:
if j["name"] not in talent_temp:
talent_temp[j["name"]] = j["count"]
else:
talent_temp[j["name"]] = talent_temp[j["name"]] + j["count"]
for k in talent_temp:
im1 = im1 + k + ":" + str(talent_temp[k]) + "\n"
im = "【天赋材料(一份)】\n{}\n【突破材料】\n{}" temp = {}
im1 = "" cost = data[0]
im2 = "" for i in range(1,7):
for j in cost["ascend{}".format(i)]:
talent_temp = {} if j["name"] not in temp:
talent_cost = talent_data["costs"] temp[j["name"]] = j["count"]
for i in talent_cost.values(): else:
for j in i: temp[j["name"]] = temp[j["name"]] + j["count"]
if j["name"] not in talent_temp:
talent_temp[j["name"]] = j["count"] for k in temp:
else: im2 = im2 + k + ":" + str(temp[k]) + "\n"
talent_temp[j["name"]] = talent_temp[j["name"]] + j["count"]
for k in talent_temp: im = im.format(im1,im2)
im1 = im1 + k + ":" + str(talent_temp[k]) + "\n" elif mode == "constellations":
im = "" + data["c{}".format(level)]['name'] + "" + "" + \
"\n" + data["c{}".format(level)]['effect'].replace("*", "")
elif mode == "talents":
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 = ""
temp = {} for i in data["attributes"]["parameters"]:
cost = data["costs"] temp = ""
for i in range(1,7): for k in data["attributes"]["parameters"][i]:
for j in cost["ascend{}".format(i)]: temp += "%.2f%%" % (k * 100) + "/"
if j["name"] not in temp: data["attributes"]["parameters"][i] = temp[:-1]
temp[j["name"]] = j["count"]
else:
temp[j["name"]] = temp[j["name"]] + j["count"]
for k in temp:
im2 = im2 + k + ":" + str(temp[k]) + "\n"
im = im.format(im1,im2)
elif extra == "stats": for i in data["attributes"]["labels"]:
data2 = await GetCharInfo(name, mode, num) #i = i.replace("{","{{")
sp = data["substat"] + "" + '%.1f%%' % (data2["specialized"] * 100) if data["substat"] != "元素精通" else data["substat"] + "" + str(math.floor(data2["specialized"])) i = re.sub(r':[a-zA-Z0-9]+}', "}", i)
im = (data["name"] + "\n等级:" + str(data2["level"]) + "\n血量:" + str(math.floor(data2["hp"])) + #i.replace(r':[a-zA-Z0-9]+}','}')
"\n攻击力:" + str(math.floor(data2["attack"])) + "\n防御力:" + str(math.floor(data2["defense"])) + skill_detail += i + "\n"
"\n" + sp)
else: skill_detail = skill_detail.format(**data["attributes"]["parameters"])
name = data['title'] + '' + data['name']
star = data['rarity'] im = "{}\n{}\n————\n{}".format(skill_name,skill_info,skill_detail)
type = data["weapontype"]
element = data['element'] else:
up_val = data['substat'] if level == "4":
bdday = data['birthday'] data = data["passive1"]
polar = data['constellation'] elif level == "5":
cv = data['cv']['chinese'] data = data["passive2"]
info = data['description'] elif level == "6":
im = char_info_im.format( data = data["passive3"]
name, star, type, element, up_val, bdday, polar, cv, info) elif level == "7":
elif mode == 1: data = data["passive4"]
im = '暂不支持' skill_name = data["name"]
elif mode == 2: skill_info = data["info"]
im = "" + data["c{}".format(num)]['name'] + "" + "" + \ im = "{}\n{}".format(skill_name,skill_info)
"\n" + data["c{}".format(num)]['effect'].replace("*", "")
return im return im

View File

@ -678,17 +678,6 @@ async def GetWeaponInfo(name,level = None):
data = jsonfy(req.text) data = jsonfy(req.text)
return data return data
async def GetCharTalentsInfo(name):
baseurl = "https://api.minigg.cn/talents?query="
async with AsyncClient() as client:
req = await client.get(
url = baseurl + name,
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'})
data = jsonfy(req.text)
return data
async def GetEnemiesInfo(name): async def GetEnemiesInfo(name):
baseurl = "https://api.minigg.cn/enemies?query=" baseurl = "https://api.minigg.cn/enemies?query="
async with AsyncClient() as client: async with AsyncClient() as client:
@ -700,47 +689,50 @@ async def GetEnemiesInfo(name):
data = jsonfy(req.text) data = jsonfy(req.text)
return data return data
async def GetCharInfo(name,mode = 0,level = None): async def GetCharInfo(name,mode = "char",level = None):
str = "" url2 = None
if mode == 1: data2 = None
str = "&talents=1" baseurl = "https://api.minigg.cn/characters?query="
elif mode == 2: if mode == "talents":
str = "&constellations=1" url = "https://api.minigg.cn/talents?query=" + name
elif mode == "constellations":
baseurl = "https://genshin.minigg.cn/?characters=" url = "https://api.minigg.cn/constellations?query=" + name
elif mode == "costs":
detailurl = "https://api.minigg.cn/characters?query=" url = baseurl + name + "&costs=1"
url2 = "https://api.minigg.cn/talents?query=" + name + "&costs=1"
if level: elif level:
async with AsyncClient() as client: url = baseurl + name + "&stats=" + level
req = await client.get(
url = detailurl + name + "&stats=" + level,
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'})
data = jsonfy(req.text)
else: else:
url = baseurl + name
if url2:
async with AsyncClient() as client: async with AsyncClient() as client:
req = await client.get( req = await client.get(
url = baseurl + name + str, url = url2,
headers={ 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', '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 = jsonfy(req.text)
soup = BeautifulSoup(req.text, "lxml") async with AsyncClient() as client:
item = soup.select_one("pre").text req = await client.get(
if item: url = url,
data = json.loads(item) headers={
else: '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',
async with AsyncClient() as client: 'Referer': 'https://genshin.minigg.cn/index.html'})
req = await client.get( data = jsonfy(req.text)
url = detailurl + name + "&matchCategories=true", if data != "undefined":
headers={ pass
'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', else:
'Referer': 'https://genshin.minigg.cn/index.html'}) async with AsyncClient() as client:
data = jsonfy(req.text) req = await client.get(
url = baseurl + name + "&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'})
data = req.text
return data return data if data2 == None else [data,data2]
async def GetGenshinEvent(mode = "List"): async def GetGenshinEvent(mode = "List"):
if mode == "Calendar": if mode == "Calendar":