From f06a3baff991b64cd41327c6497a255d7d8e5da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wuyi=E6=97=A0=E7=96=91?= <444835641@qq.com> Date: Thu, 6 Jan 2022 00:33:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E5=91=BD=E4=BB=A4;=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=B8=8A?= =?UTF-8?q?=E4=B8=8B=E5=AE=AB=E5=B8=A6=E6=9D=A5=E7=9A=84=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98;=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=EF=BC=9A=E5=BD=93=E5=89=8D=E7=8A=B6=E6=80=81=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=B4=9E=E5=A4=A9=E5=AE=9D=E9=92=B1=E6=95=B0?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++++++++++++++++++--------- __init__.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++--- getDB.py | 12 ++++++++++- getImg.py | 53 ++++++++++++++++++++++++--------------------- 4 files changed, 124 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 12ccb900..89ed5398 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,18 @@ $ pip3 install -r requirements.txt **(作者已经转用NoneBot2,Hoshino的更新可能未经测试,有bug及时提Issues!)** +#### 2022-01-06 + +新增:`原魔`指令,支持模糊查询,例如`原魔使徒` + +新增:`语音`指令,不支持模糊查询,发送`语音列表`可查看全部语音id,例子:`语音可莉357`,请确保运行环境有FFMpeg,否则无法正常发送语音。 + +优化:`开启<自动签到/推送>`命令可由超级管理员at关闭或开启,`开启<自动签到/推送>@xxxx` + +优化:`武器`指令已支持查询特定等级且可以模糊查询,例如`武器翼90`可查询90级天空之翼的属性 + +优化:`当前状态`支持查询当前洞天宝钱数量 + #### 2021-12-20 新增:8角色查询UI,全角色查询UI将会随背景图片改变而改变主题色。 @@ -244,22 +256,26 @@ $ pip3 install -r requirements.txt | 查询(上期)深渊 @人 | | 获取@的群友的深渊信息一览 | 查询深渊 @Wuyi | | | 查询(上期)深渊\d @人 | | 获取@的群友的深渊某一层数据 | 查询深渊10 @Wuyi | | | 当前状态 | | 获取树脂、每日委托、派遣等信息 | 当前状态 | **必须**绑定过CK和uid | -| 开启推送 | | 开启推送,超过140树脂提醒旅行者 | 开启推送 | 群聊/私聊都可
**必须**绑定过CK和uid | -| 关闭推送 | | 关闭树脂快满的提醒 | 关闭推送 | 都可以 | +| 开启推送 | @xxx(必须为超级管理员) | 开启推送,超过140树脂提醒旅行者 | 开启推送 | 群聊/私聊都可
**必须**绑定过CK和uid | +| 关闭推送 | @xxx(必须为超级管理员) | 关闭树脂快满的提醒 | 关闭推送 | 都可以 | | 校验全部Cookies | | 校验当前池内全部Cookies状态 | 校验全部Cookies | **群聊** | | 迁移Cookies | | 迁移旧版本(上上个版本)全部Cookies | 迁移Cookies | **群聊** | | 优化Cookies | | 优化上个版本全部Cookies | 优化Cookies | **群聊** | | 签到 | | 米游社签到 | 签到 | **必须**绑定过CK和uid | -| 开启自动签到 | | 开启每日米游社签到 | 开启自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | -| 关闭自动签到 | | 关闭每日米游社签到 | 关闭自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | +| 开启自动签到 | @xxx(必须为超级管理员) | 开启每日米游社签到 | 开启自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | +| 关闭自动签到 | @xxx(必须为超级管理员) | 关闭每日米游社签到 | 关闭自动签到 | 群聊/私聊都可
**必须**绑定过CK和uid | | 全部重签 | | 手动重新签到所有人 | 重新自动签到 | **群聊**
**必须**由超级管理员执行 | | 每月统计 | | 查询当前绑定账号的每月/每日的原石/莫拉 | | 仅限群聊,**必须**绑定Cookies和uid | -| 武器 | | 查询武器信息 | 武器天空之卷 | | -| 命座\d | | 查询角色命座信息 | 命座6可莉 | | -| 角色 | | 查询角色简略信息 | 角色可莉 | | -| 角色 | \d | 查询角色某个等级的属性 | 角色可莉64 | | -| 角色 | <某种类型> | 匹配一整类角色 | 角色燃愿玛瑙 | | -| 材料 | | 输出角色材料列表 | 材料可莉 | | +| 武器 | | 查询武器信息 | 武器天空之卷 | 支持模糊查询 | +| 武器 | \d | 查询武器某个等级的属性 | 武器卷90 | 支持模糊查询 | +| 命座\d | | 查询角色命座信息 | 命座6可莉 | 支持模糊查询 | +| 角色 | | 查询角色简略信息 | 角色可莉 | 支持模糊查询 | +| 角色 | \d | 查询角色某个等级的属性 | 角色可莉64 | 支持模糊查询 | +| 角色 | <某种类型> | 匹配一整类角色 | 角色燃愿玛瑙 | 支持模糊查询 | +| 材料 | | 输出角色材料列表 | 材料可莉 | 支持模糊查询 | +| 原魔 | | 原魔名字 | 原魔使徒 | 支持模糊查询 | +| 语音列表 | | 查看全部语音ID | 语音列表 | 不支持模糊查询 | +| 语音 | | 语音+名称+语音ID | 语音可莉357 | **必须**有FFMpeg环境 | | 查询词云 | | 查询绑定角色的词云 | 查询词云 | 必须绑定过UID/MYSID | ### 深渊查询: diff --git a/__init__.py b/__init__.py index 8a2a8002..0fee41e7 100644 --- a/__init__.py +++ b/__init__.py @@ -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, GetSignInfo, GetSignList, GetWeaponInfo, MysSign, OpenPush, connectDB, cookiesDB, deletecache, selectDB, get_alots, - GetEnemiesInfo) + GetEnemiesInfo,GetAudioInfo) from nonebot import * from hoshino import Service,R,priv,util from hoshino.typing import MessageSegment,CQEvent, HoshinoBot @@ -16,12 +16,15 @@ import hashlib import sqlite3 from io import BytesIO import urllib +import requests +from base64 import b64encode sv = Service('genshinuid') bot = get_bot() FILE_PATH = os.path.dirname(__file__) FILE2_PATH = os.path.join(FILE_PATH,'mys') +INDEX_PATH = os.path.join(FILE2_PATH, 'index') Texture_PATH = os.path.join(FILE2_PATH,'texture2d') avatar_json = { @@ -64,7 +67,8 @@ avatar_json = { "Shogun": "雷电将军", "Aloy": "埃洛伊", "Sara": "九条裟罗", - "Kokomi": "珊瑚宫心海" + "Kokomi": "珊瑚宫心海", + "Shenhe":"申鹤" } daily_im = ''' @@ -73,6 +77,7 @@ daily_im = ''' 原粹树脂:{}/{}{} 每日委托:{}/{} 奖励{}领取 周本减半:{}/{} +洞天宝钱:{} 探索派遣: 总数/完成/上限:{}/{}/{} {}''' @@ -113,6 +118,56 @@ char_info_im = '''{} 【cv】:{} 【介绍】:{}''' +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"] +} + +@sv.on_prefix('语音') +async def _(bot:HoshinoBot, ev: CQEvent): + message = ev.message.extract_plain_text() + message = message.replace(' ', "") + name = ''.join(re.findall('[\u4e00-\u9fa5]', message)) + + if name == "列表": + f=open(os.path.join(INDEX_PATH,"语音.png"),'rb') + ls_f = base64.b64encode(f.read()).decode() + imgmes = 'base64://' + ls_f + f.close() + im = f"[CQ:image,file={imgmes}]" + await bot.send(ev,im) + elif name == "": + return + else: + audioid = re.findall(r"[0-9]+", message)[0] + if audioid in audio_json: + audioid = random.choice(audio_json[audioid]) + url = await GetAudioInfo(name,audioid) + audio = BytesIO(requests.get(url).content) + audios = 'base64://' + b64encode(audio.getvalue()).decode() + im = f"[CQ:record,file={audios}]" + try: + await bot.send(ev,im) + except: + await bot.send(ev,"不存在该语音ID或者不存在该角色。") + @sv.on_fullmatch('活动列表') async def _(bot:HoshinoBot, ev: CQEvent): img_path = os.path.join(FILE2_PATH,"event.jpg") @@ -699,8 +754,9 @@ async def daily(mode="push", uid=None): f"{avatar_name} 剩余时间{remained_timed}") expedition_data = "\n".join(expedition_info) + coin = str(dailydata["current_home_coin"]) + "/" + str(dailydata["max_home_coin"]) 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, current_expedition_num, finished_expedition_num, max_expedition_num, expedition_data) + resin_discount_num_limit, coin,current_expedition_num, finished_expedition_num, max_expedition_num, expedition_data) temp_list.append( {"qid": row[2], "gid": row[3], "message": send_mes}) diff --git a/getDB.py b/getDB.py index 3c78444b..439b70fd 100644 --- a/getDB.py +++ b/getDB.py @@ -667,7 +667,17 @@ async def GetMysInfo(mysid,ck): except Exception as e: print("米游社信息读取老Api失败!") print(e.with_traceback) - + +async def GetAudioInfo(name,audioid,language = "cn"): + url = "https://genshin.minigg.cn/?characters=" + name + "&audioid=" + audioid + "&language=" + language + 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'}) + return req.text + async def GetWeaponInfo(name,level = None): async with AsyncClient() as client: req = await client.get( diff --git a/getImg.py b/getImg.py index c6c8f04f..38d996cf 100644 --- a/getImg.py +++ b/getImg.py @@ -978,50 +978,53 @@ async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None): text_draw.text((640, 183.9),raw_data['stats']['spiral_abyss'], new_color, ys_font(26)) #宝箱 - text_draw.text((258, 382.4),str(raw_data['stats']['magic_chest_number']), new_color, ys_font(24)) - text_draw.text((258, 442),str(raw_data['stats']['common_chest_number']),new_color, ys_font(24)) - text_draw.text((258, 501.6),str(raw_data['stats']['exquisite_chest_number']),new_color, ys_font(24)) - text_draw.text((258, 561.2),str(raw_data['stats']['precious_chest_number']), new_color, ys_font(24)) - text_draw.text((258, 620.8),str(raw_data['stats']['luxurious_chest_number']), new_color, ys_font(24)) + text_draw.text((258, 375.4),str(raw_data['stats']['magic_chest_number']), new_color, ys_font(24)) + text_draw.text((258, 425.4),str(raw_data['stats']['common_chest_number']),new_color, ys_font(24)) + text_draw.text((258, 475.4),str(raw_data['stats']['exquisite_chest_number']),new_color, ys_font(24)) + text_draw.text((258, 525.4),str(raw_data['stats']['precious_chest_number']), new_color, ys_font(24)) + text_draw.text((258, 575.4),str(raw_data['stats']['luxurious_chest_number']), new_color, ys_font(24)) #已获角色 - text_draw.text((258, 680.4),str(raw_data['stats']['avatar_number']),new_color, ys_font(24)) + text_draw.text((740, 547),str(raw_data['stats']['avatar_number']),new_color, ys_font(24)) #开启锚点和秘境数量 - text_draw.text((745, 474.5),str(raw_data['stats']['way_point_number']),new_color, ys_font(24)) - text_draw.text((745, 514),str(raw_data['stats']['domain_number']),new_color, ys_font(24)) + text_draw.text((258, 625.4),str(raw_data['stats']['way_point_number']),new_color, ys_font(24)) + text_draw.text((258, 675.4),str(raw_data['stats']['domain_number']),new_color, ys_font(24)) #蒙德 - text_draw.text((490, 370),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 400),'lv.' + str(raw_data['world_explorations'][3]['level']),new_color, ys_font(22)) + text_draw.text((490, 370),str(raw_data['world_explorations'][4]['exploration_percentage']/10) + '%',new_color, ys_font(22)) + text_draw.text((490, 400),'lv.' + str(raw_data['world_explorations'][4]['level']),new_color, ys_font(22)) text_draw.text((513, 430), str(raw_data['stats']['anemoculus_number']), new_color, ys_font(22)) #璃月 - text_draw.text((490, 490),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 520),'lv.' + str(raw_data['world_explorations'][2]['level']),new_color, ys_font(22)) + text_draw.text((490, 490),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%',new_color, ys_font(22)) + text_draw.text((490, 520),'lv.' + str(raw_data['world_explorations'][3]['level']),new_color, ys_font(22)) text_draw.text((513, 550), str(raw_data['stats']['geoculus_number']), new_color, ys_font(22)) #雪山 - text_draw.text((745, 379.5),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((745, 413.1),'lv.' + str(raw_data['world_explorations'][1]['level']),new_color, ys_font(22)) + text_draw.text((745, 373.5),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%',new_color, ys_font(22)) + text_draw.text((745, 407.1),'lv.' + str(raw_data['world_explorations'][2]['level']),new_color, ys_font(22)) #稻妻 - text_draw.text((490, 608),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 635),'lv.' + str(raw_data['world_explorations'][0]['level']),new_color, ys_font(22)) - text_draw.text((490, 662),'lv.' + str(raw_data['world_explorations'][0]['offerings'][0]['level']),new_color, ys_font(22)) + text_draw.text((490, 608),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%',new_color, ys_font(22)) + text_draw.text((490, 635),'lv.' + str(raw_data['world_explorations'][1]['level']),new_color, ys_font(22)) + text_draw.text((490, 662),'lv.' + str(raw_data['world_explorations'][1]['offerings'][0]['level']),new_color, ys_font(22)) text_draw.text((513, 689), str(raw_data['stats']['electroculus_number']), new_color, ys_font(22)) + #渊下宫 + text_draw.text((745, 480),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%',new_color, ys_font(22)) + #家园 if len(raw_data['homes']): - text_draw.text((693, 572.4),'lv.' + str(raw_data['homes'][0]['level']),new_color, ys_font(22)) - text_draw.text((693, 610.4),str(raw_data['homes'][0]['visit_num']),new_color, ys_font(22)) - text_draw.text((693, 648.4),str(raw_data['homes'][0]['item_num']),new_color, ys_font(22)) - text_draw.text((693, 686.4),str(raw_data['homes'][0]['comfort_num']),new_color, ys_font(22)) + text_draw.text((693, 582.4),'lv.' + str(raw_data['homes'][0]['level']),new_color, ys_font(22)) + text_draw.text((693, 620.4),str(raw_data['homes'][0]['visit_num']),new_color, ys_font(22)) + text_draw.text((693, 658.4),str(raw_data['homes'][0]['item_num']),new_color, ys_font(22)) + text_draw.text((693, 696.4),str(raw_data['homes'][0]['comfort_num']),new_color, ys_font(22)) else: - text_draw.text((693, 572.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 610.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 648.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 686.4),"未开",new_color, ys_font(22)) + text_draw.text((693, 582.4),"未开",new_color, ys_font(22)) + text_draw.text((693, 620.4),"未开",new_color, ys_font(22)) + text_draw.text((693, 658.4),"未开",new_color, ys_font(22)) + text_draw.text((693, 696.4),"未开",new_color, ys_font(22)) #确定texture2D路径 charpic_mask_path = os.path.join(TEXT_PATH,"charpic_mask.png")