diff --git a/.gitignore b/.gitignore index bcf3070..c5fd0c6 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,7 @@ XCW/miraiOK/ XCW/环境/ XCW/NEW/ XCW/实验室/ -XCW/hoshino/hoshino/config/ -xcw/hoshino/hoshino/modules/yobot/yobot/ + diff --git a/XCW/hoshino/hoshino/config/__bot__.py b/XCW/hoshino/hoshino/config/__bot__.py index 15d08b3..f8688fb 100644 --- a/XCW/hoshino/hoshino/config/__bot__.py +++ b/XCW/hoshino/hoshino/config/__bot__.py @@ -77,14 +77,12 @@ # 'twitter',#推特订阅,需要配置本目录下的twitter.py 'yobot',#yobot会战功能 'hourcallyao',#买药提醒 - #'shebot_old',#色图功能,需要apikey——mirai需要按说明适配,本版本shebot可以直接私聊,请勿和下方版本同时开启,下方有集成优化版 'reload',#重启,暂时不知是否能生效 'tarot',#塔罗牌 'flac',#搜无损音乐 #'shitu',#识图功能需要apikey 'shifan',#识别番剧 'battle_report',#会战报告生成,需要修改路径 - #'setu_acggov',#搜图,需要apikey,mirai需要按说明适配 'bot_manager_web',#新版webmanage #'voiceguess',#猜语音 #'eclanrank', @@ -122,8 +120,11 @@ 'pokemanpcr',#戳一戳卡片小游戏 'pages',#bot网页端 'clanbattle_rank',#会战排名查询插件 - #'clanbattle_info'#自动报刀插件,开启前请按说明配置,难度较高 + #'clanbattle_info',#自动报刀插件,开启前请按说明配置,难度较高 'nbnhhsh',#将抽象短语转化为好好说话 'nowtime',#发送"报时"有惊喜 'pcrsealkiller',#海豹杀手 + 'setu_mix',#俩涩图插件合二为一 + #'hoshino_training',#慎重启用,前往https://github.com/zyujs/hoshino_training查看说明 + 'Genshin',#原神系列 } diff --git a/XCW/hoshino/hoshino/modules/Genshin/README.md b/XCW/hoshino/hoshino/modules/Genshin/README.md new file mode 100644 index 0000000..0557410 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/README.md @@ -0,0 +1,113 @@ +# Genshin_Impact_bot + +### This is a Genshin Impact plugin for [HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot) +### 这是一个[HoshinoBot](https://github.com/Ice-Cirno/HoshinoBot)的原神相关插件 +### 这个项目目前正在扩展,加入更多原神相关娱乐和信息查询功能,敬请期待 + +### 如果你是在项目名称为Genshin_Impact_gacha时安装的,请删除Genshin_Impact_gacha重新Git clone + +# 安装方法 + +在 HoshinoBot\hoshino\modules 目录下使用以下命令拉取本项目 +``` +git clone https://github.com/H-K-Y/Genshin_Impact_bot.git +``` +然后在 HoshinoBot\\hoshino\\config\\\__bot__.py 文件的 MODULES_ON 加入 Genshin_Impact_bot + +config.py文件有插件的常用配置,你可以根据自己的情况修改 + +重启 HoshinoBot + +### (可选)放置找神瞳的gif动态图 +原神观测枢wiki上还有如何拿到神瞳的gif动态图,如果你想让机器人发送动态图可以在Releases下载 + +gif图包解压后放在icon路径下,安装完的路径应该是 +``` +HoshinoBot\hoshino\modules\Genshin_Impact_bot\seek_god_eye\icon\风神瞳\56.gif +``` + + + +# 效果演示 +### 原神抽卡 +![原神抽卡](https://github.com/H-K-Y/Genshin_Impact_bot/blob/main/screenshot/genshin_impact_gacha.png) +### 丘丘语翻译 +![丘丘语翻译](https://github.com/H-K-Y/Genshin_Impact_bot/blob/main/screenshot/qiu_qiu_translation.png) +### 找神瞳 +![找神瞳](https://github.com/H-K-Y/Genshin_Impact_bot/blob/main/screenshot/search_god_eye.png) +### 资源位置查询 +![资源位置查询](https://github.com/H-K-Y/Genshin_Impact_bot/blob/main/screenshot/query_resource_points.png) + + +# 指令 + +原神帮助 : 查看插件的帮助 + +### 原神抽卡 + +@bot相遇之缘:10连抽卡 + +@bot纠缠之缘:90连抽卡 + +@bot原之井:180连抽卡 + +原神卡池:查看当前UP池,这个指令也可以用来重载卡池配置文件,config.json保存的是当前卡池信息 + +原神卡池切换:切换其他原神卡池 + +### 丘丘语翻译 +丘丘一下 丘丘语句 :翻译丘丘语,注意这个翻译只能把丘丘语翻译成中文,不能反向 + +丘丘词典 丘丘语句 :查询丘丘语句的单词含义 + +### 找神瞳 +找风神瞳 <神瞳编号>:让机器人发送风神瞳的位置,神瞳编号为可选参数,不写编号机器人会随机一个编号,风可以换成岩来找岩神瞳 + +找到神瞳了 <神瞳编号>:让机器人记录这个神瞳编号,以后机器人不会给你发送这个编号 + +@bot删除找到神瞳 <神瞳编号>:在你已经找到的神瞳记录里删除这个编号 + +@bot重置风神瞳找到记录 : 删除所有风神瞳的找到记录,这个指令会有二次确认,风可以换成岩来重置岩神瞳的记录 + +@bot找到多少神瞳了 : 查看当前你找到多少神瞳了 + +### 资源位置查询 + +XXX哪里有:查询XXX的位置图,XXX是资源的名字 + +原神资源列表:查询所有的资源名称 + +# 更新记录 + +### 2020-10-31 +* 加入了查询资源位置的功能 + +### 2020-10-29 +* 加入了找神瞳的功能 + +### 2020-10-26 +* 加入了丘丘语翻译功能 + +### 2020-10-22 +* 修复了4星概率写错了导致4星只能保底抽出的问题............. +* 加入了更多抽卡的统计结果,比如抽出最多的武器是啥,第一个4星和5星事多少抽出的 + +### 2020-10-21 +* 在config.py加入了抽卡限制功能,限制每个人一天最多抽多少次,感谢[corvo007](https://github.com/corvo007)提出的粪pr (粪pr是他自己说的 +* 修复了第一次切换卡池后不能再切换卡池的问题 +* 修复了查看UP信息时报错的问题 + +### 2020-10-20 +* 重构了项目代码,~~第二天就重写?~~,~~过几天怕是忘了写的啥了........~~ +* 加入的武器UP池和常驻池 +* 加入了切换卡池的功能 + +### 2020-10-19 +* 加入10连抽,90连抽和180连抽 +* 加入抽卡发送图片功能 +* 修复了Windows系统发送图片时可能出现的路径问题,图片全部改为base64发送 + + + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/__init__.py b/XCW/hoshino/hoshino/modules/Genshin/__init__.py new file mode 100644 index 0000000..c71fe93 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/__init__.py @@ -0,0 +1,36 @@ +from hoshino import Service + + +sv = Service("原神帮助") + + +help_txt = '''这是一个HoshinoBot的原神相关插件,包含原神抽卡,丘丘语翻译,找神瞳,找资源点等功能 +插件仓库在 https://github.com/H-K-Y/Genshin_Impact_bot.git + +指令: + +@bot相遇之缘:10连抽卡 +@bot纠缠之缘:90连抽卡 +@bot原之井:180连抽卡 +原神卡池:查看当前UP池,这个指令也可以用来重载卡池配置文件,config.json保存的是当前卡池信息 +原神卡池切换:切换其他原神卡池 + +丘丘一下 丘丘语句 :翻译丘丘语,注意这个翻译只能把丘丘语翻译成中文,不能反向 +丘丘词典 丘丘语句 :查询丘丘语句的单词含义 + +找风神瞳 <神瞳编号>:让机器人发送风神瞳的位置,神瞳编号为可选参数,不写编号机器人会随机一个编号,风可以换成岩来找岩神瞳 +找到神瞳了 <神瞳编号>:让机器人记录这个神瞳编号,以后机器人不会给你发送这个编号 +@bot删除找到神瞳 <神瞳编号>:在你已经找到的神瞳记录里删除这个编号 +@bot重置风神瞳找到记录 : 删除所有风神瞳的找到记录,这个指令会有二次确认,风可以换成岩来重置岩神瞳的记录 +@bot找到多少神瞳了 : 查看当前你找到多少神瞳了 + +XXX哪里有:查询XXX的位置图,XXX是资源的名字 +原神资源列表:查询所有的资源名称 +''' + + +@sv.on_fullmatch("原神帮助") +async def help(bot, ev): + await bot.send(ev, help_txt) + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/config.py b/XCW/hoshino/hoshino/modules/Genshin/config.py new file mode 100644 index 0000000..6a2a763 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/config.py @@ -0,0 +1,34 @@ + +# 插件的配置文件 + + +# 原神抽卡 + +Gacha10Limit = 100 # 10连每天可以抽的次数 +Gacha90Limit = 100 # 90连每天可以抽的次数 +Gacha180Limit = 100 # 180连每天可以抽的次数 + + + + +# 神瞳信息查询 + +# 这个参数设置是否允许私聊获取神瞳信息,默认为False,表示不允许私聊,你可以改为True,来设置允许私聊 +# 注意,机器人短时间内大量私聊有可能会被腾讯风控 +# 这个效果还没实现,先不要管 +# ALLOW_PRIVATE_CHAT = False + + + + + + + + + + + + + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/gacha/__init__.py b/XCW/hoshino/hoshino/modules/Genshin/gacha/__init__.py new file mode 100644 index 0000000..a323f34 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/gacha/__init__.py @@ -0,0 +1,114 @@ +from hoshino import Service +from .gacha import gacha_info , FILE_PATH , Gacha , POOL +import os +import json +from hoshino.util import DailyNumberLimiter +from ..config import Gacha10Limit,Gacha90Limit,Gacha180Limit + + +daily_limiter_10 = DailyNumberLimiter(Gacha10Limit) +daily_limiter_90 = DailyNumberLimiter(Gacha90Limit) +daily_limiter_180 = DailyNumberLimiter(Gacha180Limit) + +sv = Service('原神抽卡') + +group_pool = { + # 这个字典保存每个群对应的卡池是哪个,群号字符串为key,卡池名为value,群号不包含在字典key里卡池按默认DEFAULT_POOL +} + +def save_group_pool(): + with open(os.path.join(FILE_PATH,'gid_pool.json'),'w',encoding='UTF-8') as f: + json.dump(group_pool,f,ensure_ascii=False) + + + +# 检查gid_pool.json是否存在,没有创建空的 +if not os.path.exists(os.path.join(FILE_PATH,'gid_pool.json')): + save_group_pool() + + + +# 读取gid_pool.json的信息 +with open(os.path.join(FILE_PATH,'gid_pool.json'),'r',encoding='UTF-8') as f: + group_pool = json.load(f) + + + + +@sv.on_prefix(["相遇之缘"], only_to_me=True) +async def gacha_(bot, ev): + gid = str(ev.group_id) + userid = ev['user_id'] + if not daily_limiter_10.check(userid): + await bot.send(ev, '今天已经抽了很多次啦,明天再来吧~') + return + if gid in group_pool: + G = Gacha(group_pool[gid]) + else: + G = Gacha() + daily_limiter_10.increase(userid) + await bot.send(ev, G.gacha_10() , at_sender=True) + +@sv.on_prefix(["纠缠之缘"], only_to_me=True) +async def gacha_(bot, ev): + gid = str(ev.group_id) + userid = ev['user_id'] + if not daily_limiter_90.check(userid): + await bot.send(ev, '今天已经抽了很多次啦,明天再来吧~') + return + if gid in group_pool: + G = Gacha(group_pool[gid]) + else: + G = Gacha() + daily_limiter_90.increase(userid) + await bot.send(ev, G.gacha_90(90) , at_sender=True) + + + +@sv.on_prefix(["原之井"], only_to_me=True) +async def gacha_(bot, ev): + gid = str(ev.group_id) + userid = ev['user_id'] + if not daily_limiter_180.check(userid): + await bot.send(ev, '今天已经抽了很多次啦,明天再来吧~') + return + daily_limiter_180.increase(userid) + if gid in group_pool: + G = Gacha(group_pool[gid]) + else: + G = Gacha() + await bot.send(ev, G.gacha_90(180) , at_sender=True) + + + +@sv.on_prefix(["原神卡池","原神up","原神UP"]) +async def gacha_(bot, ev): + gid = str(ev.group_id) + + if gid in group_pool: + info = gacha_info(group_pool[gid]) + else: + info = gacha_info() + + await bot.send(ev, info , at_sender=True) + +@sv.on_prefix(('原神卡池切换','原神切换卡池')) +async def set_pool(bot, ev): + + pool_name = ev.message.extract_plain_text().strip() + gid = str(ev.group_id) + + if pool_name in POOL.keys(): + if gid in group_pool: + group_pool[gid] = pool_name + else: + group_pool.setdefault(gid,pool_name) + save_group_pool() + await bot.send(ev, f"卡池已切换为 {pool_name} ") + return + + txt = "请使用以下命令来切换卡池\n" + for i in POOL.keys(): + txt += f"原神卡池切换 {i} \n" + + await bot.send(ev, txt) diff --git a/XCW/hoshino/hoshino/modules/Genshin/gacha/config.json b/XCW/hoshino/hoshino/modules/Genshin/gacha/config.json new file mode 100644 index 0000000..64dbad1 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/gacha/config.json @@ -0,0 +1,13 @@ +{ + "注释": "4星和5星常驻角色武器是不包括UP的,需要4星或5星所有物品角色随机时程序会自己拼接列表去除重复", + "5星up角色": ["可莉"], + "4星up角色": ["行秋","诺艾尔", "砂糖"], + "5星up武器": ["四风原典","狼的末路"], + "4星up武器": ["祭礼弓","祭礼残章","匣里灭辰","祭礼大剑","祭礼剑"], + "5星常驻角色": ["刻晴","莫娜","七七","迪卢克","琴"], + "4星常驻角色": ["菲谢尔","香菱", "芭芭拉","重云","班尼特","凝光","北斗","雷泽"], + "4星白给角色": ["安柏","凯亚","丽莎"], + "5星非up武器": ["阿莫斯之弓","天空之翼","天空之卷","和璞鸢","天空之脊","天空之傲","天空之刃","风鹰剑"], + "4星非up武器": ["弓藏","绝弦","西风猎弓","昭心","流浪乐章","西风秘典","西风长枪", "雨裁","钟剑","西风大剑","匣里龙吟","笛剑","西风剑"], + "3星武器": ["弹弓","神射手之誓","鸦羽弓","翡玉法球","讨龙英杰谭","魔导绪论","黑缨枪","以理服人", "沐浴龙血的剑","铁影阔剑","飞天御剑","黎明神剑","冷刃"] +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/Genshin/gacha/gacha.py b/XCW/hoshino/hoshino/modules/Genshin/gacha/gacha.py new file mode 100644 index 0000000..e5cd70a --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/gacha/gacha.py @@ -0,0 +1,502 @@ +from PIL import Image +from io import BytesIO + + +import os +import json +import random +import math +import base64 + +FILE_PATH = os.path.dirname(__file__) +ICON_PATH = os.path.join(FILE_PATH,'icon') + + + +DEFAULT_POOL = "角色up池" # 默认卡池 + +POOL_PROBABILITY = { + # 所有卡池的4星和5星概率,这里直接填写官方给出的概率,程序会自动对4星概率进行累计 + "角色up池":{"5" : 0.006 , "4" : 0.051 }, + "武器up池":{"5" : 0.007 , "4" : 0.060 }, + "常驻池" : {"5" : 0.006 , "4" : 0.051 } +} + +UP_PROBABILITY = { + # 这里保存的是当UP池第一次抽取到或上次已经抽取过UP时,本次出现UP的概率有多大,常驻池不受影响 + "角色up池":0.5, + "武器up池":0.75 +} + + +ROLE_ARMS_LIST = { + # 所有卡池数据 + + "5星up角色": [], + "4星up角色": [], + "5星up武器": [], + "4星up武器": [], + "5星常驻角色": [], + "4星常驻角色": [], + "4星白给角色": [], + "5星非up武器": [], + "4星非up武器": [], + "3星武器": [], + + "空":[], #这个列表是留空占位的,不会有任何数据 + + '5星全角色武器':[], + + '5星常驻池':[], + '4星常驻池':[], + + '5星角色up池全角色':[], + '4星角色up池全物品':[], + + '5星武器up池全武器':[], + '4星武器up池全物品':[] +} + + +CORRESPONDENCE = { + # 这里记录的是ROLE_ARMS_LIST最后7个列表与其他列表的包含关系 + '5星全角色武器':["5星常驻角色","5星up角色","5星非up武器","5星up武器"], + + '5星常驻池':["5星常驻角色","5星非up武器","5星up武器"], + '4星常驻池':["4星常驻角色","4星白给角色","4星up角色","4星up武器","4星非up武器"], + + '5星角色up池全角色':["5星up角色","5星常驻角色"], + '4星角色up池全物品':["4星up角色","4星常驻角色","4星非up武器","4星up武器"], + + '5星武器up池全武器':["5星up武器","5星非up武器"], + '4星武器up池全物品':["4星up武器","4星非up武器","4星常驻角色","4星up角色"] +} + + +POOL = { + # 这个字典记录的是3个不同的卡池,每个卡池的抽取列表的value是ROLE_ARMS_LIST的哪个列表的key + # 比如角色UP池的5星UP列表,是保存在ROLE_ARMS_LIST["5星up角色"]这个列表里的 + '角色up池':{ + '5星up':"5星up角色", + '随机全5星':'5星角色up池全角色', + '4星up':"4星up角色", + '随机全4星':'4星角色up池全物品' + }, + + '武器up池':{ + '5星up':"5星up武器", + '随机全5星':'5星武器up池全武器', + '4星up':"4星up武器", + '随机全4星':'4星武器up池全物品' + }, + + '常驻池':{ + '5星物品':'5星常驻池', + '4星物品':'4星常驻池', + '5星up':'空', + '4星up':'空' + } +} + + + + + + + +def init_role_arms_list(): + # 初始化卡池数据 + with open(os.path.join(FILE_PATH,'config.json'),'r', encoding='UTF-8') as f: + data = json.load(f) + for key in data.keys(): + ROLE_ARMS_LIST[key] = data[key] + + for key in CORRESPONDENCE.keys(): + for i in CORRESPONDENCE[key]: + ROLE_ARMS_LIST[key].extend(ROLE_ARMS_LIST[i]) # 对后7个列表填充数据 + ROLE_ARMS_LIST[key] = list(set(ROLE_ARMS_LIST[key])) # 去除重复数据 + +init_role_arms_list() + + + + + + + + +class Gacha(object): + + def __init__(self,_pool = DEFAULT_POOL): + # 实例化的时候就要传进来字符串表明要抽哪个卡池 + self.pool = _pool + + self.last_time_5 = "" # 记录上一次抽卡的5星是什么 + self.last_time_4 = "" # 记录上一次抽卡的4星是什么 + + # 保底计数,注意这个计数是从0开始的,每一次抽卡(包括第一次)之前都得+1 + self.distance_5_star = 0 + self.distance_4_star = 0 + + # 需要生成图片的抽卡结果列表 + self.gacha_list = [] + + # 记录多少抽第一次出现UP + self.last_4_up = 0 + self.last_5_up = 0 + + # 记录多少抽第一次出现4星或5星 + self.last_4 = 0 + self.last_5 = 0 + + self.gacha_rarity_statistics = { + # 这个列表记录的是本轮抽卡,每种稀有度各抽到了多少 + '3星': 0, + '4星': 0, + '5星': 0 + } + + # 当前是多少抽 + self.current_times = 0 + + # 记录抽卡每个角色或装备各抽到多少 + self.gacha_all_statistics = {} + + + @staticmethod + def get_png_path(name): + # 获取png文件路径,传入的参数是角色或武器名字,会自动在角色和武器文件夹搜索,找不到抛出异常 + + role_name_path = os.path.join(ICON_PATH, "角色", str(name) + ".png") + arms_name_path = os.path.join(ICON_PATH, "武器", str(name) + ".png") + if os.path.exists(role_name_path): + return role_name_path + + if os.path.exists(arms_name_path): + return arms_name_path + + raise FileNotFoundError(f"找不到 {name} 的图标,请检查图标是否存在") + + def is_up(self,name): + # 检查角色是否在UP里 + # 如果name是一个空字符串表示是第一次抽到4星或5星 + if name == "": + return True + if self.pool == "常驻池": + return False + + _5_star_up_list = POOL[self.pool]["5星up"] + _4_star_up_list = POOL[self.pool]["4星up"] + + if (name in ROLE_ARMS_LIST[_4_star_up_list]) or (name in ROLE_ARMS_LIST[_5_star_up_list]): + return True + + return False + + + @staticmethod + def is_star(name): + # 检查角色或物品是几星的 + # 返回对应的星星数 + if name in ROLE_ARMS_LIST['5星全角色武器']: + return "★★★★★" + if name in ROLE_ARMS_LIST['4星常驻池']: # 4星常驻池就包含所有4星角色装备了 + return "★★★★" + return "★★★" + + @staticmethod + def pic2b64(im): + # im是Image对象,把Image图片转成base64 + bio = BytesIO() + im.save(bio, format='PNG') + base64_str = base64.b64encode(bio.getvalue()).decode() + return 'base64://' + base64_str + + @staticmethod + def ba64_to_cq(base64_str): + return f"[CQ:image,file={base64_str}]" + + def concat_pic(self, border=5): + # self.gacha_list是一个列表,这个函数找到列表中名字对应的图片,然后拼接成一张大图返回 + num = len(self.gacha_list) + # w, h = pics[0].size + w, h = [125, 130] + des = Image.new('RGBA', (w * min(num, border), h * math.ceil(num / border)), (255, 255, 255, 0)) + + for i in range(num): + im = Image.open(self.get_png_path(self.gacha_list[i])) + + pixel_w_offset = (125 - im.size[0]) / 2 + pixel_h_offset = (130 - im.size[1]) / 2 # 因为角色和武器大小不一样,小的图像设置居中显示 + + w_row = (i % border) + 1 + h_row = math.ceil((i + 1) / border) + + pixel_w = (w_row - 1) * w + pixel_w_offset + pixel_h = (h_row - 1) * h + pixel_h_offset + + des.paste(im, (int(pixel_w), int(pixel_h))) + + return des + + def add_gacha_all_statistics(self,name): + # 把每一次抽卡结果添加到gacha_all_statistics + if name in self.gacha_all_statistics.keys(): + self.gacha_all_statistics[name] += 1 + else: + self.gacha_all_statistics[name] = 1 + + def update_last(self,name): + # 这个方法用来更新第一次抽到4星或5星或UP的计数 + if not self.last_4_up: + up_4_star = POOL[self.pool]['4星up'] + if name in ROLE_ARMS_LIST[up_4_star]: + self.last_4_up = self.current_times + 1 + + if not self.last_5_up: + up_5_star = POOL[self.pool]['5星up'] + if name in ROLE_ARMS_LIST[up_5_star]: + self.last_5_up = self.current_times + 1 + + if not self.last_4: + if name in ROLE_ARMS_LIST["4星常驻池"]: + self.last_4 = self.current_times + 1 + + if not self.last_5: + if name in ROLE_ARMS_LIST["5星全角色武器"]: + self.last_5 = self.current_times + 1 + + def is_guaranteed(self,frequency): + # 检查本轮抽卡是不是全保底 + if frequency == 90 : + if self.gacha_rarity_statistics['5星'] == 1 and self.gacha_rarity_statistics['4星'] == 8: + return True + if frequency == 180 : + if self.gacha_rarity_statistics['5星'] == 2 and self.gacha_rarity_statistics['4星'] == 16: + return True + return False + + def get_most_arms(self): + # 返回抽出的武器抽出最多的是哪个,抽出了多少次 + if not self.gacha_all_statistics: + raise KeyError(f"字典 self.gacha_all_statistics 是空的") + most_value = max(self.gacha_all_statistics.values()) + for key,value in self.gacha_all_statistics.items(): + if most_value == value : + return {"name":key,"most":value} + + + def get_5_star(self): + # 先检查上次5星是否是UP,不是UP本次抽取必定是UP, + # 如果上次是UP,角色UP池本次有50%的概率还是UP,50%概率所有5星随机, + # 武器UP池本次有75%的概率还是UP,25%概率所有5星随机,详情看UP_PROBABILITY + + # 先看是不是常驻池 + if self.pool == '常驻池': + key = POOL['常驻池']['5星物品'] # 先获取常驻池的5星保存在ROLE_ARMS_LIST的哪个列表 + return random.choice(ROLE_ARMS_LIST[key]) + + # 下边是角色或武器的UP + # 先获取5星UP和全5星角色武器保存在ROLE_ARMS_LIST的哪个列表 + # up_5_star和all_5_star是ROLE_ARMS_LIST的key + # UP武器和UP角色对应的列表是不一样的,详情看POOL + up_5_star = POOL[self.pool]['5星up'] + all_5_star = POOL[self.pool]['随机全5星'] + if self.is_up(self.last_time_5): + + if random.random() < UP_PROBABILITY[self.pool]: + return random.choice(ROLE_ARMS_LIST[up_5_star]) + else: + return random.choice(ROLE_ARMS_LIST[all_5_star]) + else: + return random.choice(ROLE_ARMS_LIST[up_5_star]) + + + + def get_4_star(self): + # 先检查上次4星是否是UP,不是UP本次抽取必定是UP, + # 如果上次是UP,角色UP池本次有50%的概率还是UP,50%概率所有4星随机, + # 武器UP池本次有75%的概率还是UP,25%概率所有4星随机,详情看UP_PROBABILITY + + # 先看是不是常驻池 + if self.pool == '常驻池': + key = POOL['常驻池']['4星物品'] # 先获取常驻池的4星保存在ROLE_ARMS_LIST的哪个列表 + return random.choice(ROLE_ARMS_LIST[key]) + + # 下边是角色或武器的UP + # 先获取4星UP和全4星角色武器保存在ROLE_ARMS_LIST的哪个列表 + # up_4_star和all_4_star是ROLE_ARMS_LIST的key + # UP武器和UP角色对应的列表是不一样的,详情看POOL + up_4_star = POOL[self.pool]['4星up'] + all_4_star = POOL[self.pool]['随机全4星'] + if self.is_up(self.last_time_4): + if random.random() < UP_PROBABILITY[self.pool]: + return random.choice(ROLE_ARMS_LIST[up_4_star]) + else: + return random.choice(ROLE_ARMS_LIST[all_4_star]) + else: + return random.choice(ROLE_ARMS_LIST[up_4_star]) + + + + def gacha_one(self): + # self.last_time_4表示上一个4星角色 + # self.last_time_5表示上一个5星角色 + # self.distance_4_star是4星保底计数 + # self.distance_5_star是5星保底计数 + self.distance_4_star += 1 + self.distance_5_star += 1 + + r = random.random() + + # 先检查是不是保底5星 + if self.distance_5_star % 90 == 0: + self.gacha_rarity_statistics["5星"] += 1 + self.distance_5_star = 0 # 重置保底计数 + self.last_time_5 = self.get_5_star() # 抽一次卡,把结果赋值留给下一次抽卡判断 + return self.last_time_5 # 返回刚抽出的卡 + + # 检查是不是概率5星 + if r < POOL_PROBABILITY[self.pool]["5"]: + self.gacha_rarity_statistics["5星"] += 1 + self.distance_5_star = 0 + self.last_time_5 = self.get_5_star() # 抽一次卡,把结果赋值留给下一次抽卡判断 + return self.last_time_5 # 返回刚抽出的卡 + + # 检查是不是保底4星 + if self.distance_4_star % 10 == 0: + self.gacha_rarity_statistics["4星"] += 1 + self.distance_4_star = 0 + self.last_time_4 = self.get_4_star() + return self.last_time_4 + + # 检查是不是概率4星 + # 由于是先判断5星的概率出货,所以4星的实际概率是4星原概率加上5星的概率 + if r < (POOL_PROBABILITY[self.pool]["5"] + POOL_PROBABILITY[self.pool]["4"]): + self.gacha_rarity_statistics["4星"] += 1 + self.distance_4_star = 0 + self.last_time_4 = self.get_4_star() + return self.last_time_4 + + # 以上都不是返回3星 + self.gacha_rarity_statistics["3星"] += 1 + return random.choice(ROLE_ARMS_LIST["3星武器"]) + + + + + def gacha_10(self): + # 抽10连 + + gacha_txt = "" + + for self.current_times in range(10): + + new_gacha = self.gacha_one() + self.gacha_list.append(new_gacha) + gacha_txt += new_gacha + gacha_txt += self.is_star(new_gacha) + + if (self.current_times + 1) % 5 == 0: + gacha_txt += '\n' + + self.add_gacha_all_statistics(new_gacha) # 把所有抽卡结果添加到gacha_all_statistics用于最后统计 + + self.update_last(new_gacha) # 更新第一次抽到的计数 + + mes = '本次祈愿得到以下角色装备:\n' + res = self.concat_pic() + res = self.pic2b64(res) + mes += self.ba64_to_cq(res) + mes += '\n' + mes += gacha_txt + + if self.last_4: # 如果self.last_4为0表示没有抽到,这句话就不写了,下边3个判断标准一样 + mes += f'第 {self.last_4} 抽首次出现4★!\n' + if self.last_4_up: + mes += f'第 {self.last_4_up} 抽首次出现4★UP!\n' + if self.last_5: + mes += f'第 {self.last_5} 抽首次出现5★!\n' + if self.last_5_up: + mes += f'第 {self.last_5_up} 抽首次出现5★UP!\n' + + mes += f"\n* 本次抽取卡池为 {self.pool} \n* 发送 原神卡池切换 可切换卡池" + + return mes + + def gacha_90(self,frequency=90): + # 抽一井 + gacha_txt = "" + + for self.current_times in range(frequency): + + new_gacha = self.gacha_one() + + if not (new_gacha in ROLE_ARMS_LIST["3星武器"]): # 抽一井时图片上不保留3星的武器 + self.gacha_list.append(new_gacha) + + self.add_gacha_all_statistics(new_gacha) # 把所有抽卡结果添加到gacha_all_statistics用于最后统计 + + self.update_last(new_gacha) # 更新第一次抽到的计数 + + gacha_txt += f"★★★★★×{self.gacha_rarity_statistics['5星']} ★★★★×{self.gacha_rarity_statistics['4星']} ★★★×{self.gacha_rarity_statistics['3星']}\n" + + mes = '本次祈愿得到以下角色装备:\n' + res = self.concat_pic() + res = self.pic2b64(res) + mes += self.ba64_to_cq(res) + mes += '\n' + mes += gacha_txt + + if self.last_4: # 如果self.last_4为0表示没有抽到,这句话就不写了 + mes += f'第 {self.last_4} 抽首次出现4★!\n' + if self.last_4_up: + mes += f'第 {self.last_4_up} 抽首次出现4★UP!\n' + if self.last_5: + mes += f'第 {self.last_5} 抽首次出现5★!\n' + if self.last_5_up: + mes += f'第 {self.last_5_up} 抽首次出现5★UP!\n' + + most_arms = self.get_most_arms() + mes += f"本次抽取最多的装备是 {most_arms['name']} {self.is_star(most_arms['name'])} ,共抽取到 {most_arms['most']} 次\n" + + + if self.is_guaranteed(frequency): + mes += "居然全是保底,你脸也太黑了\n" + + mes += f"\n* 本次抽取卡池为 {self.pool} \n* 发送 原神卡池切换 可切换卡池" + return mes + + + +def gacha_info(pool = DEFAULT_POOL): + # 重载卡池数据,然后返回UP角色信息 + init_role_arms_list() # 重新载入config.json的卡池数据 + info_txt = f'当前卡池为 {pool} ,UP信息如下:\n' + + _5_star_up_info = POOL[pool]["5星up"] + _4_star_up_info = POOL[pool]["4星up"] + up_info = "" + + for _5_star in ROLE_ARMS_LIST[_5_star_up_info]: + im = Image.open(Gacha.get_png_path(_5_star)) + im = Gacha.pic2b64(im) + up_info += Gacha.ba64_to_cq(im) + up_info += "\n" + up_info += f"{_5_star} ★★★★★" + + for _4_star in ROLE_ARMS_LIST[_4_star_up_info]: + im = Image.open(Gacha.get_png_path(_4_star)) + im = Gacha.pic2b64(im) + up_info += Gacha.ba64_to_cq(im) + up_info += "\n" + up_info += f"{_4_star} ★★★★" + + if up_info == "": + # 如果up_info是空的,表示当前是常驻池没有UP + up_info += "常驻池没有UP" + + info_txt += up_info + return info_txt + + diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" new file mode 100644 index 0000000..4c09f9f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\270\207\345\233\275\350\257\270\346\265\267\345\233\276\350\260\261.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\273\245\347\220\206\346\234\215\344\272\272.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\273\245\347\220\206\346\234\215\344\272\272.png" new file mode 100644 index 0000000..9904233 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\273\245\347\220\206\346\234\215\344\272\272.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\275\243\345\205\265\351\207\215\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\275\243\345\205\265\351\207\215\345\211\221.png" new file mode 100644 index 0000000..a48425b Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\275\243\345\205\265\351\207\215\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\277\241\344\275\277.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\277\241\344\275\277.png" new file mode 100644 index 0000000..a07c1e3 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\344\277\241\344\275\277.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\263\346\226\227\344\271\213\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\263\346\226\227\344\271\213\346\236\252.png" new file mode 100644 index 0000000..006a9d6 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\263\346\226\227\344\271\213\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\267\345\210\203.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\267\345\210\203.png" new file mode 100644 index 0000000..d853551 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\206\267\345\210\203.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\346\227\245\346\234\210.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\346\227\245\346\234\210.png" new file mode 100644 index 0000000..4f657b5 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\346\227\245\346\234\210.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\347\201\255\350\276\260.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\347\201\255\350\276\260.png" new file mode 100644 index 0000000..391832f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\347\201\255\350\276\260.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\351\276\231\345\220\237.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\351\276\231\345\220\237.png" new file mode 100644 index 0000000..b3e79fc Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\214\243\351\207\214\351\276\231\345\220\237.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\345\217\244\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\345\217\244\345\211\221.png" new file mode 100644 index 0000000..76835bf Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\345\217\244\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\351\225\277\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\351\225\277\346\236\252.png" new file mode 100644 index 0000000..3e6a8d0 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\215\203\345\262\251\351\225\277\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" new file mode 100644 index 0000000..3516563 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\216\206\347\273\203\347\232\204\347\214\216\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\215\346\233\262\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\215\346\233\262\345\274\223.png" new file mode 100644 index 0000000..fc84722 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\215\346\233\262\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" new file mode 100644 index 0000000..7eab90a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\217\243\350\242\213\351\255\224\345\257\274\344\271\246.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\220\203\350\231\216\351\261\274\345\210\200.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\220\203\350\231\216\351\261\274\345\210\200.png" new file mode 100644 index 0000000..6be6693 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\220\203\350\231\216\351\261\274\345\210\200.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\222\214\347\222\236\351\270\242.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\222\214\347\222\236\351\270\242.png" new file mode 100644 index 0000000..988a8d8 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\222\214\347\222\236\351\270\242.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\233\233\351\243\216\345\216\237\345\205\270.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\233\233\351\243\216\345\216\237\345\205\270.png" new file mode 100644 index 0000000..d2b903e Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\233\233\351\243\216\345\216\237\345\205\270.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\202\262.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\202\262.png" new file mode 100644 index 0000000..8b05059 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\202\262.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\210\203.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\210\203.png" new file mode 100644 index 0000000..e70a50b Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\210\203.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\215\267.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\215\267.png" new file mode 100644 index 0000000..830faff Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\345\215\267.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\347\277\274.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\347\277\274.png" new file mode 100644 index 0000000..f23839c Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\347\277\274.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\350\204\212.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\350\204\212.png" new file mode 100644 index 0000000..266f48c Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\244\251\347\251\272\344\271\213\350\204\212.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\255\246\345\276\222\347\254\224\350\256\260.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\255\246\345\276\222\347\254\224\350\256\260.png" new file mode 100644 index 0000000..bb6fb28 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\255\246\345\276\222\347\254\224\350\256\260.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\345\244\247\345\211\221.png" new file mode 100644 index 0000000..fa8a579 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" new file mode 100644 index 0000000..25e8745 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\347\247\230\346\263\225\345\275\225.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\211\221.png" new file mode 100644 index 0000000..4c11593 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\274\223.png" new file mode 100644 index 0000000..4566496 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\256\227\345\256\244\351\225\277\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" new file mode 100644 index 0000000..4be888d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\202\344\270\226\347\225\214\350\241\214\350\256\260.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\223\350\227\217.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\223\350\227\217.png" new file mode 100644 index 0000000..e95e88c Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\223\350\227\217.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\271\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\271\345\274\223.png" new file mode 100644 index 0000000..afba6db Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\345\274\271\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\226\260\346\211\213\351\225\277\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\226\260\346\211\213\351\225\277\346\236\252.png" new file mode 100644 index 0000000..e70bc2e Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\226\260\346\211\213\351\225\277\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\205\350\241\214\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\205\350\241\214\345\211\221.png" new file mode 100644 index 0000000..b53c5ad Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\205\350\241\214\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\240\351\224\213\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\240\351\224\213\345\211\221.png" new file mode 100644 index 0000000..ce8db89 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\227\240\351\224\213\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\206\345\220\276\346\226\255\350\231\271.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\206\345\220\276\346\226\255\350\231\271.png" new file mode 100644 index 0000000..f29d118 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\206\345\220\276\346\226\255\350\231\271.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\255\345\277\203.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\255\345\277\203.png" new file mode 100644 index 0000000..40859fd Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\230\255\345\277\203.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\214\216\346\211\213.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\214\216\346\211\213.png" new file mode 100644 index 0000000..d9a221a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\214\216\346\211\213.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" new file mode 100644 index 0000000..52a7a2d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\347\232\204\351\205\222\344\270\216\350\257\227.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\351\227\252\345\205\211.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\351\227\252\345\205\211.png" new file mode 100644 index 0000000..ea90ded Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\345\267\267\351\227\252\345\205\211.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\351\223\201\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\351\223\201\345\211\221.png" new file mode 100644 index 0000000..c928630 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\232\227\351\223\201\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" new file mode 100644 index 0000000..c163d7e Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\262\220\346\265\264\351\276\231\350\241\200\347\232\204\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\234\210\351\222\210.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\234\210\351\222\210.png" new file mode 100644 index 0000000..5d51e5d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\234\210\351\222\210.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\265\252\344\271\220\347\253\240.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\265\252\344\271\220\347\253\240.png" new file mode 100644 index 0000000..f7f256b Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\346\265\201\346\265\252\344\271\220\347\253\240.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\213\274\347\232\204\346\234\253\350\267\257.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\213\274\347\232\204\346\234\253\350\267\257.png" new file mode 100644 index 0000000..5705564 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\213\274\347\232\204\346\234\253\350\267\257.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\214\216\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\214\216\345\274\223.png" new file mode 100644 index 0000000..87e3b5f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\214\216\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\220\245\347\217\200\347\216\245.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\220\245\347\217\200\347\216\245.png" new file mode 100644 index 0000000..bc11c86 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\220\245\347\217\200\347\216\245.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\224\262\347\272\247\345\256\235\347\217\217.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\224\262\347\272\247\345\256\235\347\217\217.png" new file mode 100644 index 0000000..6840aee Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\224\262\347\272\247\345\256\235\347\217\217.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\345\275\261\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\345\275\261\345\211\221.png" new file mode 100644 index 0000000..d42fcab Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\345\275\261\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\347\274\250\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\347\274\250\346\236\252.png" new file mode 100644 index 0000000..4c4d2ee Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\347\274\250\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\351\223\201\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\351\223\201\345\244\247\345\211\221.png" new file mode 100644 index 0000000..9e3def3 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\231\275\351\223\201\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\237\263\350\213\261\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\237\263\350\213\261\345\244\247\345\211\221.png" new file mode 100644 index 0000000..0076339 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\237\263\350\213\261\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" new file mode 100644 index 0000000..0808df8 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\236\345\260\204\346\211\213\344\271\213\350\252\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\211\221.png" new file mode 100644 index 0000000..1e79dcc Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\244\247\345\211\221.png" new file mode 100644 index 0000000..f7cc928 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\274\223.png" new file mode 100644 index 0000000..f3f5a07 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\346\256\213\347\253\240.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\346\256\213\347\253\240.png" new file mode 100644 index 0000000..a399d51 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\245\255\347\244\274\346\256\213\347\253\240.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\254\233\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\254\233\345\211\221.png" new file mode 100644 index 0000000..09b78e0 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\254\233\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\273\235\345\274\246.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\273\235\345\274\246.png" new file mode 100644 index 0000000..00c4b26 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\273\235\345\274\246.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\277\241\347\216\211\346\263\225\347\220\203.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\277\241\347\216\211\346\263\225\347\220\203.png" new file mode 100644 index 0000000..c189e94 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\347\277\241\347\216\211\346\263\225\347\220\203.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\213\215\347\277\240\347\214\216\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\213\215\347\277\240\347\214\216\345\274\223.png" new file mode 100644 index 0000000..f46d11d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\213\215\347\277\240\347\214\216\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\236\255\351\252\250\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\236\255\351\252\250\345\211\221.png" new file mode 100644 index 0000000..6dd755b Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\236\255\351\252\250\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\211\221.png" new file mode 100644 index 0000000..3165bfc Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\244\247\345\211\221.png" new file mode 100644 index 0000000..26f441f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\214\216\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\214\216\345\274\223.png" new file mode 100644 index 0000000..b9f0ee2 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\214\216\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\247\230\345\205\270.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\247\230\345\205\270.png" new file mode 100644 index 0000000..c01255a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\347\247\230\345\205\270.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\351\225\277\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\351\225\277\346\236\252.png" new file mode 100644 index 0000000..8f85e37 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\245\277\351\243\216\351\225\277\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" new file mode 100644 index 0000000..378038f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\250\351\276\231\350\213\261\346\235\260\350\260\255.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\255\347\273\203\345\244\247\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\255\347\273\203\345\244\247\345\211\221.png" new file mode 100644 index 0000000..2914a72 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\256\255\347\273\203\345\244\247\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\345\217\244\345\215\216.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\345\217\244\345\215\216.png" new file mode 100644 index 0000000..29bb8ba Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\345\217\244\345\215\216.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\226\251\345\262\251.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\226\251\345\262\251.png" new file mode 100644 index 0000000..3613784 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\226\251\345\262\251.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\230\237\351\225\260.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\230\237\351\225\260.png" new file mode 100644 index 0000000..0745916 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\230\237\351\225\260.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\276\271\346\234\210.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\276\271\346\234\210.png" new file mode 100644 index 0000000..480485e Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\346\276\271\346\234\210.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\351\207\221\347\217\200.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\351\207\221\347\217\200.png" new file mode 100644 index 0000000..6bcf75f Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\350\257\225\344\275\234\351\207\221\347\217\200.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\237\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\237\345\211\221.png" new file mode 100644 index 0000000..3374119 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\237\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\242\350\275\256\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\242\350\275\256\345\274\223.png" new file mode 100644 index 0000000..88143f5 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\242\350\275\256\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\272\347\237\233.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\272\347\237\233.png" new file mode 100644 index 0000000..c197a5b Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\222\272\347\237\233.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\260\226\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\260\226\346\236\252.png" new file mode 100644 index 0000000..64b5b7a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\260\226\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\275\261\351\230\224\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\275\261\351\230\224\345\211\221.png" new file mode 100644 index 0000000..37290e5 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\345\275\261\351\230\224\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\350\234\202\345\210\272.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\350\234\202\345\210\272.png" new file mode 100644 index 0000000..b1408bf Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\201\350\234\202\345\210\272.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\266\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\266\345\211\221.png" new file mode 100644 index 0000000..6ccf1b0 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\223\266\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" new file mode 100644 index 0000000..72c69a4 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\230\277\350\216\253\346\226\257\344\271\213\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\233\250\350\243\201.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\233\250\350\243\201.png" new file mode 100644 index 0000000..6f227a0 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\233\250\350\243\201.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\216\351\271\260\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\216\351\271\260\345\211\221.png" new file mode 100644 index 0000000..5e6c6ed Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\216\351\271\260\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\244\247\345\276\241\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\244\247\345\276\241\345\211\221.png" new file mode 100644 index 0000000..2fd5201 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\244\247\345\276\241\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\276\241\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\276\241\345\211\221.png" new file mode 100644 index 0000000..558aa61 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\243\236\345\244\251\345\276\241\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\255\224\345\257\274\347\273\252\350\256\272.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\255\224\345\257\274\347\273\252\350\256\272.png" new file mode 100644 index 0000000..19a5f58 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\255\224\345\257\274\347\273\252\350\256\272.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\270\246\347\276\275\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\270\246\347\276\275\345\274\223.png" new file mode 100644 index 0000000..923ec01 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\270\246\347\276\275\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\216\346\230\216\347\245\236\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\216\346\230\216\347\245\236\345\211\221.png" new file mode 100644 index 0000000..53dde74 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\216\346\230\216\347\245\236\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\211\221.png" new file mode 100644 index 0000000..9d9edb7 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\345\210\272\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\345\210\272\346\236\252.png" new file mode 100644 index 0000000..008d7ac Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\345\210\272\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\210\230\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\210\230\345\274\223.png" new file mode 100644 index 0000000..b87a98d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\210\230\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\226\251\345\210\200.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\226\251\345\210\200.png" new file mode 100644 index 0000000..7ee3d8c Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\346\226\251\345\210\200.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\347\273\257\347\216\211.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\347\273\257\347\216\211.png" new file mode 100644 index 0000000..ec257b3 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\347\273\257\347\216\211.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\351\225\277\345\211\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\351\225\277\345\211\221.png" new file mode 100644 index 0000000..bfa5bc5 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\345\262\251\351\225\277\345\211\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\346\252\200\345\274\223.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\346\252\200\345\274\223.png" new file mode 100644 index 0000000..2a9f4e3 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\346\252\200\345\274\223.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\347\274\250\346\236\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\347\274\250\346\236\252.png" new file mode 100644 index 0000000..32a928d Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\346\255\246\345\231\250/\351\273\221\347\274\250\346\236\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\203\344\270\203.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\203\344\270\203.png" new file mode 100644 index 0000000..df7c0fb Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\203\344\270\203.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\275\350\216\216.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\275\350\216\216.png" new file mode 100644 index 0000000..4de3c07 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\344\270\275\350\216\216.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\235\345\205\211.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\235\345\205\211.png" new file mode 100644 index 0000000..ff94b0c Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\235\345\205\211.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\257\344\272\232.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\257\344\272\232.png" new file mode 100644 index 0000000..3f9e9a8 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\207\257\344\272\232.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\210\273\346\231\264.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\210\273\346\231\264.png" new file mode 100644 index 0000000..caeb3b6 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\210\273\346\231\264.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\214\227\346\226\227.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\214\227\346\226\227.png" new file mode 100644 index 0000000..b3b2617 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\214\227\346\226\227.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\217\257\350\216\211.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\217\257\350\216\211.png" new file mode 100644 index 0000000..c775493 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\217\257\350\216\211.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\256\211\346\237\217.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\256\211\346\237\217.png" new file mode 100644 index 0000000..2ff3ceb Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\345\256\211\346\237\217.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\227\205\350\241\214\350\200\205.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\227\205\350\241\214\350\200\205.png" new file mode 100644 index 0000000..43bf9d9 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\227\205\350\241\214\350\200\205.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\270\251\350\277\252.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\270\251\350\277\252.png" new file mode 100644 index 0000000..fb92c7a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\346\270\251\350\277\252.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\217\255\345\260\274\347\211\271.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\217\255\345\260\274\347\211\271.png" new file mode 100644 index 0000000..6a43366 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\217\255\345\260\274\347\211\271.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\220\264.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\220\264.png" new file mode 100644 index 0000000..e4c2d7e Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\220\264.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\240\202\347\263\226.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\240\202\347\263\226.png" new file mode 100644 index 0000000..4669701 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\347\240\202\347\263\226.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\212\255\350\212\255\346\213\211.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\212\255\350\212\255\346\213\211.png" new file mode 100644 index 0000000..0bcf147 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\212\255\350\212\255\346\213\211.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\216\253\345\250\234.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\216\253\345\250\234.png" new file mode 100644 index 0000000..54455e5 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\216\253\345\250\234.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\217\262\350\260\242\345\260\224.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\217\262\350\260\242\345\260\224.png" new file mode 100644 index 0000000..c39f5b3 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\217\262\350\260\242\345\260\224.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\241\214\347\247\213.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\241\214\347\247\213.png" new file mode 100644 index 0000000..6878d71 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\241\214\347\247\213.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\257\272\350\211\276\345\260\224.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\257\272\350\211\276\345\260\224.png" new file mode 100644 index 0000000..7de99d7 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\257\272\350\211\276\345\260\224.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\277\252\345\215\242\345\205\213.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\277\252\345\215\242\345\205\213.png" new file mode 100644 index 0000000..560ae54 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\350\277\252\345\215\242\345\205\213.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\207\215\344\272\221.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\207\215\344\272\221.png" new file mode 100644 index 0000000..7d8d76a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\207\215\344\272\221.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\233\267\346\263\275.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\233\267\346\263\275.png" new file mode 100644 index 0000000..6616db0 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\233\267\346\263\275.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\246\231\350\217\261.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\246\231\350\217\261.png" new file mode 100644 index 0000000..4bed894 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\246\231\350\217\261.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\255\210.png" "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\255\210.png" new file mode 100644 index 0000000..24d0ce4 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/gacha/icon/\350\247\222\350\211\262/\351\255\210.png" differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/__init__.py b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/__init__.py new file mode 100644 index 0000000..5d9e833 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/__init__.py @@ -0,0 +1,36 @@ +from hoshino import Service +from .qiu_qiu_translation import qiu_qiu_word_translation,qiu_qiu_phrase_translation + + +sv = Service("原神丘丘语翻译") + +suffix = "\n※ 这个插件只能从丘丘语翻译为中文,不能反向翻译\n※ 发送词语时请注意空格位置是否正确,词语不区分大小写,不要加入任何标点符号\n※ 翻译数据来源于 米游社论坛 https://bbs.mihoyo.com/ys/article/2286805 \n※ 如果你有更好的翻译欢迎来提出 issues" + + + +@sv.on_prefix("丘丘一下") +async def qiu_qiu(bot, ev): + txt = ev.message.extract_plain_text().strip().lower() + if txt == "": + return + mes = qiu_qiu_word_translation(txt) + mes += suffix + await bot.send(ev, mes,at_sender=True) + + + +@sv.on_prefix("丘丘词典") +async def qiu_qiu(bot, ev): + txt = ev.message.extract_plain_text().strip().lower() + if txt == "": + return + mes = qiu_qiu_phrase_translation(txt) + mes += suffix + await bot.send(ev, mes,at_sender=True) + + + + + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_dictionary.json b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_dictionary.json new file mode 100644 index 0000000..08d0f32 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_dictionary.json @@ -0,0 +1,127 @@ +{ + "word": { + + "a": "啊", + + "beru": "做", + "biadam": "找死啊", + "biat": "暴揍", + "buka": "肚子", + + "celi": "元素", + + "dada": "厉害", + "dala": "什么", + "domu": "跳舞", + + "eleka": "此时此刻", + + "guru": "咕", + "gusha": "草", + + "ika": "敌人", + + "kundela": "活着", + "kuzi": "强大", + "kucha": "吃草", + + "la": "啦~", + "lata": "水元素", + + "mani": "给予", + "mi": "我", + "mimi": "我们", + "mita": "肉类", + "mosi": "吃", + "movo": "带来", + "muhe": "胜利", + + "ni": "风", + "nini": "风暴", + "nunu": "睡觉", + "nye": "不", + + "odomu": "朋友", + "olah": "你好", + + "plata": "盾牌", + "pupu": "噗噗", + + "sada": "唱歌", + "shato": "伴随", + "si": "什么", + + "tomo": "感激", + "todo": "放心", + "tiga": "矿石", + + "upa": "聚集", + "unu": "乌努", + + "valo": "谢谢你", + "vin": "酒", + + "ya": "人", + "yaya": "人们", + "ye": "家伙", + "yeye": "这些家伙", + "yo": "你", + "yoyo": "你们", + + "zido": "杀死" + + }, + "phrase": { + "beru si": "做什么", + "biadam": "可恶啊,找死啊,愤怒语气", + "biat": "打爆,暴揍;可恶的", + + "dada": " 极好的,厉害的", + "dala": "表示疑问,不明白的集合,翻译为哪个,什么", + + "guru-guru": "拟声词,形容肚子咕咕叫的声音,饥饿", + "guru guru": "拟声词,形容肚子咕咕叫的声音,饥饿", + "gusha": "植物类食物,不怎么好的,难过的", + + "kucha pupu": "拟声词,吃草时候的拟声词,咯吱噗噗,形容吃草吃得香,贬义", + + "mita": "肉类,好的,好东西,有时代丘丘人,丘丘人部落,好肉族", + "mosi mita": "吃肉,表示开心", + "mosi gusha": "吃草,表示难过", + "movo": "带来,搬运;可引申为收获,丰收", + "muhe": "胜利,战胜;成功的", + + "nini": "大量风元素,风暴,狂风", + "nye": "表示否定,没有了,不是", + + "pupu":"拟声词,噗噗,表示嘲讽", + + "sada": "唱歌,歌颂", + "shato": "乘着,伴随着", + + "upa": "凝聚,聚集,集合;聚落,部落", + "unu": "乌努,丘丘人所崇拜的神灵", + + "valo": "谢谢你,不客气/再见", + "vin": "酒的,喝酒有关的,酒桶盖子", + + "ya": "特指人类,一个人类", + "yaya": "人类的复数 ,大群人类", + "ye": "你这个家伙,蔑称;或用于地位高者对地位低者的称呼", + "yeye": "你们这些家伙,蔑称,ye的复数", + "yo": "你,友善称呼", + "yoyo": "你们,yo的复数,友善称呼ye", + + + + "nye mita da ye mosi zido": "再见,一路平安", + "vin plata dada": "你的酒桶盾牌真不错", + "kucha pupu gucha ye": "你咯吱噗噗的吃草的样子真的好搞笑", + "mani nini biaodomu": "愿风暴给予你死亡", + "celi dada mimi nunu": "赞美元素,我们睡觉吧", + "muhe ye": "你们是不可战胜的", + "ye dada": "你们可真棒", + "ye yika": "你们是敌人", + "nini zido": "愿风暴杀死你" + } +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_translation.py b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_translation.py new file mode 100644 index 0000000..c399c50 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/qiu_qiu_translation/qiu_qiu_translation.py @@ -0,0 +1,85 @@ + +import json +import os + + +FILE_PATH = os.path.dirname(__file__) + +QIU_QIU_WORD = {} +QIU_QIU_PHRASE = {} + + +with open(os.path.join(FILE_PATH,'qiu_qiu_dictionary.json'),'r',encoding='UTF-8') as f: + data = json.load(f) + QIU_QIU_WORD = data["word"] + QIU_QIU_PHRASE = data["phrase"] + + +def compare_words(word): + # 比对word库是否有匹配的单词,有的话返回翻译,没有返回原词 + if word in QIU_QIU_WORD: + return QIU_QIU_WORD[word] + + return word + +def compare_phrase(phrase): + # 比对phrase库是否有匹配的单词,有的话返回翻译,没有的话匹配word库,都没有返回原词 + if phrase in QIU_QIU_PHRASE: + return QIU_QIU_PHRASE[phrase] + if phrase in QIU_QIU_WORD: + return QIU_QIU_WORD[phrase] + + return phrase + + + + +def qiu_qiu_word_translation(txt:str): + # 对语句按空格分隔替换单词翻译 + txt_list = txt.split(" ") + mes = "你查询的的丘丘语意思为:\n" + + for word in txt_list: + tra_word = compare_words(word) + + if tra_word == word: + # 如果是原词表示没有翻译,前后加空格接回语句里 + if not mes[-1] == " ": + mes += " " + mes += tra_word + mes += " " + else: + mes += tra_word + mes += "\n" + return mes + + + +def qiu_qiu_phrase_translation(phrase): + # 语句翻译,先看phrase库是不是有匹配的语句 + # 没有的话把单词拆开返回单词的意思 + tra_phrase = compare_phrase(phrase) + if tra_phrase != phrase: + return f"你查询的的丘丘语意思为:\n{tra_phrase}\n" + + txt_list = phrase.split(" ") + mes = "没有查到这句丘丘语,以下是单词的翻译\n" + for word in txt_list: + if word == " ": + continue + tra_word = compare_phrase(word) + if tra_word == word: + mes += f"{word} : 没有这个词的翻译\n" + else: + mes += f"{word} : {tra_word}\n" + + return mes + + + + + + + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/__init__.py b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/__init__.py new file mode 100644 index 0000000..b16c4b5 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/__init__.py @@ -0,0 +1,19 @@ + +from hoshino import Service +from .query_resource_points import get_resource_map_mes,get_resource_list_mes + +sv = Service("原神资源图") + +@sv.on_suffix(('在哪', '在哪里', '哪有', '哪里有')) +@sv.on_prefix(('哪有', '哪里有')) +async def inquire_resource_points(bot, ev): + + resource_name = ev.message.extract_plain_text().strip() + if resource_name == "": + return + + await bot.send(ev, get_resource_map_mes(resource_name), at_sender=True) + +@sv.on_fullmatch('原神资源列表') +async def inquire_resource_list(bot , ev): + await bot.send(ev, get_resource_list_mes(), at_sender=True) diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/15.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/15.png new file mode 100644 index 0000000..d7d7216 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/15.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/16.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/16.png new file mode 100644 index 0000000..f3c6cf2 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/16.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/17.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/17.png new file mode 100644 index 0000000..03ad298 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/17.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/18.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/18.png new file mode 100644 index 0000000..2db3e51 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/18.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/19.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/19.png new file mode 100644 index 0000000..10d066c Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/19.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/2.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/2.png new file mode 100644 index 0000000..a4aad00 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/2.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/20.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/20.png new file mode 100644 index 0000000..10d066c Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/20.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/21.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/21.png new file mode 100644 index 0000000..10d066c Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/21.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/22.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/22.png new file mode 100644 index 0000000..55afb5c Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/22.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/23.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/23.png new file mode 100644 index 0000000..54158a9 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/23.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/24.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/24.png new file mode 100644 index 0000000..e74f6e5 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/24.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/25.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/25.png new file mode 100644 index 0000000..b1e03b6 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/25.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/26.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/26.png new file mode 100644 index 0000000..03f08f7 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/26.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/27.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/27.png new file mode 100644 index 0000000..fdda50c Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/27.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/28.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/28.png new file mode 100644 index 0000000..1326e6a Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/28.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/29.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/29.png new file mode 100644 index 0000000..6bf43b2 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/29.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/3.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/3.png new file mode 100644 index 0000000..f45f64f Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/3.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/30.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/30.png new file mode 100644 index 0000000..b3bfa98 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/30.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/31.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/31.png new file mode 100644 index 0000000..2da75b3 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/31.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/32.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/32.png new file mode 100644 index 0000000..ef49489 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/32.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/33.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/33.png new file mode 100644 index 0000000..85d18ae Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/33.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/34.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/34.png new file mode 100644 index 0000000..dbdd8cb Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/34.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/35.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/35.png new file mode 100644 index 0000000..92a1b03 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/35.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/36.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/36.png new file mode 100644 index 0000000..1d1a828 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/36.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/37.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/37.png new file mode 100644 index 0000000..6ee23f0 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/37.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/38.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/38.png new file mode 100644 index 0000000..eccc9e8 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/38.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/39.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/39.png new file mode 100644 index 0000000..1c7ba8a Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/39.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/40.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/40.png new file mode 100644 index 0000000..ad5d35b Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/40.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/41.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/41.png new file mode 100644 index 0000000..f44aec7 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/41.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/42.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/42.png new file mode 100644 index 0000000..ff4bc48 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/42.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/43.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/43.png new file mode 100644 index 0000000..ee6a230 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/43.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/44.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/44.png new file mode 100644 index 0000000..03ad298 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/44.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/45.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/45.png new file mode 100644 index 0000000..9a082a3 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/45.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/46.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/46.png new file mode 100644 index 0000000..03ad298 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/46.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/47.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/47.png new file mode 100644 index 0000000..953ad0e Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/47.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/48.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/48.png new file mode 100644 index 0000000..21aecc2 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/48.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/49.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/49.png new file mode 100644 index 0000000..7127e83 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/49.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/5.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/5.png new file mode 100644 index 0000000..b3ec620 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/5.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/52.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/52.png new file mode 100644 index 0000000..5db72ef Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/52.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/53.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/53.png new file mode 100644 index 0000000..71edd51 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/53.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/54.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/54.png new file mode 100644 index 0000000..9b5840a Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/54.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/55.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/55.png new file mode 100644 index 0000000..82206b0 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/55.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/56.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/56.png new file mode 100644 index 0000000..82206b0 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/56.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/57.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/57.png new file mode 100644 index 0000000..28bca9f Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/57.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/58.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/58.png new file mode 100644 index 0000000..6aeefe8 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/58.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/59.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/59.png new file mode 100644 index 0000000..db1dcda Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/59.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/6.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/6.png new file mode 100644 index 0000000..1fbc301 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/6.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/61.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/61.png new file mode 100644 index 0000000..e06315b Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/61.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/62.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/62.png new file mode 100644 index 0000000..d6bccb1 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/62.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/63.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/63.png new file mode 100644 index 0000000..87f21e1 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/63.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/64.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/64.png new file mode 100644 index 0000000..ed9844f Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/64.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/65.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/65.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/65.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/66.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/66.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/66.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/67.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/67.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/67.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/68.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/68.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/68.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/69.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/69.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/69.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/70.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/70.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/70.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/71.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/71.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/71.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/72.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/72.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/72.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/73.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/73.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/73.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/74.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/74.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/74.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/75.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/75.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/75.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/76.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/76.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/76.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/77.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/77.png new file mode 100644 index 0000000..bdf2090 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/77.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/8.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/8.png new file mode 100644 index 0000000..8a80c13 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/8.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/9.png b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/9.png new file mode 100644 index 0000000..8a80c13 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/icon/9.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/query_resource_points.py b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/query_resource_points.py new file mode 100644 index 0000000..18ea725 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/query_resource_points.py @@ -0,0 +1,234 @@ + +from urllib import request +from PIL import Image +from io import BytesIO +import json +import os +import time +import base64 + + + + +URL = 'https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/point/list?map_id=2&app_sn=ys_obc' +header = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36' + + +FILE_PATH = os.path.dirname(__file__) + +MAP_PATH = os.path.join(os.path.dirname(FILE_PATH),"seek_god_eye","icon","map_icon.png") +MAP_IMAGE = Image.open(MAP_PATH) +MAP_SIZE = MAP_IMAGE.size + + +# resource_point里记录的坐标是相对坐标,是以蒙德城的大雕像为中心的,所以图片合成时需要转换坐标 +CENTER = (3505,1907) + + +zoom = 0.5 +# +resource_icon_offset = (-int(150*0.5*zoom),-int(150*zoom)) + + +data = { + "all_resource_type":{ + # 这个字典保存所有资源类型,数据来源是同目录下的resource_type_id.json + # "1": { + # "id": 1, + # "name": "传送点", + # "icon": "", + # "parent_id": 0, + # "depth": 1, + # "node_type": 1, + # "jump_type": 0, + # "jump_target_id": 0, + # "display_priority": 0, + # "children": [] + # }, + }, + "can_query_type_list":{ + # 这个字典保存所有可以查询的资源类型名称和ID,这个字典只有名称和ID + # 上边字典里"depth": 2的类型才可以查询,"depth": 1的是1级目录,不能查询 + # "七天神像":"2" + # "风神瞳":"5" + + }, + "all_resource_point_list" :[ + # 这个列表保存所有资源点的数据 + # { + # "id": 2740, + # "label_id": 68, + # "x_pos": -1789, + # "y_pos": 2628, + # "author_name": "✟紫灵心✟", + # "ctime": "2020-10-29 10:41:21", + # "display_state": 1 + # }, + ], + "date":"" #记录上次更新"all_resource_point_list"的日期 +} + + + +def up_all_point_list(): + schedule = request.Request(URL) + schedule.add_header('User-Agent', header) + with request.urlopen(schedule) as f: + if f.code != 200: # 检查返回的状态码是否是200 + raise ValueError(f"资源点列表初始化失败,错误代码{f.code}") + test = json.loads(f.read().decode('utf-8')) + data["all_resource_point_list"] = test["data"]["point_list"] + data["date"] = time.strftime("%d") + + + +def load_resource_type_id(): + with open(os.path.join(FILE_PATH,'resource_type_id.json'), 'r', encoding='UTF-8') as f: + json_data = json.load(f) + for id in json_data.keys(): + data["all_resource_type"][id] = json_data[id] + if json_data[id]["depth"] != 1: + data["can_query_type_list"][json_data[id]["name"]] = id + + +# 初始化 +load_resource_type_id() +up_all_point_list() + + + + + +class Resource_map(object): + + def __init__(self,resource_name): + self.resource_id = str(data["can_query_type_list"][resource_name]) + + # 地图要要裁切的左上角和右下角坐标 + # 这里初始化为地图的大小 + self.x_start = MAP_SIZE[0] + self.y_start = MAP_SIZE[1] + self.x_end = 0 + self.y_end = 0 + + self.map_image = MAP_IMAGE.copy() + + self.resource_icon = Image.open(os.path.join(FILE_PATH,"icon",f"{self.resource_id}.png")) + self.resource_icon = self.resource_icon.resize((int(150*zoom),int(150*zoom))) + + + self.resource_xy_list = self.get_resource_point_list() + + + def get_resource_point_list(self): + temp_list = [] + for resource_point in data["all_resource_point_list"]: + if str(resource_point["label_id"]) == self.resource_id : + # 获取xy坐标,然后加上中心点的坐标完成坐标转换 + x = resource_point["x_pos"] + CENTER[0] + y = resource_point["y_pos"] + CENTER[1] + temp_list.append((int(x),int(y))) + return temp_list + + + def paste(self): + for x,y in self.resource_xy_list: + # 把资源图片贴到地图上 + self.map_image.paste(self.resource_icon,(x + resource_icon_offset[0] , y + resource_icon_offset[1]),self.resource_icon) + + # 找出4个方向最远的坐标,用于后边裁切 + self.x_start = min(x,self.x_start) + self.y_start = min(y,self.y_start) + self.x_end = max(x,self.x_end) + self.y_end = max(y,self.y_end) + + + def crop(self): + + # 先把4个方向扩展150像素防止把资源图标裁掉 + self.x_start -= 150 + self.y_start -= 150 + self.x_end += 150 + self.y_end += 150 + + # 如果图片裁切的太小会看不出资源的位置在哪,检查图片裁切的长和宽看够不够1000,不到1000的按1000裁切 + if (self.x_end - self.x_start)<1000: + center = int((self.x_end + self.x_start) / 2) + self.x_start = center - 500 + self.x_end = center +500 + if (self.y_end - self.y_start)<1000: + center = int((self.y_end + self.y_start) / 2) + self.y_start = center - 500 + self.y_end = center +500 + + self.map_image = self.map_image.crop((self.x_start,self.y_start,self.x_end,self.y_end)) + + def get_cq_cod(self): + + if not self.resource_xy_list: + return "没有这个资源的信息" + + self.paste() + + self.crop() + + bio = BytesIO() + self.map_image.save(bio, format='PNG') + base64_str = 'base64://' + base64.b64encode(bio.getvalue()).decode() + + return f"[CQ:image,file={base64_str}]" + + def get_resource_count(self): + return len(self.resource_xy_list) + + + +def get_resource_map_mes(name): + + if data["date"] != time.strftime("%d"): + up_all_point_list() + + if not (name in data["can_query_type_list"]): + return f"没有 {name} 这种资源。\n发送 原神资源列表 查看所有资源名称" + + map = Resource_map(name) + count = map.get_resource_count() + + if not count: + return f"没有找到 {name} 资源的位置,可能米游社wiki还没更新。" + + mes = f"资源 {name} 的位置如下\n" + mes += map.get_cq_cod() + + mes += f"\n\n※ {name} 一共找到 {count} 个位置点\n※ 数据来源于米游社wiki" + + return mes + + + +def get_resource_list_mes(): + + temp = {} + + for id in data["all_resource_type"].keys(): + # 先找1级目录 + if data["all_resource_type"][id]["depth"] == 1: + temp[id] = [] + + for id in data["all_resource_type"].keys(): + # 再找2级目录 + if data["all_resource_type"][id]["depth"] == 2: + temp[str(data["all_resource_type"][id]["parent_id"])].append(id) + + mes = "当前资源列表如下:\n" + + for resource_type_id in temp.keys(): + mes += f"{data['all_resource_type'][resource_type_id]['name']} : " + for resource_id in temp[resource_type_id]: + mes += f"{data['all_resource_type'][resource_id]['name']} " + mes += "\n" + + return mes + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/resource_type_id.json b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/resource_type_id.json new file mode 100644 index 0000000..9459f34 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/query_resource_points/resource_type_id.json @@ -0,0 +1,926 @@ +{ + "1": { + "id": 1, + "name": "传送点", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "2": { + "id": 2, + "name": "七天神像", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/c59585d1fabc9c22ad3fcf94e1622aa8_357413506633071859.png", + "parent_id": 1, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "3": { + "id": 3, + "name": "传送锚点", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/0cc42d15134cbb724304050fd0bbcaac_8799482478853097434.png", + "parent_id": 1, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "4": { + "id": 4, + "name": "神瞳", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "5": { + "id": 5, + "name": "风神瞳", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/4b568dcdea1c699456464c611ce87e4f_3484482126589511603.png", + "parent_id": 4, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "6": { + "id": 6, + "name": "岩神瞳", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/f4409292be83f81d0c41c350a91ebac1_355618004292502793.png", + "parent_id": 4, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "7": { + "id": 7, + "name": "地灵龛", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "8": { + "id": 8, + "name": "蒙德地灵龛", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/a9f458cf7ba149ec659aabb581050a0b_3339433578214432669.png", + "parent_id": 7, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "9": { + "id": 9, + "name": "璃月地灵龛", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/a9f458cf7ba149ec659aabb581050a0b_3479171218459475297.png", + "parent_id": 7, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "10": { + "id": 10, + "name": "区域特产", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "29": { + "id": 29, + "name": "落落莓", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/11e1861e2b94d1b1e132d61c0f7c3948_5882174105995719914.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "30": { + "id": 30, + "name": "绝云椒椒", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/3184e356629e8b071a878063d1c0df94_5172487424247849295.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "31": { + "id": 31, + "name": "嘟嘟莲", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/07a2252a60301893294ef377e563f0e7_7014418407781853378.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "32": { + "id": 32, + "name": "清心", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/0de9385a957ef0cb981a5ed6a6984f57_7797138076139828289.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "33": { + "id": 33, + "name": "小灯草", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/348fe1164e9330226b225c011aea4d5a_2068903308538485227.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "34": { + "id": 34, + "name": "琉璃袋", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/77dc4532fe938a24c4cc714d77d48b0d_6612669651078791213.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "35": { + "id": 35, + "name": "塞西莉亚花", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/e55cfc43f5e483362e9ddf433653d326_9031812646608361297.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "36": { + "id": 36, + "name": "霓裳花", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/e22d205c11b39b9b6984a4ec8adefeb2_2210397206297609865.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "37": { + "id": 37, + "name": "蒲公英籽", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/a348a4302f58f499bdf89025d2cb2cdb_2244957478004520779.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "38": { + "id": 38, + "name": "琉璃百合", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/dfe6d92e18060cd724ebadd73ba084c6_7141991283452930467.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "39": { + "id": 39, + "name": "慕风蘑菇", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/d0f4c83add3dc326ffc92b5fedb6f82c_3118392491847470850.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "40": { + "id": 40, + "name": "石珀", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/5789d9dc9c8840f21f9afc2437e9026e_8487232206600716291.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "41": { + "id": 41, + "name": "钩钩果", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/7dedeee543b94525f0812a18eb09b7d7_4938366361261655916.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "42": { + "id": 42, + "name": "夜泊石", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/51adcbda83a2f2b4422db9ad4908245b_7898256673375056193.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "43": { + "id": 43, + "name": "风车菊", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/387684f5c9a891135e05f95192b6dc21_2171784899125537458.png", + "parent_id": 10, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "11": { + "id": 11, + "name": "矿物", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "15": { + "id": 15, + "name": "白铁块", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/4d0e329b0458a918d376bbbabd4415cd_9079005216548585535.png", + "parent_id": 11, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "16": { + "id": 16, + "name": "水晶块", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/ceede1f6fa9a3e53986b5ac63e2aacb9_3251440935681461856.png", + "parent_id": 11, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "12": { + "id": 12, + "name": "怪物(精英)", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "19": { + "id": 19, + "name": "火斧丘丘暴徒", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/cef1444b97c8f49cd8cd8aa10e5448ae_1229715974301029440.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "20": { + "id": 20, + "name": "木盾丘丘暴徒", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/cef1444b97c8f49cd8cd8aa10e5448ae_2049522587981126653.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "21": { + "id": 21, + "name": "岩盾丘丘暴徒", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/cef1444b97c8f49cd8cd8aa10e5448ae_4383986804076887911.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "22": { + "id": 22, + "name": "火深渊法师", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/3c287ea61919d856723ba802fd91677f_2936850964636137610.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "23": { + "id": 23, + "name": "水深渊法师", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/5d59b593551bb62506096c76bd55ab2a_5561999899365928315.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "24": { + "id": 24, + "name": "冰深渊法师", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/4b9b07114f30df8715f41835d3215add_6327856690043584281.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "25": { + "id": 25, + "name": "愚人众 债务处理人", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/359e5697e4609a7f34714bfa65cce97e_7545179401283346969.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "26": { + "id": 26, + "name": "愚人众 雷萤术士", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/a73112218e1329ae4728a096554258d7_4082505538504798279.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "27": { + "id": 27, + "name": "遗迹守卫", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/86ddf140b786c6a2a73b038e341403a7_6217455819326456307.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "28": { + "id": 28, + "name": "遗迹猎者", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/99ce18638304f8169918c85436d0585c_5415189466598569723.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "47": { + "id": 47, + "name": "冰霜骗骗花", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/54904a37ab2165e5b8ad91c7ee805061_2703681786862158841.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "48": { + "id": 48, + "name": "炽热骗骗花", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/1848c68a09d54637721529abb35b22a1_7882961499456527312.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "49": { + "id": 49, + "name": "幼岩龙蜥", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/83d1ef1dbb3b6d489c0b150886597cbc_5647365818975751099.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "53": { + "id": 53, + "name": "丘丘岩盔王", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/a6e1a33b8f4bd4c8a091f69ead200948_2480904266424771100.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "54": { + "id": 54, + "name": "愚人众先遣队", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/8dd741d0f58dc6abef2f9ee6d278a062_7759801496426769012.png", + "parent_id": 12, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "13": { + "id": 13, + "name": "宝箱", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "17": { + "id": 17, + "name": "普通的宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/35cf41aad7620ce6d5dc516defb967f7_7806440070871726330.png", + "parent_id": 13, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "44": { + "id": 44, + "name": "精致的宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/35cf41aad7620ce6d5dc516defb967f7_6214340810257945197.png", + "parent_id": 13, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "45": { + "id": 45, + "name": "珍贵的宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/44a7de58782f36f15bec044c1069da76_7523256410581248233.png", + "parent_id": 13, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "46": { + "id": 46, + "name": "华丽的宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/14/75276545/35cf41aad7620ce6d5dc516defb967f7_3987566332689612662.png", + "parent_id": 13, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "14": { + "id": 14, + "name": "解谜", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "18": { + "id": 18, + "name": "指引仙灵", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/08/75276545/8de3558f991ac422463712dd095278b3_109842752079072307.png", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "64": { + "id": 64, + "name": "限时挑战", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/75795471/a6978cb8965e81de4a25accbf6c236ce_6189233402996409228.png", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "65": { + "id": 65, + "name": "风车机关", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_7547151797455251961.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "66": { + "id": 66, + "name": "漂浮的风史莱姆", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_6780166156178323412.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "67": { + "id": 67, + "name": "压力机关", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_5932273944571249310.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "68": { + "id": 68, + "name": "蓬蓬果", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_7627546850715675857.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "69": { + "id": 69, + "name": "挖掘宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_200949033774003499.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "70": { + "id": 70, + "name": "元素方碑", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_8520221369291334139.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "71": { + "id": 71, + "name": "火炬机关", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_1061118532437351431.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "72": { + "id": 72, + "name": "巨型碎石", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_6449674692302465374.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "73": { + "id": 73, + "name": "小石堆", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_7798666829547657712.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "74": { + "id": 74, + "name": "拔植物", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_3891992353724563278.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "75": { + "id": 75, + "name": "被束缚的宝箱", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_7069442788377617628.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "76": { + "id": 76, + "name": "岩种子", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_6714446188416963945.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "77": { + "id": 77, + "name": "微解谜", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/21/75795471/de87958fa1e78efcc84da49aad61dede_3053004782269703586.jpg", + "parent_id": 14, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "50": { + "id": 50, + "name": "怪物(普通)", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "55": { + "id": 55, + "name": "丘丘人", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/74c2350936386d12f84e4244b8bd9750_8061221501486024583.png", + "parent_id": 50, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "56": { + "id": 56, + "name": "射手丘丘人", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/74c2350936386d12f84e4244b8bd9750_8668908145618002848.png", + "parent_id": 50, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "57": { + "id": 57, + "name": "丘丘萨满", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/fbd2f8a868f6c3a6f587d57d655f40c9_1156685569894627424.png", + "parent_id": 50, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "58": { + "id": 58, + "name": "盗宝团", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/a9ecb7952e877dfd7c1dfae5132c7181_242314377398779361.png", + "parent_id": 50, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "59": { + "id": 59, + "name": "史莱姆", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/de444c63df86b407045c0cca2d9c24b2_761844897909742071.png", + "parent_id": 50, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "51": { + "id": 51, + "name": "世界任务", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "52": { + "id": 52, + "name": "世界任务", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/16/75795471/c7263000d1f1ec150eddd27fca4d8630_2386396225561541114.png", + "parent_id": 51, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "60": { + "id": 60, + "name": "材料", + "icon": "", + "parent_id": 0, + "depth": 1, + "node_type": 1, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "61": { + "id": 61, + "name": "冰雾花花朵", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/cca41572bb14d20c094ce9af77eefda9_2844359998862121652.png", + "parent_id": 60, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "62": { + "id": 62, + "name": "烈焰花花蕊", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/82a7a8327bfa630eb5e52695a2b456e9_4760074611076337816.png", + "parent_id": 60, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + }, + "63": { + "id": 63, + "name": "电气水晶", + "icon": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/17/75276545/aab9020763a7bee1fb532b7117b21fd1_5874466862813696108.png", + "parent_id": 60, + "depth": 2, + "node_type": 2, + "jump_type": 0, + "jump_target_id": 0, + "display_priority": 0, + "children": [] + } +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/Genshin/screenshot/genshin_impact_gacha.png b/XCW/hoshino/hoshino/modules/Genshin/screenshot/genshin_impact_gacha.png new file mode 100644 index 0000000..d618f61 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/screenshot/genshin_impact_gacha.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/screenshot/qiu_qiu_translation.png b/XCW/hoshino/hoshino/modules/Genshin/screenshot/qiu_qiu_translation.png new file mode 100644 index 0000000..552e798 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/screenshot/qiu_qiu_translation.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/screenshot/query_resource_points.png b/XCW/hoshino/hoshino/modules/Genshin/screenshot/query_resource_points.png new file mode 100644 index 0000000..9474792 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/screenshot/query_resource_points.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/screenshot/search_god_eye.png b/XCW/hoshino/hoshino/modules/Genshin/screenshot/search_god_eye.png new file mode 100644 index 0000000..b3d70cb Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/screenshot/search_god_eye.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/__init__.py b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/__init__.py new file mode 100644 index 0000000..24f05cd --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/__init__.py @@ -0,0 +1,153 @@ +from hoshino import Service +from nonebot import on_command +# from ..config import ALLOW_PRIVATE_CHAT +import random +from .seek_god_eye import (JSON_LIST, + GOD_EYE_INFO, + GOD_EYE_CLASS_LIST, + init_uid_info, + get_random_god_eye_id, + get_god_eye_message, + get_uid_number_found, + found_god_eye, + delete_god_eye_info, + reset_god_eye_info) + + + + + + +sv = Service('原神神瞳信息查询') + +search_god_eye_command = [] +for eye_type in JSON_LIST: + search_god_eye_command.append(f"找{eye_type}") + +reset_god_eye_command = [] +for eye_type in JSON_LIST: + reset_god_eye_command.append(f"重置{eye_type}找到记录") + +verification_code_list = { + # 重置已找到神瞳列表时需要二次确认,这个字典用来存验证码 + # "QQ号" : 验证码 +} + + +@sv.on_prefix(search_god_eye_command) +async def search_god_eye(bot, ev): + + command_txt = ev['prefix'] + god_eye_id = ev.message.extract_plain_text().strip() + userid = ev['user_id'] + init_uid_info(userid) + + if not (god_eye_id in GOD_EYE_INFO): + if god_eye_id != "": + await bot.send(ev, f"找不到编号为 {god_eye_id} 的神瞳" , at_sender=True) + return + + god_eye_type = command_txt[1:] # 把指令前边的 找 字去掉 + + if god_eye_id == "": + # 如果用户没有给神瞳ID就根据属性随机一个没找到过的返回 + god_eye_id = get_random_god_eye_id(userid,god_eye_type) + + if god_eye_id == "": + # 如果随机之后还是空字符串,就表示这种神瞳已经都找完了 + await bot.send(ev, f"你已经找完这种神瞳了!", at_sender=True) + return + + mes = get_god_eye_message(god_eye_id) + + await bot.send(ev, mes, at_sender=True) + + + +@sv.on_prefix("找到神瞳了") +async def found_it(bot, ev): + god_eye_id = ev.message.extract_plain_text().strip() + userid = ev['user_id'] + init_uid_info(userid) + + if god_eye_id == "": + await bot.send(ev, f"你需要发送一个神瞳编号" , at_sender=True) + return + + if not (god_eye_id in GOD_EYE_INFO): + await bot.send(ev, f"找不到编号为 {god_eye_id} 的神瞳" , at_sender=True) + return + + mes = found_god_eye(userid,god_eye_id) + + await bot.send(ev, mes, at_sender=True) + + + +@sv.on_prefix("删除找到神瞳",only_to_me=True) +async def delete_god_eye_id(bot, ev): + + god_eye_id = ev.message.extract_plain_text().strip() + userid = ev['user_id'] + init_uid_info(userid) + + if god_eye_id == "": + await bot.send(ev, f"你需要发送一个神瞳编号" , at_sender=True) + return + + if not (god_eye_id in GOD_EYE_INFO): + await bot.send(ev, f"找不到编号为 {god_eye_id} 的神瞳" , at_sender=True) + return + + mes = delete_god_eye_info(userid,god_eye_id) + + await bot.send(ev, mes, at_sender=True) + + +@sv.on_prefix(reset_god_eye_command,only_to_me=True) +async def reset_god_eye_(bot, ev): + + verification_code = ev.message.extract_plain_text().strip() + userid = ev['user_id'] + init_uid_info(userid) + command_txt = ev['prefix'].strip() + god_eye_type = command_txt[2:-4] + + if not (god_eye_type in JSON_LIST): + await bot.send(ev, f"没有这种神瞳" , at_sender=True) + return + + if verification_code == "": + + new_verification_code = "" + for i in range(4): + # 生成一个4位的字母验证码 + new_verification_code += str(chr(random.randint(65,90))) + + verification_code_list[userid] = new_verification_code + await bot.send(ev, f"你确定要重置已经找到的神瞳记录吗?如果确定请发送:\n{command_txt}{new_verification_code}" , at_sender=True) + return + + + if verification_code_list[userid] == verification_code: + reset_god_eye_info(userid,god_eye_type) + verification_code_list.pop(userid) + await bot.send(ev, f"已重置已经找到的{god_eye_type}记录" , at_sender=True) + return + + await bot.send(ev, f"验证码错误,请检查验证码是否正确或重新生成验证码。", at_sender=True) + + + +@sv.on_prefix("找到多少神瞳了",only_to_me=True) +async def found_god_eye_info(bot, ev): + userid = ev['user_id'] + init_uid_info(userid) + + mes = get_uid_number_found(userid) + + await bot.send(ev, mes, at_sender=True) + + + + diff --git a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/map_icon.png b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/map_icon.png new file mode 100644 index 0000000..e0521d6 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/map_icon.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_rock_god_eye.png b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_rock_god_eye.png new file mode 100644 index 0000000..30f2346 Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_rock_god_eye.png differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_wind_god_eye.png b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_wind_god_eye.png new file mode 100644 index 0000000..858facc Binary files /dev/null and b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/raw_wind_god_eye.png differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\345\262\251\347\245\236\347\236\263.png" "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\345\262\251\347\245\236\347\236\263.png" new file mode 100644 index 0000000..bc7c42a Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\345\262\251\347\245\236\347\236\263.png" differ diff --git "a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\351\243\216\347\245\236\347\236\263.png" "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\351\243\216\347\245\236\347\236\263.png" new file mode 100644 index 0000000..e95de89 Binary files /dev/null and "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/icon/\351\243\216\347\245\236\347\236\263.png" differ diff --git a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/seek_god_eye.py b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/seek_god_eye.py new file mode 100644 index 0000000..3f5aadc --- /dev/null +++ b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/seek_god_eye.py @@ -0,0 +1,235 @@ + +from nonebot import MessageSegment +from hoshino import R +from PIL import Image +from io import BytesIO + +import os +import json +import random +import base64 + +FILE_PATH = os.path.dirname(__file__) + +JSON_LIST = ["风神瞳","岩神瞳"] + + + +GOD_EYE_TOTAL = { + # 每种神瞳有多少个,这个字典会在导入神瞳的json时初始化 + # "风神瞳" : 100 +} + +GOD_EYE_INFO = { + # 所有神瞳的信息 + # "56": { + # "属性": "风神瞳", + # "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/cbd63e9fbb00160b045dafc424c1657f_1299454333660281584.gif", + # "备注": "", + # "x_pos": 1922.0018670150284, + # "y_pos": 683.9995073891628 + # } +} + +GOD_EYE_CLASS_LIST = { + # 每种神瞳的编号列表 + # "风神瞳":["1","2","3"], + # "岩神瞳":["4","5","6"] + +} + + +MAP_IMAGE = Image.open(os.path.join(FILE_PATH,"icon","map_icon.png")) +MAP_SIZE = MAP_IMAGE.size + + +# 风神瞳.json里记录的坐标是相对坐标,是以蒙德城的大雕像为中心的,所以图片合成时需要转换坐标 +CENTER = (3505,1907) + +# 神瞳位置图的裁切尺寸,默认是1000,表示图片长宽都是1000 +CROP_SIZE = 1000 + +uid_info = { + # 这个字典记录用户已经找到的神瞳编号 + # "12345":{ + # "风神瞳":[], + # "岩神瞳":[] + # } +} + + + +for json_name in JSON_LIST: + # 导入神瞳的.json文件 + with open(os.path.join(FILE_PATH, f"{json_name}.json"), 'r', encoding='UTF-8') as f: + data = json.load(f) + GOD_EYE_TOTAL[json_name] = len(data) + GOD_EYE_INFO.update(data) + GOD_EYE_CLASS_LIST.setdefault(json_name,data.keys()) + + + + +def save_uid_info(): + with open(os.path.join(FILE_PATH,'uid_info.json'),'w',encoding='UTF-8') as f: + json.dump(uid_info,f,ensure_ascii=False,indent=4) + + +# 检查uid_info.json是否存在,没有创建空的 +if not os.path.exists(os.path.join(FILE_PATH,'uid_info.json')): + save_uid_info() + +# 读取uid_info.json的信息 +with open(os.path.join(FILE_PATH,'uid_info.json'),'r',encoding='UTF-8') as f: + uid_info = json.load(f) + + + + + +class God_eye_position_image(object): + # 获取神瞳的位置图像 + # 传入的参数是神瞳的编号,实例化后直接调用get_cq_code即可返回图片的CQ码,使用base64发送 + def __init__(self,god_eye_id): + self.id = str(god_eye_id) + + # ID对应的png文件名 + self.png_name = GOD_EYE_INFO[self.id]["属性"] + '.png' + + # 复制一份地图文件 + self.map_image = MAP_IMAGE.copy() + + # 神瞳的坐标 + self.x,self.y = self.transform_position() + + # 神瞳图片在paste时的偏移量 + self.offset = [50,120] + + def transform_position(self): + # 风神瞳.json里记录的坐标是相对坐标,需要转换一下 + x = GOD_EYE_INFO[self.id]["x_pos"] + CENTER[0] + y = GOD_EYE_INFO[self.id]["y_pos"] + CENTER[1] + return [int(x),int(y)] + + def get_crop_pos(self): + # 返回地图的裁切尺寸,检查裁切点是否越界 + x = max(self.x - CROP_SIZE/2,0) + y = max(self.y - CROP_SIZE/2,0) + r = min(self.x + CROP_SIZE/2,MAP_SIZE[0]) + l = min(self.y + CROP_SIZE/2,MAP_SIZE[1]) + return [x,y,r,l] + + def paste(self): + # 把神瞳的图贴到地图上,然后以神瞳为中心裁切地图 + god_eye_image = Image.open(os.path.join(FILE_PATH, "icon", self.png_name)) + self.map_image.paste(god_eye_image,(self.x - self.offset[0],self.y - self.offset[1]),god_eye_image) + self.map_image = self.map_image.crop(self.get_crop_pos()) + + def get_cq_code(self): + self.paste() + bio = BytesIO() + self.map_image.save(bio, format='PNG') + base64_str = 'base64://' + base64.b64encode(bio.getvalue()).decode() + + return f"[CQ:image,file={base64_str}]" + + + +def get_uid_number_found(uid:str): + mes = "你找到的神瞳信息如下:\n" + for eye_type in JSON_LIST: + number = len(uid_info[uid][eye_type]) + mes += f"你已经找到了 {number} 个 {eye_type} ,该神瞳一共有 {GOD_EYE_TOTAL[eye_type]} 个!\n" + return mes + + +def get_eye_gif_path(eye_id): + # 获取gif的路径,找不到会返回空字符串 + eye_type = GOD_EYE_INFO[eye_id]["属性"] + gif_path = os.path.join(FILE_PATH,"icon",eye_type,str(eye_id) + ".gif") + if os.path.exists(gif_path): + return gif_path + else: + return "" + + +def get_eye_gif_cq_code(eye_id): + # 获取gif的CQ码,找不到gif文件会返回空字符串 + gif_path = get_eye_gif_path(eye_id) + if gif_path == "": + return "" + + gif_path = gif_path.replace("\\","/") + cq_code = f'[CQ:image,file=file://{gif_path}]' + return cq_code + +def get_eye_remarks(eye_id): + # 获取神瞳的备注,注意有的神瞳备注是空字符串 + return GOD_EYE_INFO[eye_id]["备注"] + +def add_god_eye_info(uid,eye_id): + eye_type = GOD_EYE_INFO[eye_id]["属性"] + uid_info[uid][eye_type].append(eye_id) + save_uid_info() + +def init_uid_info(uid): + # 初始化用户的信息 + if not (uid in uid_info): + uid_info.setdefault(uid, {}) + for eye_type in JSON_LIST: + if not (eye_type in uid_info[uid]): + uid_info[uid].setdefault(eye_type, []) + +def get_random_god_eye_id(uid,eye_type): + # 获取一个随机没找到过的神瞳ID,返回随机到的神瞳ID,如果返回空字符串表示这种神瞳已经全部找到了 + if len(uid_info[uid][eye_type]) == GOD_EYE_TOTAL[eye_type]: + return "" + # 求差集找出没找到过的神瞳列表 + eyes_never_found = set(GOD_EYE_CLASS_LIST[eye_type]).difference(set(uid_info[uid][eye_type])) + r = random.choice(list(eyes_never_found)) + return str(r) + +def delete_god_eye_info(uid,eye_id): + eye_type = GOD_EYE_INFO[eye_id]["属性"] + if not (eye_id in uid_info[uid][eye_type]): + return "你还没有找到这个神瞳!" + + uid_info[uid][eye_type].remove(eye_id) + save_uid_info() + return f"已经在你的记录列表删除编号为 {eye_id} 的神瞳" + +def reset_god_eye_info(uid,eye_type): + # 重置某一种神瞳的已找到列表 + uid_info[uid][eye_type].clear() + save_uid_info() + return "已重置已找到这种神瞳的列表" + +def get_god_eye_message(eye_id): + message = f"当前神瞳编号 {eye_id} \n" + message += God_eye_position_image(eye_id).get_cq_code() # 获取神瞳位置图 + message += "\n" + + gif_cq_code = get_eye_gif_cq_code(eye_id) # 获取找神瞳的动图,没有找到这就是个空字符串 + if gif_cq_code: + message += gif_cq_code + message += "\n" + + remarks_txt = get_eye_remarks(eye_id) # 获取神瞳的备注信息 + if remarks_txt: + message += "备注:" + message += remarks_txt + message += "\n" + + message += "\n※ 如果你找到了神瞳或者你确定这个神瞳已经找过了,可以发送 找到神瞳了 神瞳编号\n" + message += "※ 机器人记录你找到这个神瞳之后将不再给你发送这个神瞳位置\n" + message += "※ 图片及数据来源于原神观测枢wiki\n" + message += "※ 神瞳位置有可能有细微误差,具体以游戏里为准" + + return message + +def found_god_eye(uid,eye_id): + add_god_eye_info(uid,eye_id) + save_uid_info() + return f"已添加编号为 {eye_id} 的神瞳找到记录!" + + diff --git "a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\345\262\251\347\245\236\347\236\263.json" "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\345\262\251\347\245\236\347\236\263.json" new file mode 100644 index 0000000..96c0e09 --- /dev/null +++ "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\345\262\251\347\245\236\347\236\263.json" @@ -0,0 +1,919 @@ +{ + "2110": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/bfb00fa168d8684d7487fce07f5b543a_4424026387832946167.gif", + "备注": "", + "x_pos": -2407.5, + "y_pos": 1602.5 + }, + "2042": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/122c9fcb50d48c4c61d25e1c0a8cf96a_2764643910865172456.gif", + "备注": "", + "x_pos": -0.5, + "y_pos": 2664 + }, + "1865": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/1923190da67768eb52de24d62e1937be_2494748305899061128.gif", + "备注": "", + "x_pos": -2178.5, + "y_pos": 2167.6726049978897 + }, + "1747": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/76441984ff1d830d6b6b8018c1c7bfde_8520420476823328876.gif", + "备注": "从山上滑翔过去就能拿到了", + "x_pos": -2438, + "y_pos": 1607.6449953037095 + }, + "1744": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/101fce2c902850371c4c26c5192a2bf8_7299553878110113351.gif", + "备注": "神瞳在大木桩中央,但是需从旁边高处飞过去才能捡到,大木桩下面怎么跳也够不着的(别问我怎么知道的", + "x_pos": -1205, + "y_pos": 489 + }, + "1734": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/681afc5fbe538cb62494b5f0aeb91296_17354936688802550.gif", + "备注": "", + "x_pos": -2388.5495293809718, + "y_pos": 1226.270843798893 + }, + "1720": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/46b07f1e7ec0633e0d8a93456de53042_1319508688072624084.gif", + "备注": "", + "x_pos": 368.50021848898723, + "y_pos": 2696.000602283162 + }, + "1716": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/35b7c22e8c0c820eaee0a146271f8ff7_7014348581897273900.gif", + "备注": "", + "x_pos": -1082.4994537775328, + "y_pos": 2196.001204566325 + }, + "1714": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/dda98a1af8a91130de916760159c7c22_3702109991219548578.gif", + "备注": "在矿洞中", + "x_pos": -619.9987983105725, + "y_pos": 1446.0013250229576 + }, + "1692": { + "属性": "岩神瞳", + "gif_url": "", + "备注": "", + "x_pos": 9.001092444933875, + "y_pos": 1926.4993977168378 + }, + "1675": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/774bbecb02e6b0b4e6709a1f43c3de6e_2872670206992713583.gif", + "备注": "", + "x_pos": -1230.5002184889868, + "y_pos": 1867.4991568035725 + }, + "1674": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/8cc6328607f8e026e98be7fd1e1d4f3e_1568835659620315348.gif", + "备注": "", + "x_pos": -2494.4995630220265, + "y_pos": 1357.0002409132649 + }, + "1673": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/072762f0094569036595d0cbe9ab0518_3145564383828401599.gif", + "备注": "", + "x_pos": -2399.4995630220265, + "y_pos": 1371.5001204566324 + }, + "1672": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/93d513e5eccaa8668a5c7b790c7fd791_3605844902050387078.gif", + "备注": "神瞳在NPC冒险家丹迪旁边的老歪脖子树上。(不是吊死崇祯那颗啦!", + "x_pos": -1373.069958101236, + "y_pos": 368.26120726829276 + }, + "286": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/4839652/326213c5e0b5433d9a5c2ea6979eff5a_2139784998682881218.gif", + "备注": "神瞳在水车旁边高层塔楼的屋顶上。(我也是爬了半天悬崖才看见的( ̄﹏ ̄;)", + "x_pos": -1340.6024352857153, + "y_pos": 617.403184152372 + }, + "284": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/311834efa3e815663ef3b8403e1e0111_3944235440707971506.gif", + "备注": "神瞳在坑上方的空中。", + "x_pos": -1198.8504157425355, + "y_pos": 846.8043551015844 + }, + "283": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/20585c32a9164fcca9222b42daaaa305_3617152667042309742.gif", + "备注": "", + "x_pos": -1268.4995709468053, + "y_pos": 650.500798676363 + }, + "281": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/4839652/77075947eb779fa655b916e8e754a4d1_6363599850565816084.gif", + "备注": "神瞳在房檐下面,注意别飞过了。", + "x_pos": -1283.9306425450695, + "y_pos": 531.9160212744209 + }, + "280": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/9a4e5bcda1025328397c2cd2782b8584_3011514102623077634.gif", + "备注": "神瞳在高空中,需要先爬树再到房顶才能飞过去捡到。(真麻烦╭(╯^╰)╮)", + "x_pos": -1429.972403722703, + "y_pos": 552.4269365180517 + }, + "278": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/4839652/8c60960615eee3c3b5905126d93bdb98_3197582560415631799.gif", + "备注": "", + "x_pos": -1502.9143385236644, + "y_pos": 621.409365638061 + }, + "277": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/a4b7cf88ed796ff724ba4432cf37f074_7889730050607266460.gif", + "备注": "放个荒星就好了", + "x_pos": -1172.841548643175, + "y_pos": 647.7660186361509 + }, + "276": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/7d845562bafec2b33526a5cece8df423_1936290300520583862.gif", + "备注": "", + "x_pos": -1452.844981068734, + "y_pos": 479.83896441065644 + }, + "275": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/920b10fb304010e4bb1ded92dc40a707_4273448204704312890.gif", + "备注": "", + "x_pos": -1330.8781611824702, + "y_pos": 817.8336399015684 + }, + "274": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/5e4380aacc9d83c3bc53cd0eae3d6f98_8783309690886067650.gif", + "备注": "神瞳在庙屋顶上,可以爬后面的岩壁上去捡。", + "x_pos": -1622.0027234818067, + "y_pos": 578.914690147149 + }, + "273": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/e1041f1b4de72f6e078a934d9152f08f_7753023967918108067.gif", + "备注": "", + "x_pos": -1637.9529533112022, + "y_pos": 712.9580848962164 + }, + "272": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/3ff088aad84bbf6b29c48ab00c156c13_8209708308707735294.gif", + "备注": "神瞳在瀑布坑里的小洞,要仔细一点找哦~", + "x_pos": -1578.9985698226837, + "y_pos": 446.00425960727034 + }, + "271": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/a0cc053115cd320238c073a6d0f80292_3460622677525059934.gif", + "备注": "神瞳在竹子顶上,耐心的爬哦~(我要一步一步往上爬~♫ 咦我怎么唱起来了)", + "x_pos": -1496.9998569822683, + "y_pos": 801.0018635781807 + }, + "270": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/8955a467a8ed09df9e42c0e831c60805_8828823783563834949.gif", + "备注": "", + "x_pos": -1532.9183430201501, + "y_pos": 817.4652729834852 + }, + "269": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/113f5ae8217c8ea07bbe1adf57b41e38_7820847643669684849.gif", + "备注": "神瞳在瀑布旁边的大洞穴里面,遗迹守卫旁边岩壁往上爬就可以看到了。(我还以为它会突然起来打我)", + "x_pos": -1626.905048516015, + "y_pos": 373.90339097062133 + }, + "268": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/06cce7738ee0d1bfd1ba945150ad9e7a_318743286187121433.gif", + "备注": "神瞳在宝箱上方,爬树可以直接捡了飞跑,如果你不想被打的话。(等等,我怎么感觉我还是要被打┭┮﹏┭┮)", + "x_pos": -1345.9982837872203, + "y_pos": 736.0063894109057 + }, + "267": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/2a4b50143f952e432f5b018b20d9fc0d_5571795988927030483.gif", + "备注": "", + "x_pos": -1486.0005720709264, + "y_pos": 161.00851921454068 + }, + "265": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/1e6cfa25cbefd47f531e9ea3e67b246e_287668464508994588.gif", + "备注": "", + "x_pos": -1366.8858841399779, + "y_pos": 869.8576001924648 + }, + "264": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/1d2312d3d9fe9bc396f453c454bb3f21_3563484467109557283.gif", + "备注": "在丘丘人营地的屋顶上", + "x_pos": -1100.9994279290736, + "y_pos": 1101.0079867636318 + }, + "263": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/23/4839652/8e0236299764076ba25c5b2c348fa7a5_4505073313672454428.gif", + "备注": "", + "x_pos": -1117.8286770473292, + "y_pos": 887.8336399015684 + }, + "262": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/23/4839652/5571691d5c81615261f28dbac8b3d13b_1116984694150301308.gif", + "备注": "神瞳在半空中,需要到远处的一块石头上利用风元素激活风车产生风场飞过去才能捡到。", + "x_pos": -1191.9979977517573, + "y_pos": 1030.0063894109057 + }, + "261": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/23/4839652/013498519baea0f756c7f6ac1b26c157_447724792811709310.gif", + "备注": "在圆坑宝箱的上方。(顺便一提宝箱开启方法是用岩元素攻击圆坑中地上的阵哦~)", + "x_pos": -1213.8561364518005, + "y_pos": 911.8464187233799 + }, + "260": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/4839652/de08a10c8a11aaabcd44900fc7823bcc_1708027969562824562.gif", + "备注": "神瞳在石墩上较高的位置,用岩主砸个荒星当垫脚就能够到了。(像我这样憨跳是没有结果的┭┮﹏┭┮)", + "x_pos": -1049.9299336013173, + "y_pos": 957.9007287160775 + }, + "259": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/23/4839652/7a01b229bd3110675b5da4fa1ea8277c_3563199774348189887.gif", + "备注": "在山坡顶端的树上。", + "x_pos": -1170.9994279290736, + "y_pos": 1254.0037271563615 + }, + "257": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/234e44af005d0ff1c8ff1bf90c9da952_4891759829643618237.gif", + "备注": "找完屋顶的神瞳后,从屋顶找到大树黄叶子的方位往外跳,落下去的时候调整角度就可以看到神瞳在拐角桥底下(注意控制下落速度哦~)", + "x_pos": -1122.5, + "y_pos": 1433.0037271563615 + }, + "256": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/96542d31133c0b2e71fb2a947a0e4e2a_9009663536041532691.gif", + "备注": "神瞳在客栈屋顶上,通过客栈传送点旁边的大树可爬到屋顶。", + "x_pos": -1085.5004290531947, + "y_pos": 1433.5031947054526 + }, + "255": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/fbbcbc244bfacc3a07b3515b0e6b9237_5029872380655701823.gif", + "备注": "", + "x_pos": -1693, + "y_pos": 987.5 + }, + "254": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/57a8ddf17d98291d799a0a4495ab329e_2564133905221417090.gif", + "备注": "", + "x_pos": -1791, + "y_pos": 916 + }, + "253": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/72496f97addf4d9d60f91964cfdd9625_6295784218623893117.gif", + "备注": "", + "x_pos": -1895, + "y_pos": 732 + }, + "252": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/54febda9ea1207ec7a2d5ec54d76d991_2009195493168024515.gif", + "备注": "", + "x_pos": -2051.5, + "y_pos": 889.5 + }, + "251": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/4435bb4a7089055764f50bbf9e45ab0b_8952950108931868056.gif", + "备注": "", + "x_pos": -1479.0706135681962, + "y_pos": 2222.7820462657164 + }, + "250": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/f87cc4140a63d3ce829856bd710d1180_1039695060986393236.gif", + "备注": "", + "x_pos": -1991, + "y_pos": 942 + }, + "249": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/185bd072e14fe1b68e60fa19f5d2a84c_9081089639178637983.gif", + "备注": "", + "x_pos": -1657, + "y_pos": 1167 + }, + "248": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/745fe60555ea00397a7601976a76c5e5_9018417527542931034.gif", + "备注": "", + "x_pos": -1400, + "y_pos": 1500 + }, + "247": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/9ad571f6bb3f662295ac1fdb05a26876_3120868171121670107.gif", + "备注": "", + "x_pos": -1702, + "y_pos": 1549 + }, + "246": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/19d4454a4043b5f5b54966d66f4479f8_8043083059829183162.gif", + "备注": "", + "x_pos": -1641.580773306082, + "y_pos": 2477.2780711968435 + }, + "245": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/c78cfab542b64795d474fa18f2e17b61_4504037929925149836.gif", + "备注": "在山上的位置,可以利用风元素激活机关利用风场获得,也可以从更高的山上自高而下获取。", + "x_pos": -1213.0754203259057, + "y_pos": 2543.258557222377 + }, + "244": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/139b983785817eddee3074367e57a644_4117257246987464572.gif", + "备注": "天衡山的半山腰,进入山洞后从内部爬到制高点飞下来获取。", + "x_pos": -1365.5620924977115, + "y_pos": 2843.7763848039885 + }, + "243": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/d033e656dcb40da4930160301c31642d_5582272038780795632.gif", + "备注": "在一尊石像的正前方,跳下隐藏的坑道获取。", + "x_pos": -1260.575311081412, + "y_pos": 3075.2766257172534 + }, + "241": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/e530bf5bb47e8d58ff946fd71b6d032f_270147925109447429.gif", + "备注": "", + "x_pos": -1952, + "y_pos": 1303.5 + }, + "239": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/20812d40cd8c620b5b47f436778ed1ea_3953539578528078557.gif", + "备注": "", + "x_pos": -2064, + "y_pos": 1351 + }, + "234": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/11ca281c49160a765540aa1887cba43d_5461665652443691007.gif", + "备注": "想办法解开这里的秘密,获取封印在里面的岩神瞳。", + "x_pos": -1689.0703950792094, + "y_pos": 2494.7822871789813 + }, + "233": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/85e6bfa4dd51daccecc509ba3d868d86_3226381862921063078.gif", + "备注": "", + "x_pos": -1957, + "y_pos": 1398 + }, + "231": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/f2694c1f3147eb83a8ecba3488f7308f_2340210256149830404.gif", + "备注": "", + "x_pos": -1785.0410083104869, + "y_pos": 2483.2746984111336 + }, + "230": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/af444f8474d91c89b6e7c8515fb18db8_2038267040722511085.gif", + "备注": "", + "x_pos": -2037, + "y_pos": 1592 + }, + "228": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/961cea37862271dd31b5eb62b316b776_8281991535622649793.gif", + "备注": "", + "x_pos": -1988.5528067157732, + "y_pos": 2574.2830099187768 + }, + "227": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/96d9f8f6109df03b47f7a1e7740bce62_1954288530748010308.gif", + "备注": "", + "x_pos": -1965, + "y_pos": 1591 + }, + "225": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/af976a5c1e2d292e795eea8157dc24e4_4103645056210980394.gif", + "备注": "", + "x_pos": -1889.077277482293, + "y_pos": 2667.7905986866244 + }, + "224": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/c36dfdbb8f846d61caba8694bc3e61b4_2494813006484203754.gif", + "备注": "", + "x_pos": -2058, + "y_pos": 1561 + }, + "222": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/7f8d47727966f1e5c64ad1872c55ca41_5375743215916018392.gif", + "备注": "", + "x_pos": -2174, + "y_pos": 1493 + }, + "221": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/efed9717f6360aa5d8481dccc768667c_5669949726399085061.gif", + "备注": "", + "x_pos": -2032.070832057183, + "y_pos": 2841.2774689136813 + }, + "220": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/9f36786b07cd60e2e70ef77d57a1fe4d_8252897460680296460.gif", + "备注": "", + "x_pos": -2022.0319410175352, + "y_pos": 2979.79565786519 + }, + "219": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/44732d11a05c8084cad774f6cdee5412_4766101376373994746.gif", + "备注": "", + "x_pos": -2293, + "y_pos": 1439 + }, + "218": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/699a9419c8ff90a4ea471c77b01cd6b3_3665858705999641065.gif", + "备注": "", + "x_pos": -2357, + "y_pos": 1416 + }, + "217": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/49790871e4472593a878cc3fd63a9db1_6376197462342305513.gif", + "备注": "", + "x_pos": -1628.1128911871392, + "y_pos": 2820.270241515731 + }, + "216": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/7b35a1060f7961079dcb86110911c906_4578560071566404473.gif", + "备注": "", + "x_pos": -2372, + "y_pos": 1358.5 + }, + "215": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/600715fe2ea0fe748b529fc83e70ffde_8538213771536996277.gif", + "备注": "", + "x_pos": -1840.0785884162137, + "y_pos": 2870.2760234340913 + }, + "213": { + "属性": "岩神瞳", + "gif_url": "", + "备注": "", + "x_pos": -2024, + "y_pos": 1109 + }, + "212": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/248416e4fd9905ab79bdc3006053a084_4247108571851178371.gif", + "备注": "", + "x_pos": -2017.0734539250243, + "y_pos": 3198.28987594683 + }, + "211": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/6119ac8bfba3bdd7620bf1c5b28e2c30_6827682258836613594.gif", + "备注": "", + "x_pos": -2327, + "y_pos": 1094 + }, + "209": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/53ef4e77435978678cad49deba9f0673_2206200901886480498.gif", + "备注": "", + "x_pos": -1685.0439579118083, + "y_pos": 3161.7778302835786 + }, + "206": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/1b2442005095bca2b224e7f5d2f0ac6c_8463665409900924715.gif", + "备注": "", + "x_pos": -1530.5528067157734, + "y_pos": 3164.787346357547 + }, + "205": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/42de276fdbc9d6540b9fc21b4c65162d_6646310003246211582.gif", + "备注": "", + "x_pos": -2502.5, + "y_pos": 1580.5 + }, + "204": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/835d002c876155b66b460be040a1a1cf_5488112487273325804.gif", + "备注": "半山腰的石梯旁,进入不显眼山洞中获取。", + "x_pos": -1296.0726892135708, + "y_pos": 3007.768796036141 + }, + "202": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/e3f9bce83540de4610cfa8845ac1342c_634898536492956369.gif", + "备注": "", + "x_pos": -2554.5, + "y_pos": 1657.5 + }, + "201": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/e2069f78c0bd6b99f09c776e31ebee9e_2893864038704858742.gif", + "备注": "从一个制高点飞下来获取。", + "x_pos": -1445.6428241783287, + "y_pos": 2908.2703619723634 + }, + "200": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/ef1e07cc2c38a6e4ffbc660626fb845b_1517944109194517082.gif", + "备注": "", + "x_pos": -2593, + "y_pos": 1549.5 + }, + "198": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/26/6142363/1b6fe9f1df7519671ac51063a3df85fe_4888526966067712178.gif", + "备注": "从这座遗迹的楼顶进入内部获取岩神瞳。", + "x_pos": -1386.5665715219407, + "y_pos": 2755.775662064194 + }, + "197": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/d5246e49ca57101dff7104a9bf7fa811_6906477258596576472.gif", + "备注": "", + "x_pos": -2592, + "y_pos": 1672 + }, + "196": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/26/6142363/01f9590dfa5d16bdb3d3cbded50b0d04_7683001418661662742.gif", + "备注": "必须使用「荒星」(旅行者-岩)等类似技能才能获取。", + "x_pos": -1336.544176400795, + "y_pos": 2736.2726506483814 + }, + "195": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/b51af121fb6bf592227a4944ce0a49f5_8560203252075976300.gif", + "备注": "", + "x_pos": -995, + "y_pos": 2454 + }, + "193": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/03844827f6e29a50716ce1f88e8897a8_3547450626444842851.gif", + "备注": "", + "x_pos": -817, + "y_pos": 1782 + }, + "192": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/6992c5b2183e16fee5986a4f41dcb297_7454094125350444875.gif", + "备注": "", + "x_pos": -292, + "y_pos": 1655 + }, + "189": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/db4d00e8e2ee1e3511e85c84cf5cb7ed_5276418955432135382.gif", + "备注": "在山的顶端,使用火元素触发机关后利用风场起飞。", + "x_pos": -1086.5733446805311, + "y_pos": 2503.2760234340913 + }, + "188": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/f952dd7c54745342134bf45df64367d1_7571055893715095062.gif", + "备注": "神瞳在空中,需用风属性攻击风车产生风场才能捡到(e都e歪来,别骂了别骂了", + "x_pos": -666, + "y_pos": 1579.5 + }, + "187": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/4839652/12194a5ba7a0ac8929b4a872db0eac93_3768692455753349989.gif", + "备注": "", + "x_pos": -458.5, + "y_pos": 1586.5 + }, + "186": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/61f15f1b4ef775c99937a671bff1399b_5938135536381073318.gif", + "备注": "", + "x_pos": -717, + "y_pos": 2391 + }, + "183": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/2ce76b55dcf94f66735aa116fff5c33a_8845561111445684473.gif", + "备注": "", + "x_pos": 270.5, + "y_pos": 2537 + }, + "181": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/6cf4fd5db774ac8c2664d307f771224f_7327564672374274530.gif", + "备注": "", + "x_pos": -2135, + "y_pos": 1694 + }, + "180": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/69f4a1b4c9aee51eea4ee0c869c496a1_7647815399867701538.gif", + "备注": "", + "x_pos": -2001, + "y_pos": 1676 + }, + "179": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/92b274ed6819294c6e0498ede849aab3_4183482075727968921.gif", + "备注": "", + "x_pos": -1920, + "y_pos": 1761 + }, + "178": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/bc957329c93b2a9c26cd140f35a7e620_907051812852491627.gif", + "备注": "", + "x_pos": -1828, + "y_pos": 1703 + }, + "176": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/b9eb11e485e8224f69de4c49ba150bef_7166808008913459783.gif", + "备注": "", + "x_pos": -2183, + "y_pos": 2033 + }, + "175": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/b2ef8dddfccec6abf90df453afe45112_8341540754372647063.gif", + "备注": "", + "x_pos": -1637, + "y_pos": 1676 + }, + "174": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/ba299233468314ff869aa12255589d8c_956654482019651306.gif", + "备注": "", + "x_pos": -1413, + "y_pos": 1582 + }, + "173": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/26/6142363/8df4323f56862c8752d9348b603128a7_3924467011530438781.gif", + "备注": "", + "x_pos": -968, + "y_pos": 2289 + }, + "172": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/d06f90be30288c4f974baf22b86a7072_2681671454633752228.gif", + "备注": "", + "x_pos": -320, + "y_pos": 1860.5 + }, + "171": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/497d02a38cdce1306f5eb5b9765c9f11_8688165451316173668.gif", + "备注": "", + "x_pos": -286.5, + "y_pos": 1846.5 + }, + "170": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/d14fd84d817f693171f491cc5b7ef90f_7101805020475141960.gif", + "备注": "", + "x_pos": -527.5, + "y_pos": 1756 + }, + "168": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/4839652/e79826e96e945b1d4cb2d6f0a3356b7b_683988355454225141.gif", + "备注": "对准悬崖边的的草堆方向跳然后滑翔一会,可以看到神瞳在一个突出小岩石上", + "x_pos": -471, + "y_pos": 1729 + }, + "167": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/4839652/cd6c5f04c599137ab3eeb94eeaee864f_5337502825101761146.gif", + "备注": "", + "x_pos": -767, + "y_pos": 1670.5 + }, + "166": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/c222b675bd51e6c2772b23d2fe7046f9_2636542149190493706.gif", + "备注": "", + "x_pos": 152.5, + "y_pos": 2430.5 + }, + "158": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/d5f408d35d40b5a960e807da9f071141_5277418228530076285.gif", + "备注": "", + "x_pos": -1560, + "y_pos": 1918 + }, + "157": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/87e1d8618516e8a115d5fe1d293976d4_8413870914419726597.gif", + "备注": "", + "x_pos": -1473.0634034316322, + "y_pos": 1982.2633754876779 + }, + "156": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/3b138b7dae3c73a6b5800dc264fb8abb_3184230967842273348.gif", + "备注": "", + "x_pos": -962.5, + "y_pos": 1992 + }, + "155": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/984fec5b1d954f8e9c6e764f5f1472b0_3053009522588116077.gif", + "备注": "", + "x_pos": -551.5, + "y_pos": 1960.5 + }, + "154": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/28f799532eb4adad7d78ac8678060040_2338800999151887859.gif", + "备注": "", + "x_pos": -637.5, + "y_pos": 2052.5 + }, + "153": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/880e4c2af98d5e9a5dbbad0fad564668_5803930787453812284.gif", + "备注": "", + "x_pos": -175, + "y_pos": 2462 + }, + "152": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/0cf5d32e553834600e009973ad6cb85c_6640937310525308677.gif", + "备注": "在船上较高的位置,需要使用可以垫高角色的「荒星」(旅行者-岩)技能进行辅助攀爬,以及其他类似的技能以帮助角色达到。", + "x_pos": -636.0585966739231, + "y_pos": 2970.277107543784 + }, + "151": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/6584ccefa5b7483fc1170646db63fd5d_2850961042148796944.gif", + "备注": "需消灭入口的遗迹守卫,进入地下室", + "x_pos": -955.5, + "y_pos": 2048.5 + }, + "150": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/8a9e50275412419d1fb9f15879c01637_8432328208543305954.gif", + "备注": "", + "x_pos": -885, + "y_pos": 2087 + }, + "149": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/c706c742cc0c826c8daf5f56f189afed_4468459482056504433.gif", + "备注": "", + "x_pos": -624, + "y_pos": 2300 + }, + "148": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/403b0ed9cadf15f5572e0ae573a1a912_657689235043951204.gif", + "备注": "", + "x_pos": -510.5, + "y_pos": 1480.5 + }, + "147": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/7eba1aca68204b694032138f7a0c3d02_1250081311439252867.gif", + "备注": "", + "x_pos": -1269, + "y_pos": 1559 + }, + "146": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/4f510248b47d8bfa3bbba2a0c2c974f8_6951344005046235577.gif", + "备注": "", + "x_pos": -910.8770108957115, + "y_pos": 1378.3856715726192 + }, + "145": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/19388f6a8e9cd149e18e7f94e5df93c2_2560322040730289663.gif", + "备注": "", + "x_pos": -1022.9090468675945, + "y_pos": 1504.4527603871284 + }, + "144": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/4151ab56981ef469aadef48edc6bccab_7736619160476278206.gif", + "备注": "", + "x_pos": -242, + "y_pos": 1705 + }, + "143": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/8609c25ce039413d85a5f57b82440284_7591286282868156570.gif", + "备注": "", + "x_pos": -504.5, + "y_pos": 1375.5 + }, + "142": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/37ad1be5a090dc521b6ff003b1c03ee5_3954024625757420747.gif", + "备注": "", + "x_pos": -612.8501235621661, + "y_pos": 1110.7743893326801 + }, + "141": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/dbe8166689f5a574cff2e6a4822785b7_4050422453528787652.gif", + "备注": "神瞳在一块小岩石上,你可以像我一样飞过来,潇洒地落地,也可以直接爬石头。", + "x_pos": -1394.8938931329485, + "y_pos": 965.9087154797094 + }, + "140": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/75c1c781d4e9847a519d8380992a22b2_7705519360302196642.gif", + "备注": "", + "x_pos": -1322.9004719486034, + "y_pos": 1189.8607948979175 + }, + "139": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/15a6583ab2c1e9a5126ba5002418979f_2760622410182714499.gif", + "备注": "", + "x_pos": -665, + "y_pos": 1494.5 + }, + "138": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/15363053/680b145ce53b686547b80fdaf294faa8_3934738963438389761.gif", + "备注": "", + "x_pos": -1299, + "y_pos": 1412 + }, + "137": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/24/4839652/86b45907e056e28861e981a7a8d56da7_5966454234679688902.gif", + "备注": "在空心树桩上方。", + "x_pos": -943.7963550399827, + "y_pos": 1046.8378995088387 + }, + "136": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/4839652/c54cf025500e1b5a83ba20ca3c79fdca_5319557142256667902.gif", + "备注": "", + "x_pos": -1117.788918117938, + "y_pos": 781.7303444252611 + }, + "135": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/18/76373921/5f36f03b756a30e7d62cf370ea9c0665_3915499219172823185.gif", + "备注": "", + "x_pos": -938.8734354524208, + "y_pos": 740.8806132889858 + }, + "102": { + "属性": "岩神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/25/6142363/687bd1e53491186b59d3ef36367891b5_5790248486939030006.gif", + "备注": "", + "x_pos": -1212, + "y_pos": 2046.5 + } +} \ No newline at end of file diff --git "a/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\351\243\216\347\245\236\347\236\263.json" "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\351\243\216\347\245\236\347\236\263.json" new file mode 100644 index 0000000..42d8bbd --- /dev/null +++ "b/XCW/hoshino/hoshino/modules/Genshin/seek_god_eye/\351\243\216\347\245\236\347\236\263.json" @@ -0,0 +1,457 @@ +{ + "1743": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/599becc1b8938b69ad12cf3064c19361_2841686593498054236.gif", + "备注": "", + "x_pos": -1069.5, + "y_pos": -262.5 + }, + "858": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/0e2edd0fd05bdcea0bf55f6199ca895a_5603430889581911175.gif", + "备注": "", + "x_pos": 625.0006223383425, + "y_pos": 595.5019704433498 + }, + "839": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/6ddbe1809b8f13b696937f009ae7ba31_3494102935990581234.gif", + "备注": "收集三颗风种子或者使用风元素激活风种子产生风场,利用风场收集神瞳。", + "x_pos": 637.2934871754605, + "y_pos": 795.0310176454741 + }, + "165": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/5b5f0eb24c0bb9093f839ee753e86873_5281396088957363427.gif", + "备注": "", + "x_pos": -931, + "y_pos": -404.29632719353094 + }, + "164": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/560816ff86230c4752cde8c18adc38da_2799127768479756543.gif", + "备注": "", + "x_pos": -834, + "y_pos": -537.7670703263034 + }, + "163": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/cbebf705e1212987f86022935a63d94b_2962405899946701809.gif", + "备注": "", + "x_pos": -731.5, + "y_pos": -490.1717979637931 + }, + "162": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/6a8e6f7a9e3358d9b4aadb34f10a56db_2752851540887832021.gif", + "备注": "", + "x_pos": -385.5, + "y_pos": -196.51876204291034 + }, + "161": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/142ed9e15c78f4e64bc0ed686cc12bdc_3420108624570441481.gif", + "备注": "", + "x_pos": -302, + "y_pos": -230.3330858215861 + }, + "160": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/ffa29f79aed9dab17a0fdb5b42181f87_5627909948763941450.gif", + "备注": "藏在树叶里,一定要望清楚。", + "x_pos": -308, + "y_pos": -163.2175587048414 + }, + "134": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/10534b259531987fd0b6222c4f9455f9_1915937069589438328.gif", + "备注": "", + "x_pos": 443.5, + "y_pos": -449 + }, + "133": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/9ac65d5357e06034cf30417aab5ef1d7_6067053597102730250.gif", + "备注": "在悬崖上,需要跳下去捡。", + "x_pos": 1062, + "y_pos": -629.5 + }, + "132": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/35fa153f0e5aa5c7d2f141239ebc9406_1325897500051831636.gif", + "备注": "", + "x_pos": 209, + "y_pos": 394 + }, + "131": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/66c955e54c0c4dbac55c47dd818ba9a7_9114948938439204761.gif", + "备注": "使用风元素激活风种子产生风场,利用风场收集神瞳。", + "x_pos": 102, + "y_pos": 391 + }, + "130": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/d3f671518f8f785b5091ebe6243ca800_4538580540662507879.gif", + "备注": "", + "x_pos": 286.05730802390826, + "y_pos": 555.5060495334828 + }, + "129": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/e2433140fa8cde64cd44b5e90f185118_3061927369379320315.gif", + "备注": "", + "x_pos": 362.50382763372636, + "y_pos": 590.0141716833114 + }, + "128": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/7133b878a1b60055d6b018b7ec9708ec_6197320491016987686.gif", + "备注": "在悬崖边下面,建议飞下去", + "x_pos": -319, + "y_pos": 131 + }, + "127": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/8b3277d9187169d76a9b4f5037dce401_6706491041681976451.gif", + "备注": "藏在悬崖下面。", + "x_pos": -203, + "y_pos": 330 + }, + "126": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/6b36162fdcf659955f1b29b7f50dad7f_6994973593330281318.gif", + "备注": "需要正确顺序收集种子开启风场", + "x_pos": -308.5, + "y_pos": -7.908486158744836 + }, + "124": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/9283ebe824b4d41ecf85b0e6253bac77_538202390249227488.gif", + "备注": "", + "x_pos": -1132.5, + "y_pos": -229.69130254194488 + }, + "123": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/58ea498a2df8d3a929e63bba0ae695f3_7991661368514890561.gif", + "备注": "", + "x_pos": -881, + "y_pos": -330.70330535926905 + }, + "122": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/779e8789320a4af99f7c4d7f79ed7890_6517193530064431571.gif", + "备注": "", + "x_pos": -933.5, + "y_pos": -361.7273109939172 + }, + "121": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/fdfec3d2a6be7ed82c88f949bd6366a1_522173916302655695.gif", + "备注": "藏在树里。", + "x_pos": -242, + "y_pos": 65.87846383375177 + }, + "120": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/ca4f5085aa3f38d9d1181ecbf3cdee8b_4641106841585232557.gif", + "备注": "", + "x_pos": 814, + "y_pos": 79.5 + }, + "117": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/8e3cbbfe0de89a3e00697e1a21f28071_4175826072546034072.gif", + "备注": "", + "x_pos": 1023, + "y_pos": -17.5 + }, + "115": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/be1a0d2b6fb990157c55eca3e825662a_7866939288638921788.gif", + "备注": "", + "x_pos": 511.22063137116857, + "y_pos": 437.94524316855086 + }, + "114": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/b5017e7de9953b1c87324665999d35bf_4145393686446844445.gif", + "备注": "", + "x_pos": 478.6085467210878, + "y_pos": 494.4307550093972 + }, + "113": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/51daf4cdb9200f3c319d3b24dc88b56b_3742468746138299880.gif", + "备注": "", + "x_pos": 603.1671509809876, + "y_pos": 463.4204376839393 + }, + "112": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/dabde510570eb7ce9320e227cd8095c8_8421697441205627271.gif", + "备注": "", + "x_pos": 516.5, + "y_pos": 13 + }, + "99": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/992f2108d9b19472a8d368b7babbe5ae_4168731665053840805.gif", + "备注": "收集三颗风种子或者使用风元素激活风种子产生风场,利用风场收集神瞳", + "x_pos": 376.50186701502844, + "y_pos": 640.4980295566502 + }, + "95": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/5d8f5d605beeeced438e4f682b976163_3987533745357986584.gif", + "备注": "", + "x_pos": 438.6482567114026, + "y_pos": 755.9138521570512 + }, + "93": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/ec8d9c4d73227a91a3dd4742147e7485_4353719059385670811.gif", + "备注": "", + "x_pos": 852.5012446766859, + "y_pos": 845.5004926108377 + }, + "91": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/9fd6847f719940ee503a0819bd312ee1_5406786667169067497.gif", + "备注": "收集该神瞳需要解锁剑冢的三层封印,详情请参考世界任务——探索剑冢封印", + "x_pos": 821.9993776616575, + "y_pos": 948.9985221674879 + }, + "90": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/48a384d24c8f435e651aaaf1b9e273d8_6518040070865002555.gif", + "备注": "神瞳在悬崖下方", + "x_pos": 1172.2702688590616, + "y_pos": 830.5409528259893 + }, + "89": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/357bf357786845db042159bc781515ac_7427367320019615865.gif", + "备注": "", + "x_pos": 840.5, + "y_pos": -484 + }, + "88": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/486908479267a050e5fcb8e8acea3692_466608666518060779.gif", + "备注": "", + "x_pos": 892, + "y_pos": -181 + }, + "87": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/8dcefeb7c777e6ca711ba53d5fb55d9e_976993417096589983.gif", + "备注": "", + "x_pos": 519.7085379916562, + "y_pos": 349.49801271936576 + }, + "86": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/c92ec8dff3ee18d1a731feb300c174ab_5604801784480104215.gif", + "备注": "", + "x_pos": 361.0947739370349, + "y_pos": 400.93123061017695 + }, + "85": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/59563dfb7d697abbcfc1835f1e7c102b_7821659766969342499.gif", + "备注": "", + "x_pos": -20, + "y_pos": 244 + }, + "84": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/c247034a91b6d7d9289ccb2f2e12116f_8875494114136382303.gif", + "备注": "收集三个种子开启风场并且解锁风碑开启加速环即可√", + "x_pos": -306, + "y_pos": 707 + }, + "83": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/29/21665168/901d3fb29e69377455d130156570bdd5_8637882940862091530.gif", + "备注": "难点在于如何想办法爬到卢老爷房顶上...荒星的一百种用法(", + "x_pos": -338.5, + "y_pos": 561 + }, + "82": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/f3433d8d8031ffa147a681998df79d7a_5218887315681682261.gif", + "备注": "只要爬上去就能拿到了。", + "x_pos": -283, + "y_pos": 238 + }, + "81": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/07ea7a4da5d8bbbf0d3c557c02d1147e_3176842945635427509.gif", + "备注": "", + "x_pos": -1006, + "y_pos": -142.8653433931447 + }, + "80": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/e7060f05d871461a75a95b60ba721e7d_2089841828398520281.gif", + "备注": "找准位置利用风场和加速圈轻松获取。", + "x_pos": -266, + "y_pos": -317.2550675089792 + }, + "79": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/71866e7ad6e5a05b23fd60428f85cd10_7823192415336553234.gif", + "备注": "", + "x_pos": -373, + "y_pos": -323.65154320955844 + }, + "78": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/39f430abbe7752eada6dc15def179673_4999401363991100229.gif", + "备注": "依旧藏在石头后面。", + "x_pos": -365.5, + "y_pos": -372.799327897862 + }, + "77": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/0abed4019490b4d62ee8c9ab95081e62_1473567454678905132.gif", + "备注": "在悬崖下面的柱子里面。", + "x_pos": -718, + "y_pos": -603.5033757923725 + }, + "76": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/bbfc98b30998c376635f2a650e932a5c_2878748680097205899.gif", + "备注": "", + "x_pos": -1051, + "y_pos": -550.8450886389103 + }, + "75": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/f3b1c42035332aece6c2d8e0fc52ac8c_4590034539054074685.gif", + "备注": "藏在蜿蜒曲折的缝隙里", + "x_pos": -988, + "y_pos": -383.715308176593 + }, + "74": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/b741824da2cc7f48ac03aeb0b162932f_716139821476978575.gif", + "备注": "藏在岩石后面打碎就可以了。ps:用大剑更快", + "x_pos": -436.5, + "y_pos": -56.40435254944828 + }, + "73": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/40dcfa29e6a95032669980ddf431f429_3066257973500691506.gif", + "备注": "", + "x_pos": -680.5, + "y_pos": 3.9137221096414123 + }, + "72": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/0a8113bc80edfb9df12d6c52af5adc72_8276835375016036277.gif", + "备注": "需要上我们的凯亚帮忙造一下冰面。", + "x_pos": -468, + "y_pos": 661 + }, + "71": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/fea71fe3a9a065ea04a8b3dedb98fbc3_344345432348298655.gif", + "备注": "", + "x_pos": 944.6556222741219, + "y_pos": 985.8949736466393 + }, + "70": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/7daea163f3a01639e2e174205b601d41_1009418490777707416.gif", + "备注": "", + "x_pos": 707, + "y_pos": 1110 + }, + "68": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/eae317417f4f8f41f5e0761154dff2c3_1051702848344068202.gif", + "备注": "", + "x_pos": 676.7465709616163, + "y_pos": 691.9680729950956 + }, + "67": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/c11468205f7e8f2683b6786fd5374e4d_6411278277336054186.gif", + "备注": "", + "x_pos": 652.6421721161123, + "y_pos": 317.02097672776245 + }, + "66": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/19/76373921/953d887f091578a372338dd52b17864c_8645806874444553189.gif", + "备注": "", + "x_pos": 516, + "y_pos": 256.5 + }, + "65": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/0e562f909aac898137df61b1edaab709_4557505565462303841.gif", + "备注": "开启风场就可以飞上去 了~", + "x_pos": -59, + "y_pos": 471 + }, + "64": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/0a6d434b69945b3164024d33b78bdde0_5832839350587041734.gif", + "备注": "虽然风瞳在最上面但是要到最下面激活风碑飞上去。", + "x_pos": -559, + "y_pos": -332.7168085287585 + }, + "63": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/49de0265432412ea9d39c0f7cc2fa5c1_2206156493334154654.gif", + "备注": "", + "x_pos": -771.5, + "y_pos": 124.5 + }, + "62": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/c85777858ff14bf01e2561609ee8093f_23517194600674915.gif", + "备注": "就在草丛中间√", + "x_pos": -559, + "y_pos": -125.34358828674476 + }, + "61": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/f1ff4286ba10bf3de8bfdfc667118ddf_6175207438281676259.gif", + "备注": "激活风系尖碑开启风场获取,也可以顺便把相邻下方的风神瞳一并获取。", + "x_pos": -74.5, + "y_pos": -340 + }, + "60": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/22/21665168/9299ae1982dc3cc9a1086b2c11086184_8578846124513791350.gif", + "备注": "", + "x_pos": -23.5, + "y_pos": -243.5 + }, + "59": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/10/14/76373921/e1c8e427dec9c27113767a97789f2c5d_4665036776404972414.gif", + "备注": "", + "x_pos": 356, + "y_pos": -585.5 + }, + "58": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/452d016e62949afc1c717c35eb7bf170_7767005666218883453.gif", + "备注": "", + "x_pos": 1438, + "y_pos": -334 + }, + "56": { + "属性": "风神瞳", + "gif_url": "https://uploadstatic.mihoyo.com/ys-obc/2020/09/21/76373921/cbd63e9fbb00160b045dafc424c1657f_1299454333660281584.gif", + "备注": "", + "x_pos": 1922.0018670150284, + "y_pos": 683.9995073891628 + } +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/README.md b/XCW/hoshino/hoshino/modules/hoshino_training/README.md new file mode 100644 index 0000000..f5e6a7d --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/README.md @@ -0,0 +1,58 @@ +# hoshino_training + +Hoshino调教助手 + +这是一个满足个人奇怪需求的HoshinoBot插件, 作用是在不破坏星乃??的前提下让星乃的??变成主人的形状.(?????) + +说人话: 在不对hoshino文件进行任何修改的情况下, 使用反射特性热替换相关函数, 实现对hoshino某些功能的定制. + +本项目地址 https://github.com/zyujs/hoshino_training + +## 结构说明 + +`functions` 目录为模块存放目录, 插件会自动加载该目录下全部.py文件, 您可以根据需要参考预置模块格式自行编写模块并放置在该目录下. `util` 文件夹内文件为针对各种接口的反射工具, 可在模块中使用. + +## 预置模块介绍 + +- `functions/util.py` 移除抽卡禁言 + + 移除来一井抽卡后的禁言 + +- `functions/query.py` rank图快捷修改 + + 将最新rank图以 `rXX-X-服务器.png` 格式放入 `HoshinoBot\res\img\priconne\quick`文件夹中, 不需要重启hoshino, rank系列命令即可输出最新rank图. + +- `functions/comic.py` comic模块下载功能增强 + + 可以为comic模块的检查更新和漫画下载设置超时时间和代理, 避免满屏幕的comic.py报错刷屏, 详见 `functions/comic.py` 内注释. + +- `functions/anti-holo.py` anti-holo模块增强 + + 可以自定义删除容易误伤的触发词, 可以随机发送多个舔狗图. + 请将自行收集的嘲讽vtb舔狗图片放置于 `res/img/anti-holo` 目录, 插件将随机选择图片发送. 如果该文件夹不存在, 插件会尝试发送anti-holo原图片 `res/img/hahaha_vtb_tiangou.jpg`. 如果找不到图片, 插件将发送文字: "vtb舔狗,爬!". + +- `functions/chara.py` 角色&卡池自动更新 + + 本模块将在每次hoshino启动时以及每天下午2-3点间某个随机时间自动更新角色数据和卡池数据, 无需任何操作. 请注意本模块会和 [pcrbot/gacha](https://github.com/pcrbot/gacha) 卡池自动更新项目冲突, 如果已安装 `gacha` 项目, 请删除本模块(`functions/chara.py`)避免冲突. + + 卡池数据来源: + + 角色数据来源: + + 本模块部分代码参考了 项目, 感谢作者 [@var-mixer](https://github.com/var-mixer). + +- `functions/news.py` 禁用新闻更新 + + 禁用bili_news_poller,sonet_news_poller服务的检查更新任务, 如果已安装各种新闻或rss插件(如[rss](https://github.com/zyujs/rss)), 可以启动该模块阻止HoshinoBot内置新闻模块检查更新以避免无意义的log刷屏. + + 该模块默认禁用, 如需启用, 请将 `news.py.disable` 复制一份并改名为 `news.py`. + +## 安装方法 + +1. 在HoshinoBot的插件目录modules下clone本项目 `git clone https://github.com/zyujs/hoshino_training.git` +1. 在 `config/__bot__.py`的模块列表里加入 `hoshino_training` +1. 重启HoshinoBot + +## 许可 + +本插件以AGPL-v3协议开源 diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/anti-holo.py b/XCW/hoshino/hoshino/modules/hoshino_training/functions/anti-holo.py new file mode 100644 index 0000000..00a3e90 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/anti-holo.py @@ -0,0 +1,49 @@ +# HoshinoBot\hoshino\modules\groupmaster\anti_holo.py +import os +import random +from datetime import timedelta +from hoshino import Service, priv, util, R, HoshinoBot +from hoshino.typing import CQEvent + +from hoshino.modules.hoshino_training.util.module import * +from hoshino.modules.hoshino_training.util.keyword import * + +#从HoshinoBot\hoshino\modules\groupmaster\anti_holo.py的SB_HOLO触发词中删除指定词语 +WHITE_LIST = ''' +可可 +凑阿库娅 湊あくあ Minato Aqua 阿库娅 洋葱 阿夸 夸哥 夸神 海王 山田赫敏 大亏哥 桐谷夸人 +'''.split() + +def get_origin_tiangou_pic(): + res = R.img('hahaha_vtb_tiangou.jpg') + if os.path.exists(res.path): + return res + else: + return None + +def get_tiangou_pic(): + path = f'anti-holo' + res = R.img(path) + if not os.path.exists(res.path): + return get_origin_tiangou_pic() + fnlist = os.listdir(res.path) + if len(fnlist) == 0: + return get_origin_tiangou_pic() + fn = random.choice(fnlist) + path = f'anti-holo/' + fn + return R.img(path) + + +async def anti_holo(bot: HoshinoBot, ev: CQEvent): + priv.set_block_user(ev.user_id, timedelta(minutes=5)) + await util.silence(ev, 5 * 60, skip_su=False) + pic = get_tiangou_pic() + if pic: + await bot.send(ev, pic.cqcode) + else: + await bot.send(ev, 'vtb舔狗,爬!') + await bot.delete_msg(self_id=ev.self_id, message_id=ev.message_id) + +SB_HOLO = module_get('hoshino.modules.groupmaster.anti_holo', 'SB_HOLO') +keyword_replace(SB_HOLO, anti_holo) +keyword_remove(WHITE_LIST) diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/chara.py b/XCW/hoshino/hoshino/modules/hoshino_training/functions/chara.py new file mode 100644 index 0000000..9af5582 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/chara.py @@ -0,0 +1,207 @@ +import os +import re +import json +import hoshino +import nonebot +import aiohttp +import random +import traceback +import csv +from ast import literal_eval + +from hoshino.modules.hoshino_training.util.module import * + +from hoshino.modules.priconne.chara import Roster, Chara +from hoshino.modules.priconne.gacha.gacha import Gacha + +#可以在此加入自定义角色 +#需要将头像命名为 icon_unit_[四位数ID]31.png 放置到 res\img\priconne\unit 目录 +CUSTOM_CHARA = { + 3322: ['陈睿', 'チン エイ', '叔叔', '睿总', '二次元教父'], +} + +startup_job = None + +data = { + 'chara': {}, + 'gacha': {}, +} + +pool_name = { + 'BL': {'BL', 'bl', 'Bl', 'bL', 'CN', 'cn'}, + 'TW': {'TW', 'tw', 'so-net', 'sonet'}, + 'JP': {'JP', 'jp'}, + 'MIX': {'MIX', 'mix', 'Mix', 'All', 'all', 'ALL'} +} + +jp = re.compile(r'[\u3040-\u309F\u30A0-\u30FF]') + +#查角色 +class NewRoster(Roster): + + def __init__(self): + super(NewRoster, self).__init__() + self.update() + + def update(self): + super(NewRoster, self).update() + if 'chara' in data: + for idx, names in data['chara'].items(): + for name in names: + name = hoshino.util.normalize_str(name) + if name not in self._roster: + self._roster[name] = idx + self._all_name_list = self._roster.keys() + +#角色信息 +class NewChara(Chara): + + def __init__(self, id_, star=0, equip=0): + super(NewChara, self).__init__(id_, star, equip) + + @property + def name(self): + name = super(NewChara, self).name + if name == '未知角色' and self.id in data['chara']: + name = data['chara'][self.id][0] + if jp.search(name) and len(data['chara'][self.id]) > 1: + name = data['chara'][self.id][1] + return name + +#抽卡 +class NewGacha(Gacha): + + def __init__(self, pool_name:str = "MIX"): + super(NewGacha, self).__init__(pool_name) + + def load_pool(self, pool_name:str): + super(NewGacha, self).load_pool(pool_name) + if 'gacha' in data and 'chara' in data and pool_name in data['gacha']: + pool = data['gacha'][pool_name] + self.up_prob = pool["up_prob"] + self.s3_prob = pool["s3_prob"] + self.s2_prob = pool["s2_prob"] + self.s1_prob = 1000 - self.s2_prob - self.s3_prob + self.up = pool["up"] + self.star3 = pool["star3"] + self.star2 = pool["star2"] + self.star1 = pool["star1"] + +async def query_data(url, is_json = False): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as resp: + if is_json: + data = await resp.json() + else: + data = await resp.text() + except: + traceback.print_exc() + return None + return data + +def save_data(): + path = os.path.join(os.path.dirname(__file__), 'chara.json') + try: + with open(path, 'w', encoding='utf8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + except: + traceback.print_exc() + +def load_data(): + path = os.path.join(os.path.dirname(__file__), 'chara.json') + if not os.path.exists(path): + return + try: + with open(path, encoding='utf8') as f: + d = json.load(f) + if 'gacha' in d: + data['gacha'] = d['gacha'] + if 'chara' in d: + data['chara'] = {} + for k, v in d['chara'].items(): + data['chara'][int(k)] = v + except: + traceback.print_exc() + +def ids_to_names(id_list): + name_list = [] + for id_ in id_list: + chara = NewChara(id_) + name_list.append(chara.name) + return name_list + +async def update_data(): + + #pcrbot/pcr-nickname + csv_data = await query_data('https://raw.fastgit.org/pcrbot/pcr-nickname/master/nicknames.csv') + if csv_data: + reader = csv.reader(csv_data.strip().split('\n')) + for row in reader: + if row[0].isdigit(): + row[1], row[2] = row[2], row[1] + data['chara'][int(row[0])] = row[1:] + + #unitdata.py + chara_data = await query_data('https://api.redive.lolikon.icu/gacha/unitdata.py') + if chara_data: + chara_data = chara_data.replace('CHARA_NAME = ', '') + try: + chara_data = literal_eval(chara_data) + except: + chara_data = {} + for k, v in chara_data.items(): + if k in data['chara']: + for sv in v: + if sv not in data['chara'][k]: + data['chara'][k].append(sv) + else: + data['chara'][k] = v + + #加入自定义角色 + for k, v in CUSTOM_CHARA.items(): + if k not in data['chara']: + data['chara'][k] = v + + #update roster + new_roster.update() + + #抽卡 + gacha_data = await query_data('https://api.redive.lolikon.icu/gacha/default_gacha.json', True) + if chara_data: + for k, v in gacha_data.items(): + if 'up' in v: + v['up'] = ids_to_names(v['up']) + if 'star1' in v: + v['star1'] = ids_to_names(v['star1']) + if 'star2' in v: + v['star2'] = ids_to_names(v['star2']) + if 'star3' in v: + v['star3'] = ids_to_names(v['star3']) + if k in pool_name['JP']: + data['gacha']['JP'] = v + elif k in pool_name['TW']: + data['gacha']['TW'] = v + elif k in pool_name['BL']: + data['gacha']['BL'] = v + #ALL池不使用 + + save_data() + +async def check_pool_update(): + global startup_job + if startup_job: + startup_job.remove() + startup_job = None + await update_data() + +load_data() + +new_roster = NewRoster() + +module_replace('hoshino.modules.priconne.chara', 'roster', new_roster) +module_replace('hoshino.modules.priconne.chara', 'Chara', NewChara) +module_replace('hoshino.modules.priconne.gacha', 'Gacha', NewGacha) + +startup_job = nonebot.scheduler.add_job(check_pool_update, 'interval', seconds=5) +nonebot.scheduler.add_job(check_pool_update, 'interval', hours=4) diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/comic.py b/XCW/hoshino/hoshino/modules/hoshino_training/functions/comic.py new file mode 100644 index 0000000..6d1611a --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/comic.py @@ -0,0 +1,45 @@ +import nonebot +from hoshino import aiorequests +from hoshino.modules.hoshino_training.util.module import * +from hoshino.modules.hoshino_training.util.scheduler import * + +#超时时间 +timeout = 120 + +#代理, 必须使用http代理, 不使用请留空 +proxy = '' +#proxy = 'http://172.17.0.1:1081' + +proxies={ + 'http': proxy, + 'https': proxy, +} + +update_seeker = None + +async def get(url, params=None, **kwargs): + return None + +class NewAaiorequests: + def __init__(self): + pass + + async def get(self, url, params=None, **kwargs): + kwargs['timeout'] = timeout + return await aiorequests.get(url, proxies=proxies, params=params, **kwargs) + +async def new_update_seeker(): + global update_seeker + if update_seeker: + try: + await update_seeker() + except: + pass + +new_aiorequests = NewAaiorequests() +module_replace('hoshino.modules.priconne.comic', 'aiorequests', new_aiorequests) + +update_seeker = module_get('hoshino.modules.priconne.comic', 'update_seeker') +if update_seeker: + scheduler_remove('hoshino.modules.priconne.comic:update_seeker') + nonebot.scheduler.add_job(new_update_seeker, 'interval', minutes=5) \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/news.py.disable b/XCW/hoshino/hoshino/modules/hoshino_training/functions/news.py.disable new file mode 100644 index 0000000..650c4d6 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/news.py.disable @@ -0,0 +1,4 @@ +from hoshino.modules.hoshino_training.util.scheduler import * + +scheduler_remove('hoshino.modules.priconne.news:bili_news_poller') +scheduler_remove('hoshino.modules.priconne.news:sonet_news_poller') \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/query.py b/XCW/hoshino/hoshino/modules/hoshino_training/functions/query.py new file mode 100644 index 0000000..38ecc31 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/query.py @@ -0,0 +1,86 @@ +# hoshino\modules\priconne\query\query.py +# 从priconne/quick读取rxx-xx-server.png文件名rank图并发送 +from hoshino import util, R +import os +import re +from hoshino.modules.hoshino_training.util.rex import * + +def get_rank_pic(server='cn'): + path = f'priconne/quick' + res = R.img(path) + if not os.path.exists(res.path): + return None + fnlist = os.listdir(res.path) + rank_list = [] + maxn = 0 + for fn in fnlist: + if fn[0] != 'r' and fn[0] != 'R': + continue + args = re.split(r'\.|-', fn[1:]) + if len(args) < 4 or args[2] != server or not args[0].isdigit() or not args[1].isdigit(): + continue + n = int(args[0]) * 10 + int(args[1]) + if n > maxn: + maxn = n + rank_list = [fn] + elif n == maxn: + rank_list.append(fn) + rank_list.sort() + return rank_list + +async def rank_sheet(bot, ev): + match = ev['match'] + is_jp = match.group(2) == '日' + is_tw = match.group(2) == '台' + is_cn = match.group(2) and match.group(2) in '国陆b' + if not is_jp and not is_tw and not is_cn: + await bot.send(ev, '\n请问您要查询哪个服务器的rank表?\n*日rank表\n*台rank表\n*陆rank表', at_sender=True) + return + msg = [ + '\n※表格仅供参考,升r有风险,强化需谨慎\n※一切以会长要求为准——', + ] + if is_jp: + flist = get_rank_pic('jp') + if len(flist) == 0: + await bot.send(ev, '无数据', at_sender=True) + return + args = re.split(r'\.|-', flist[0]) + msg.append(f'※不定期搬运自图中Q群\n※广告为原作者推广,与本bot无关\n{args[0]}-{args[1]} rank表:') + pos = match.group(3) + if not pos or '前' in pos: + p = R.img('priconne/quick/' + flist[0]).cqcode + msg.append(str(p)) + if len(flist) >= 2 and not pos or '中' in pos: + p = R.img('priconne/quick/' + flist[1]).cqcode + msg.append(str(p)) + if len(flist) >= 3 and not pos or '后' in pos: + p = R.img('priconne/quick/' + flist[2]).cqcode + msg.append(str(p)) + await bot.send(ev, '\n'.join(msg), at_sender=True) + await util.silence(ev, 60) + elif is_tw: + flist = get_rank_pic('tw') + if len(flist) == 0: + await bot.send(ev, '无数据', at_sender=True) + return + args = re.split(r'\.|-', flist[0]) + msg.append(f'※不定期搬运自漪夢奈特\n※油管频道有介绍视频及原文档\n{args[0]}-{args[1]} rank表:') + for fn in flist: + p = R.img('priconne/quick/' + fn).cqcode + msg.append(f'{p}') + await bot.send(ev, '\n'.join(msg), at_sender=True) + await util.silence(ev, 60) + elif is_cn: + flist = get_rank_pic('cn') + if len(flist) == 0: + await bot.send(ev, '无数据', at_sender=True) + return + args = re.split(r'\.|-', flist[0]) + msg.append(f'※不定期搬运自NGA\n{args[0]}-{args[1]} rank表:') + for fn in flist: + p = R.img('priconne/quick/' + fn).cqcode + msg.append(f'{p}') + await bot.send(ev, '\n'.join(msg), at_sender=True) + await util.silence(ev, 60) + +rex_replace(r'^(\*?([日台国陆b])服?([前中后]*)卫?)?rank(表|推荐|指南)?$', rank_sheet) \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/functions/util.py b/XCW/hoshino/hoshino/modules/hoshino_training/functions/util.py new file mode 100644 index 0000000..ccc44fc --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/functions/util.py @@ -0,0 +1,7 @@ +# hoshino\util\__init__.py +from hoshino.modules.hoshino_training.util.module import * + +async def silence(ev, ban_time, skip_su=True): + pass + +module_replace('hoshino.modules.priconne.gacha', 'silence', silence) diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/training.py b/XCW/hoshino/hoshino/modules/hoshino_training/training.py new file mode 100644 index 0000000..0b967e1 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/training.py @@ -0,0 +1,29 @@ +import nonebot +import os +import importlib +import traceback + +def get_functions_list(): + fnlist = [] + path = os.path.join(os.path.dirname(__file__), 'functions') + if not os.path.exists(path): + return fnlist + for fn in os.listdir(path): + s = fn.split('.') + if len(s) >=2 and s[-1] == 'py': + fnlist.append(s[0]) + return fnlist + +def load_functions(flist): + for name in flist: + try: + importlib.import_module('hoshino.modules.hoshino_training.functions.' + name) + print('[hoshino_training] load module', name, 'successed') + except: + print('[hoshino_training] load module', name, 'failed') + traceback.print_exc() + +@nonebot.on_startup +async def startup(): + flist = get_functions_list() + load_functions(flist) diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/util/keyword.py b/XCW/hoshino/hoshino/modules/hoshino_training/util/keyword.py new file mode 100644 index 0000000..e6f6e26 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/util/keyword.py @@ -0,0 +1,38 @@ +import hoshino + +def keyword_replace(keyword_list, func): + keywords = set() + for keyword in keyword_list: + keyword = hoshino.util.normalize_str(keyword) + keywords.add(keyword) + rex = hoshino.trigger.keyword + for k in list(rex.allkw.keys()): + if k in keywords: + rex.allkw[k].func = func + +def keyword_remove(keyword_list): + keywords = set() + for keyword in keyword_list: + keyword = hoshino.util.normalize_str(keyword) + keywords.add(keyword) + rex = hoshino.trigger.keyword + for k in list(rex.allkw.keys()): + if k in keywords: + rex.allkw.pop(k) + +def keyword_get_servicefunc(keyword_list): + keywords = set() + for keyword in keyword_list: + keyword = hoshino.util.normalize_str(keyword) + keywords.add(keyword) + rex = hoshino.trigger.keyword + for k in list(rex.allkw.keys()): + if k in keywords: + return rex.allkw[k] #返回第一个找到的函数 + return None + +def keyword_get_func(keyword_list): + sf = keyword_get_servicefunc(keyword_list) + if sf: + return sf.func + return None \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/util/module.py b/XCW/hoshino/hoshino/modules/hoshino_training/util/module.py new file mode 100644 index 0000000..c2d0d26 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/util/module.py @@ -0,0 +1,28 @@ +import nonebot +import hoshino + +def _get_module(module): + plugins = nonebot.get_loaded_plugins() + for plugin in plugins: + m = str(plugin.module) + m = m.replace('\\', '/').replace('//', '/') + if module in m: + return plugin.module + return None + +def module_replace(module_path, member_name, func): + module = _get_module(module_path) + if not module: + return False + if not hasattr(module, member_name): + return False + setattr(module, member_name, func) + return True + +def module_get(module_path, member_name): + module = _get_module(module_path) + if not module: + return None + if not hasattr(module, member_name): + return None + return getattr(module, member_name) diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/util/rex.py b/XCW/hoshino/hoshino/modules/hoshino_training/util/rex.py new file mode 100644 index 0000000..4eba72e --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/util/rex.py @@ -0,0 +1,9 @@ +import hoshino + +def rex_replace(rex_pattern, func): + rex = hoshino.trigger.rex + for k in list(rex.allrex.keys()): + if rex_pattern in k.pattern: + rex.allrex[k].func = func + return True + return False diff --git a/XCW/hoshino/hoshino/modules/hoshino_training/util/scheduler.py b/XCW/hoshino/hoshino/modules/hoshino_training/util/scheduler.py new file mode 100644 index 0000000..57d2d87 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/hoshino_training/util/scheduler.py @@ -0,0 +1,39 @@ +import nonebot +import hoshino +from functools import wraps + +def seheduler_func(func): + @wraps(func) + async def wrapper(): + try: + hoshino.logger.info(f'[hoshino_training] Scheduled job {func.__name__} start.') + ret = await func() + hoshino.logger.info(f'[hoshino_training] Scheduled job {func.__name__} completed.') + return ret + except Exception as e: + hoshino.logger.error(f'[hoshino_training] {type(e)} occured when doing scheduled job {func.__name__}.') + hoshino.logger.exception(e) + return wrapper + +def scheduler_replace(func_ref, func): + jobs = nonebot.scheduler.get_jobs() + for job in jobs: + if job.func_ref == func_ref: + job.func = func + return True + return False + +def scheduler_remove(func_ref): + jobs = nonebot.scheduler.get_jobs() + for job in jobs: + if job.func_ref == func_ref: + job.remove() + return True + return False + +def scheduler_get_ref_list(): + ref_list = [] + jobs = nonebot.scheduler.get_jobs() + for job in jobs: + ref_list.append(job.func_ref) + return ref_list diff --git a/XCW/hoshino/hoshino/modules/setu_mix/README.md b/XCW/hoshino/hoshino/modules/setu_mix/README.md new file mode 100644 index 0000000..2af1774 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/README.md @@ -0,0 +1,50 @@ +# setu_mix + +基于HoshinoBot v2的涩图插件, 从 [acg-gov.com](https://acg-gov.com) 和 [lolicon.app](https://lolicon.app/) 获取图片. + +本项目地址 https://github.com/zyujs/setu_mix + +## 注意事项 + +本插件图片存放位置为 `RES_DIR/setu_mix` , 使用前请保证HoshinoBot的 `RES_DIR` 已经正确配置. + +刚开始使用插件时本地仓库为空, 会导致无法发送随机图片, 可以在安装配置完毕后使用 `setu fetch` 命令手动抓取一批图片. + +## 安装方法 + +1. 在HoshinoBot的插件目录modules下clone本项目 `git clone https://github.com/zyujs/setu_mix.git` +1. 将本插件目录下的配置文件模板 `config.template.json` 复制为 `config.json` , 修改该配置文件设置自己的apikey和其他选项, 除apikey以外都可保持默认值. +1. 在 `config/__bot__.py`的模块列表里加入 `setu_mix` +1. 重启HoshinoBot + +## 配置说明 + +- `apikey` : apikey, 必填. +- `mode` : 模块模式, 0=关闭, 1=在线(不使用本地仓库), 2=在线(使用本地仓库), 3=离线(仅使用本地仓库), 默认模式为2. + +## 指令说明 + +- `涩图` : 随机获取1张图片 +- `来n张涩图` : 随机获取n张图片 +- `搜涩图 keyword` : 搜索指定关键字的图片 +- `搜n张涩图 keyword` : 搜索n张指定关键字的图片 +- `本日涩图排行榜 [page]` : 获取p站排行榜 +- `看涩图 [n]` : 获取p站排行榜指定排名的图片 +- `看涩图 start end` : 获取p站排行榜排名从start到end的全部图片 + +注:排行榜相关功能需要开启acggov模块 + +### 以下指令仅限超级用户使用 + +- `setu set 模块 设置值 [群号]` : 修改本群或指定群的设置, 以下为设置项 - 取值 - 说明: + - `acggov` : `on / off` 是否开启acggov模块 + - `lolicon` : `on / off` 是否开启lolicon模块 + - `lolicon_r18` : `on / off` 是否开启lolicon_r18模块 + - `withdraw` : `n` 发出的图片在n秒后撤回,设置为0表示不撤回 +- `setu get [群号]` : 查看本群或指定群的模块开启状态 +- `setu fetch` : 手动从api拉取一批图片存入本地仓库(插件每半小时会自动拉取一次) +- `setu warehouse` : 查询本地仓库图片数量 + +## 开源 + +本插件以AGPL-v3协议开源 diff --git a/XCW/hoshino/hoshino/modules/setu_mix/__init__.py b/XCW/hoshino/hoshino/modules/setu_mix/__init__.py new file mode 100644 index 0000000..1477291 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/__init__.py @@ -0,0 +1,226 @@ +import hoshino +import asyncio +from .base import * +from .config import get_config, get_group_config, set_group_config + +HELP_MSG = '''色图/来n张色图 : 随机获取1张/n张色图 +搜[n张]色图 keyword : 搜索指定关键字的色图,附带数量可以获取多张 +本日涩图排行榜 [page] : 获取p站排行榜(需开启acggov模块) +看涩图 [n] 或 [start end] : 获取p站排行榜指定序号色图(需开启acggov模块)''' +sv = hoshino.Service('setu_mix', bundle='pcr娱乐', help_=HELP_MSG) + +#设置limiter +tlmt = hoshino.util.DailyNumberLimiter(get_config('base', 'daily_max')) +flmt = hoshino.util.FreqLimiter(get_config('base', 'freq_limit')) + +def check_lmt(uid, num): + if uid in hoshino.config.SUPERUSERS: + return 0, '' + if not tlmt.check(uid): + return 1, f"您今天已经冲过{get_config('base', 'daily_max')}次了,请明天再来!" + if num > 1 and (get_config('base', 'daily_max') - tlmt.get_num(uid)) < num: + return 1, f"您今天的剩余次数为{get_config('base', 'daily_max') - tlmt.get_num(uid)}次,已不足{num}次,请节制!" + if not flmt.check(uid): + return 1, f'您冲的太快了,请等待{round(flmt.left_time(uid))}秒!' + #tlmt.increase(uid,num) + flmt.start_cd(uid) + return 0, '' + +@sv.on_prefix('setu') +async def send_setu(bot, ev): + uid = ev['user_id'] + gid = ev['group_id'] + is_su = hoshino.priv.check_priv(ev, hoshino.priv.SUPERUSER) + args = ev.message.extract_plain_text().split() + + msg = '' + if not is_su: + msg = '需要超级用户权限' + elif len(args) == 0: + msg = 'invalid parameter' + elif args[0] == 'set' and len(args) >= 3: #setu set module on [group] + if len(args) >= 4 and args[3].isdigit(): + gid = int(args[3]) + key = None + value = False + if args[1] == 'lolicon': + key = 'lolicon' + elif args[1] == 'lolicon_r18': + key = 'lolicon_r18' + elif args[1] == 'acggov': + key = 'acggov' + elif args[1] == 'withdraw': + key = 'withdraw' + if args[2] == 'on' or args[2] == 'true': + value = True + elif args[2] == 'off' or args[2] == 'false': + value = False + elif args[2].isdigit(): + value = int(args[2]) + if key: + set_group_config(gid, key, value) + msg = f'{gid} : {key} = {value}' + else: + msg = 'invalid parameter' + elif args[0] == 'get': + if len(args) >= 2 and args[1].isdigit(): + gid = int(args[1]) + msg = f'group {gid} :' + msg += f'\nwithdraw : {get_group_config(gid, "withdraw")}' + msg += f'\nlolicon : {get_group_config(gid, "lolicon")}' + msg += f'\nlolicon_r18 : {get_group_config(gid, "lolicon_r18")}' + msg += f'\nacggov : {get_group_config(gid, "acggov")}' + elif args[0] == 'fetch': + await bot.send(ev, 'start fetch mission') + await fetch_process() + msg = 'fetch mission complete' + elif args[0] == 'warehouse': + msg = 'warehouse:' + state = check_path() + for k, v in state.items(): + msg += f'\n{k} : {v}' + else: + msg = 'invalid parameter' + await bot.send(ev, msg) + +@sv.on_rex(r'^不够[涩瑟色]|^[涩瑟色]图|^来一?[点份张].*[涩瑟色]图|^再来[点份张]|^来?(\d*)?[份点张]?[涩色瑟]图') +async def send_random_setu(bot, ev): + num = 1 + match = ev['match'] + try: + num = int(match.group(1)) + except: + pass + uid = ev['user_id'] + gid = ev['group_id'] + result, msg = check_lmt(uid, num) + if result != 0: + await bot.send(ev, msg) + return + + result_list = [] + for _ in range(num): + msg = await get_setu(gid) + if msg == None: + await bot.send(ev, '无可用模块') + return + try: + result_list.append(await bot.send(ev, msg)) + except: + print('图片发送失败') + await asyncio.sleep(1) + + tlmt.increase(uid, len(result_list)) + + second = get_group_config(gid, "withdraw") + if second and second > 0: + await asyncio.sleep(second) + for result in result_list: + try: + await bot.delete_msg(self_id=ev['self_id'], message_id=result['message_id']) + except: + print('撤回失败') + await asyncio.sleep(1) + +@sv.on_rex(r'^搜[索]*(\d*)[份张]*(.*?)[涩瑟色]图(.*)') +async def send_search_setu(bot, ev): + uid = ev['user_id'] + gid = ev['group_id'] + + keyword = ev['match'].group(2) or ev['match'].group(3) + if not keyword: + await bot.send(ev, '需要提供关键字') + return + keyword = keyword.strip() + num = ev['match'].group(1) + if num: + num = int(num.strip()) + else: + num = 1 + result, msg = check_lmt(uid, num) + if result != 0: + await bot.send(ev, msg) + return + + await bot.send(ev, '正在搜索...') + msg_list = await search_setu(gid, keyword, num) + if len(msg_list) == 0: + await bot.send(ev, '无结果') + result_list = [] + for msg in msg_list: + try: + result_list.append(await bot.send(ev, msg)) + except: + print('图片发送失败') + await asyncio.sleep(1) + tlmt.increase(uid, len(result_list)) + second = get_group_config(gid, "withdraw") + if second and second > 0: + await asyncio.sleep(second) + for result in result_list: + try: + await bot.delete_msg(self_id=ev['self_id'], message_id=result['message_id']) + except: + print('撤回失败') + await asyncio.sleep(1) + +@sv.on_rex(r'^[本每]日[涩色瑟]图排行榜\D*(\d*)') +async def send_ranking(bot, ev): + gid = ev['group_id'] + page = ev['match'].group(1) + if page and page.isdigit(): + page = int(page) + page -= 1 + else: + page = 0 + if page < 0: + page = 0 + msg = await get_ranking(gid, page) + if msg == None: + msg = '模块未启用' + await bot.send(ev, msg) + +@sv.on_prefix(('看涩图', '看色图', '看瑟图')) +async def send_ranking_setu(bot, ev): + uid = ev['user_id'] + gid = ev['group_id'] + start = 0 + end = 0 + args = ev.message.extract_plain_text().split() + if len(args) > 0 and args[0].isdigit(): + start = int(args[0]) + start -= 1 + if start < 0: + start = 0 + end = start + 1 + if len(args) > 1 and args[1].isdigit(): + end = int(args[1]) + result, msg = check_lmt(uid, end - start) + if result != 0: + await bot.send(ev, msg) + return + result_list = [] + for i in range(start, end): + msg = await get_ranking_setu(gid, i) + if msg == None: + await bot.send(ev, '模块未启用') + return + try: + result_list.append(await bot.send(ev, msg)) + except: + print('图片发送失败') + await asyncio.sleep(1) + tlmt.increase(uid, len(result_list)) + second = get_group_config(gid, "withdraw") + if second and second > 0: + await asyncio.sleep(second) + for result in result_list: + try: + await bot.delete_msg(self_id=ev['self_id'], message_id=result['message_id']) + except: + print('撤回失败') + await asyncio.sleep(1) + +@sv.scheduled_job('interval', minutes=30) +async def job(): + await fetch_process() diff --git a/XCW/hoshino/hoshino/modules/setu_mix/acggov.py b/XCW/hoshino/hoshino/modules/setu_mix/acggov.py new file mode 100644 index 0000000..54d3911 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/acggov.py @@ -0,0 +1,450 @@ +import datetime +import random +import string +import aiohttp +import asyncio +import traceback +import sys +import io +import base64 +import json +import os +from hoshino import R +from PIL import Image +from .config import get_config +from hoshino import config + +if sys.platform == 'win32': + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + +ranking_list = {} + +ranking_date = None + +acggov_headers = { + 'token': config.acggov_api, + 'referer': 'https://www.acg-gov.com/' + } + +native_info = {} + +def load_native_info(sub_dir): + info = {} + path = f'setu_mix/' + sub_dir + res = R.img(path) + if not os.path.exists(res.path): + return info + fnlist = os.listdir(res.path) + + for fn in fnlist: + s = fn.split('.') + if len(s) != 2 or s[1] != 'json' or not s[0].isdigit(): + continue + uid = int(s[0]) + try: + with open(res.path + '/' + fn, encoding='utf8') as f: + d = json.load(f) + d['tags'].append(d['title']) + d['tags'].append(d['author']) + info[uid] = ','.join(d['tags']) + except: + pass + print('read', len(info), 'setu from', sub_dir) + return info + +def generate_image_struct(): + return { + 'id': 0, + 'url': '', + 'title': '', + 'author': '', + 'tags': [], + 'data': None, + 'native': False, + } + +#读取排行榜 +async def query_ranking(date: str, page: int) -> dict: + if date not in ranking_list: + ranking_list[date] = {} + if page in ranking_list[date]: + return ranking_list[date][page] + url = f'https://api.acg-gov.com/public/ranking' + params = { + 'ranking_type': 'illust', + 'mode': get_config('acggov', 'ranking_mode'), + 'date': date, + 'per_page': get_config('acggov', 'per_page'), + 'page': page+1, + } + data = {} + try: + async with aiohttp.ClientSession(headers=acggov_headers) as session: + async with session.get(url, params=params, proxy=get_config('acggov', 'acggov_proxy')) as resp: + data = await resp.json(content_type='application/json') + ranking_list[date][page] = data + except: + traceback.print_exc() + return data + +#获取随机色图 +async def query_setu(): + data = {} + image = generate_image_struct() + try: + async with aiohttp.ClientSession(headers=acggov_headers) as session: + async with session.get('https://api.acg-gov.com/public/setu', proxy=get_config('acggov', 'acggov_proxy')) as resp: + data = await resp.json(content_type='application/json') + except Exception: + traceback.print_exc() + image['title'] = '无法访问api' + return image + if 'data' not in data: + image['title'] = 'api返回数据无效' + return image + data = data['data'] + + image['id'] = data['illust'] + image['title'] = data['title'] + image['author'] = data['user']['name'] + for tag in data['tags']: + image['tags'].append(tag['name']) + if get_config('acggov', 'use_thumb'): + image['url'] = data['large'] + else: + num = random.randint(0, int(data['pageCount'])-1) + image['url'] = data['originals'][num]['url'] + return image + +#获取搜索结果 +async def query_search(keyword): + data = {} + image_list = [] + image = generate_image_struct() + url = f'https://api.acg-gov.com/public/search' + params = { + 'q': keyword, + 'offset': 0, + } + try: + async with aiohttp.ClientSession(headers=acggov_headers) as session: + async with session.get(url, params=params, proxy=get_config('acggov', 'acggov_proxy')) as resp: + data = await resp.json(content_type='application/json') + except Exception: + traceback.print_exc() + image['title'] = '无法访问api' + return image_list + if 'illusts' not in data: + image['title'] = 'api返回数据无效' + return image_list + + for item in data['illusts']: + image = generate_image_struct() + image['id'] = item['id'] + image['title'] = item['title'] + image['author'] = item['user']['name'] + for tag in item['tags']: + image['tags'].append(tag['name']) + try: + if get_config('acggov', 'use_thumb'): + image['url'] = item['image_urls']['large'] + else: + if item['page_count'] == 1: + image['url'] = item['meta_single_page']['original_image_url'] + else: + num = random.randint(0, item['page_count']-1) + image['url'] = item['meta_pages'][num]['image_urls']['original'] + except: + pass + if image['url']: + image_list.append(image) + print('搜索结果数量', len(data['illusts'])) + return image_list + + + +#获取排行榜图片 +async def query_ranking_setu(number: int) -> (int, str): + image = generate_image_struct() + + page = number // get_config('acggov', 'per_page') + number = number % get_config('acggov', 'per_page') + date = (datetime.datetime.now() + datetime.timedelta(days=-2)).strftime("%Y-%m-%d") + data = await query_ranking(date, page) + if not 'response' in data: + image['title'] = '排行榜数据获取失败' + return image + + illust = data['response'][0]['works'][number]['work']['id'] + image['title'] = data['response'][0]['works'][number]['work']['title'] + image['author'] = data['response'][0]['works'][number]['work']['user']['name'] + for tag in data['response'][0]['works'][number]['work']['tags']: + image['tags'].append(tag) + + if get_config('acggov', 'use_thumb'): + image['url'] = data['response'][0]['works'][number]['work']['image_urls']['large'] + else: + data = {} + url = 'https://api.acg-gov.com/illusts/detail' + params = { + 'illustId': illust, + 'reduction': 'true', + } + try: + async with aiohttp.ClientSession(headers=acggov_headers) as session: + async with session.get(url, params=params, proxy=get_config('acggov', 'acggov_proxy')) as resp: + data = await resp.json(content_type='application/json') + except Exception as _: + traceback.print_exc() + image['title'] = 'detail获取失败' + return image + if 'data' not in data: + image['title'] = 'detail数据异常' + return image + data = data['data'] + page_count = data['illust']['page_count'] + if page_count == 1: + image['url'] = data['illust']['meta_single_page']['original_image_url'] + else: + meta_pages = data['illust']['meta_pages'] + num = random.randint(0, len(meta_pages)-1) + image['url'] = meta_pages[num]['image_urls']['original'] + + image['id'] = illust + return image + +async def download_acggov_image(url: str): + print('acggov downloading image', url) + try: + async with aiohttp.ClientSession(headers=acggov_headers) as session: + async with session.get(url, proxy=get_config('acggov', 'acggov_proxy')) as resp: + data = await resp.read() + #转jpg + byte_stream = io.BytesIO(data) + roiImg = Image.open(byte_stream) + if roiImg.mode != 'RGB': + roiImg = roiImg.convert('RGB') + imgByteArr = io.BytesIO() + roiImg.save(imgByteArr, format='JPEG') + return imgByteArr.getvalue() + except : + print('download image failed') + #traceback.print_exc() + return None + +async def download_pixiv_image(url: str, id): + print('acggov downloading pixiv image', url) + headers = { + 'referer': f'https://www.pixiv.net/member_illust.php?mode=medium&illust_id={id}' + } + try: + async with aiohttp.ClientSession(headers=headers) as session: + async with session.get(url, proxy=get_config('acggov', 'pixiv_proxy')) as resp: + data = await resp.read() + #转jpg + byte_stream = io.BytesIO(data) + roiImg = Image.open(byte_stream) + if roiImg.mode != 'RGB': + roiImg = roiImg.convert('RGB') + imgByteArr = io.BytesIO() + roiImg.save(imgByteArr, format='JPEG') + return imgByteArr.getvalue() + except : + print('download image failed') + #traceback.print_exc() + return None + +def save_image(image, mode='acggov'): + path = f'setu_mix/{mode}/{image["id"]}' + + res = R.img(path + '.jpg') + with open(res.path, 'wb') as f: + f.write(image['data']) + + res = R.img(path + '.json') + info = { + 'title': image['title'], + 'author': image['author'], + 'url': image['url'], + 'tags': image['tags'], + } + with open(res.path, 'w', encoding='utf8') as f: + json.dump(info, f, ensure_ascii=False, indent=2) + +async def get_setu_online(): + image = await query_setu() + #检查本地是否存在该图片 + path = f'setu_mix/acggov/{image["id"]}.jpg' + res = R.img(path) + if os.path.exists(res.path): + with open(res.path, 'rb') as f: + image['data'] = f.read() + image['native'] = True + else: + image['data'] = await download_acggov_image(image['url']) + image['native'] = False + if not image['data']: + image['id'] = 0 + image['title'] = '图片下载失败' + return image + if get_config('acggov', 'mode') == 2: + save_image(image) + return image + +def get_setu_native(uid = 0): + image = generate_image_struct() + + path = f'setu_mix/acggov' + res = R.img(path) + if not os.path.exists(res.path): + return image + + if uid == 0: + fn = random.choice(os.listdir(res.path)) + if fn.split('.')[0].isdigit(): + uid = int(fn.split('.')[0]) + + if not uid: + return image + + image['id'] = int(uid) + image['native'] = True + + path = f'setu_mix/acggov/{uid}' + res = R.img(path) + try: + with open(res.path + '.jpg', 'rb') as f: + image['data'] = f.read() + with open(res.path + '.json', encoding='utf8') as f: + d = json.load(f) + for k,v in d.items(): + image[k] = v + except: + pass + + return image + +async def search_setu_online(keyword, num): + image_list = await query_search(keyword) + valid_list = [] + while len(image_list) > 0: + image = image_list.pop(random.randint(0, len(image_list) - 1)) + #检查本地是否存在该图片 + path = f'setu_mix/acggov/{image["id"]}.jpg' + res = R.img(path) + if os.path.exists(res.path): + with open(res.path, 'rb') as f: + image['data'] = f.read() + image['native'] = True + else: + url = image['url'] + if get_config('acggov', 'pixiv_direct'): + image['data'] = await download_pixiv_image(url, image['id']) + else: + url = url.replace("https://i.pximg.net", "https://i.pixiv.cat") + image['data'] = await download_acggov_image(url) + image['native'] = False + if image['data']: + if get_config('acggov', 'mode') == 2: + save_image(image) + if image['data']: + valid_list.append(image) + if len(valid_list) >= num: + break + return valid_list + +def search_setu_native(keyword, num): + image = generate_image_struct() + result_list = [] + for k, v in native_info.items(): + if v.find(keyword) >= 0: + result_list.append(k) + + if len(result_list) > num: + result_list = random.sample(result_list, num) + image_list = [] + for result in result_list: + image = get_setu_native(result) + if image['data']: + image_list.append(image) + return image_list + +async def acggov_get_setu(): + if get_config('acggov', 'mode') >= 2: + return get_setu_native() + elif get_config('acggov', 'mode') == 1: + return await get_setu_online() + else: + return None + +async def acggov_search_setu(keyword, num): + if get_config('acggov', 'mode') == 1 or get_config('acggov', 'mode') == 2: + return await search_setu_online(keyword, num) + elif get_config('acggov', 'mode') == 3: + return search_setu_native(keyword, num) + else: + return None + +#获取排行榜 +async def acggov_get_ranking(page: int = 0) -> (int, str): + date = (datetime.datetime.now() + datetime.timedelta(days=-2)).strftime("%Y-%m-%d") + data = await query_ranking(date, page) + if not 'response' in data: + return '数据获取失败' + works = data['response'][0]['works'] + pages = data['pagination']['pages'] + current = data['pagination']['current'] + num = page * get_config('acggov', 'per_page') + 1 + msg = '' + for i in works: + msg += f'{num}.' + i['work']['title'] + '-' + str(i['work']['id']) + '\n' + num += 1 + msg += f'第{current}页,共{str(pages)}页' + return msg + +#获取排行榜图片 +async def acggov_get_ranking_setu(number: int) -> (int, str): + image = await query_ranking_setu(number) + + path = f'setu_mix/acggov/{image["id"]}.jpg' + res = R.img(path) + if os.path.exists(res.path): + with open(res.path, 'rb') as f: + image['data'] = f.read() + image['native'] = True + else: + url = image['url'] + if get_config('acggov', 'pixiv_direct'): + image['data'] = await download_pixiv_image(url, image['id']) + else: + url = url.replace("https://i.pximg.net", "https://i.pixiv.cat") + image['data'] = await download_acggov_image(url) + image['native'] = False + if not image['data']: + image['id'] = 0 + image['title'] = '图片下载失败' + elif get_config('acggov', 'mode') == 2: + save_image(image) + + return image + + +async def acggov_fetch_process(): + global ranking_date + if get_config('acggov', 'mode') == 2: + print('fetch acggov setu') + for _ in range(10): + await get_setu_online() + + date = (datetime.datetime.now() + datetime.timedelta(days=-2)).strftime("%Y-%m-%d") + if date != ranking_date: + print('fetch acggov ranking setu') + for i in range(25): + await acggov_get_ranking_setu(i) + ranking_date = date + + +def acggov_init(): + global native_info + if get_config('acggov', 'mode') == 3: + native_info = load_native_info('acggov') diff --git a/XCW/hoshino/hoshino/modules/setu_mix/base.py b/XCW/hoshino/hoshino/modules/setu_mix/base.py new file mode 100644 index 0000000..9a125fe --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/base.py @@ -0,0 +1,119 @@ +import os +import json +import traceback +import asyncio +import aiohttp +import random +import string +import base64 +from hoshino import R +from .config import get_config, get_group_config +from .acggov import acggov_init, acggov_fetch_process, acggov_get_setu, acggov_search_setu, acggov_get_ranking_setu, acggov_get_ranking +from .lolicon import lolicon_init, lolicon_get_setu,lolicon_fetch_process, lolicon_search_setu + + +def check_path(): + state = {} + sub_dirs = ['acggov', 'lolicon', 'lolicon_r18'] + for item in sub_dirs: + res = R.img('setu_mix/' + item) + if not os.path.exists(res.path): + os.makedirs(res.path) + state[item] = len(os.listdir(res.path)) // 2 + return state +check_path() + +def add_salt(data): + salt = ''.join(random.sample(string.ascii_letters + string.digits, 6)) + return data + bytes(salt, encoding="utf8") + +def format_setu_msg(image): + base64_str = f"base64://{base64.b64encode(add_salt(image['data'])).decode()}" + msg = f'id:{image["id"]}\ntitle:{image["title"]}\nauthor:{image["author"]}\n[CQ:image,file={base64_str}]' + return msg + +async def get_setu(group_id): + source_list = [] + if get_group_config(group_id, 'lolicon'): + source_list.append(1) + if get_group_config(group_id, 'lolicon_r18'): + source_list.append(2) + if get_group_config(group_id, 'acggov'): + source_list.append(3) + source = 0 + if len(source_list) > 0: + source = random.choice(source_list) + + image = None + if source == 1: + image = await lolicon_get_setu(0) + elif source == 2: + image = await lolicon_get_setu(1) + elif source == 3: + image = await acggov_get_setu() + else: + return None + if not image: + return '获取失败' + elif image['id'] != 0: + return format_setu_msg(image) + else: + return image['title'] + +async def search_setu(group_id, keyword, num): + source_list = [] + if get_group_config(group_id, 'lolicon') and get_group_config(group_id, 'lolicon_r18'): + source_list.append(2) + elif get_group_config(group_id, 'lolicon'): + source_list.append(0) + elif get_group_config(group_id, 'lolicon_r18'): + source_list.append(1) + if get_group_config(group_id, 'acggov'): + source_list.append(3) + + if len(source_list) == 0: + return None + + image_list = None + msg_list = [] + while len(source_list) > 0 and len(msg_list) == 0: + source = source_list.pop(random.randint(0, len(source_list) - 1)) + if source == 0: + image_list = await lolicon_search_setu(keyword, 0, num) + elif source == 1: + image_list = await lolicon_search_setu(keyword, 1, num) + elif source == 2: + image_list = await lolicon_search_setu(keyword, 2, num) + elif source == 3: + image_list = await acggov_search_setu(keyword, num) + if image_list and len(image_list) > 0: + for image in image_list: + msg_list.append(format_setu_msg(image)) + return msg_list + +async def get_ranking(group_id, page: int = 0): + if not get_group_config(group_id, 'acggov'): + return None + return await acggov_get_ranking(page) + + +async def get_ranking_setu(group_id, number: int) -> (int, str): + if not get_group_config(group_id, 'acggov'): + return None + image = await acggov_get_ranking_setu(number) + if not image: + return '获取失败' + elif image['id'] != 0: + return format_setu_msg(image) + else: + return image['title'] + +async def fetch_process(): + tasks = [] + tasks.append(asyncio.ensure_future(acggov_fetch_process())) + tasks.append(asyncio.ensure_future(lolicon_fetch_process())) + for task in asyncio.as_completed(tasks): + await task + +acggov_init() +lolicon_init() \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/setu_mix/config.json b/XCW/hoshino/hoshino/modules/setu_mix/config.json new file mode 100644 index 0000000..bbec59f --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/config.json @@ -0,0 +1,30 @@ +{ + "base": { + "daily_max": 30, + "freq_limit": 10 + }, + "default": { + "withdraw": 30, + "lolicon": true, + "lolicon_r18": true, + "acggov": true + }, + "lolicon": { + "mode": 2, + "apikey": "836544635f16c6106d1c69", + "r18": true, + "use_thumb": false, + "pixiv_direct": false, + "pixiv_proxy": "" + }, + "acggov": { + "mode": 2, + "apikey": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJrZWtlbHVvMSIsInV1aWQiOiIwNTA1ZGRmM2EyY2U0ZThjYjlhNWI3NTMwNmI3NjJjMyIsImlhdCI6MTYwMTAzMzcyNSwiYWNjb3VudCI6IntcImVtYWlsXCI6XCJzYW5zaGFuZGV4aWFvd3VAcXEuY29tXCIsXCJnZW5kZXJcIjotMSxcImhhc1Byb25cIjowLFwiaWRcIjoyMzUsXCJwYXNzV29yZFwiOlwiYzkzMDMwYjJlMTA4M2RjMTAxZWRlN2Y4MWI3NDM4MDdcIixcInN0YXR1c1wiOjAsXCJ1c2VyTmFtZVwiOlwia2VrZWx1bzFcIn0iLCJqdGkiOiIyMzUifQ.5M_CIr802OPwdA_Kqn2yzqvluvSNO0gLbrDqjF0zo8w", + "ranking_mode": "daily", + "use_thumb": false, + "per_page": 25, + "pixiv_direct": false, + "pixiv_proxy": "", + "acggov_proxy": "" + } +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/setu_mix/config.py b/XCW/hoshino/hoshino/modules/setu_mix/config.py new file mode 100644 index 0000000..a74013c --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/config.py @@ -0,0 +1,102 @@ +import os +import json +import traceback + +config = { + "base": { + "daily_max": 10, + "freq_limit": 10, + }, + "default": { + "withdraw" : 0, + "lolicon": True, + "lolicon_r18": False, + "acggov": False, + }, + "lolicon": { + "mode": 1, + "apikey": "", + "r18": True, + "use_thumb": True, + "pixiv_direct": False, + "pixiv_proxy": "", + }, + "acggov": { + # 0禁用 1无缓存 2有缓存在线 3有缓存离线 + "mode": 1, + "apikey": "", + "ranking_mode": "daily", + "per_page": 25, + "use_thumb": True, + "pixiv_direct": False, + "acggov_proxy": "", + "pixiv_proxy": "", + } +} + +# 源 0 关闭 1 lolicon 2 acggov 3 组合 +# lolicon_r18 0 非18 1 纯r18 2 混合 +group_config = {} + +def get_config(key, sub_key): + if key in config and sub_key in config[key]: + return config[key][sub_key] + return None + +def load_config(): + path = os.path.join(os.path.dirname(__file__), 'config.json') + if not os.path.exists(path): + return + try: + with open(path, encoding='utf8') as f: + d = json.load(f) + if 'base' in d: + for k, v in d['base'].items(): + config['base'][k] = v + if 'acggov' in d: + for k, v in d['acggov'].items(): + config['acggov'][k] = v + if 'lolicon' in d: + for k, v in d['lolicon'].items(): + config['lolicon'][k] = v + except: + traceback.print_exc() +load_config() + +def load_group_config(): + path = os.path.join(os.path.dirname(__file__), 'group_config.json') + if not os.path.exists(path): + return + try: + with open(path, encoding='utf8') as f: + d = json.load(f) + for k,v in d.items(): + group_config[k] = v + except: + traceback.print_exc() +load_group_config() + +def get_group_config(group_id, key): + group_id = str(group_id) + if group_id not in group_config: + group_config[group_id] = {} + for k, v in config['default'].items(): + group_config[group_id][k] = v + if key in group_config[group_id]: + return group_config[group_id][key] + else: + return None + +def set_group_config(group_id, key, value): + group_id = str(group_id) + if group_id not in group_config: + group_config[group_id] = {} + for k, v in config['default'].items(): + group_config[group_id][k] = v + group_config[group_id][key] = value + path = os.path.join(os.path.dirname(__file__), 'group_config.json') + try: + with open(path, 'w', encoding='utf8') as f: + json.dump(group_config, f, ensure_ascii=False, indent=2) + except: + traceback.print_exc() \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/setu_mix/config.template.json b/XCW/hoshino/hoshino/modules/setu_mix/config.template.json new file mode 100644 index 0000000..7d82021 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/config.template.json @@ -0,0 +1,30 @@ +{ + "base": { + "daily_max": 10, + "freq_limit": 10 + }, + "default": { + "withdraw": 0, + "lolicon": true, + "lolicon_r18": false, + "acggov": false + }, + "lolicon": { + "mode": 2, + "apikey": "", + "r18": true, + "use_thumb": false, + "pixiv_direct": false, + "pixiv_proxy": "" + }, + "acggov": { + "mode": 2, + "apikey": "", + "ranking_mode": "daily", + "use_thumb": false, + "per_page": 25, + "pixiv_direct": false, + "pixiv_proxy": "", + "acggov_proxy": "" + } +} \ No newline at end of file diff --git a/XCW/hoshino/hoshino/modules/setu_mix/lolicon.py b/XCW/hoshino/hoshino/modules/setu_mix/lolicon.py new file mode 100644 index 0000000..5fbe4e7 --- /dev/null +++ b/XCW/hoshino/hoshino/modules/setu_mix/lolicon.py @@ -0,0 +1,311 @@ +import os +import json +import traceback +import aiohttp +import io +import random +import datetime +from PIL import Image +from hoshino import R, config +from .config import get_config + +quota_limit_time = datetime.datetime.now() + +def generate_image_struct(): + return { + 'id': 0, + 'url': '', + 'title': '', + 'author': '', + 'tags': [], + 'r18': False, + 'data': None, + 'native': False, + } + +native_info = {} +native_r18_info = {} + +def load_native_info(sub_dir): + info = {} + path = f'setu_mix/' + sub_dir + res = R.img(path) + if not os.path.exists(res.path): + return info + fnlist = os.listdir(res.path) + + for fn in fnlist: + s = fn.split('.') + if len(s) != 2 or s[1] != 'json' or not s[0].isdigit(): + continue + uid = int(s[0]) + try: + with open(res.path + '/' + fn, encoding='utf8') as f: + d = json.load(f) + d['tags'].append(d['title']) + d['tags'].append(d['author']) + info[uid] = ','.join(d['tags']) + except: + pass + print('read', len(info), 'setu from', sub_dir) + return info + +#获取随机色图 +async def query_setu(r18 = 0, keyword=None): + global quota_limit_time + image_list = [] + if datetime.datetime.now() < quota_limit_time: + return image_list + + data = {} + url = 'https://api.lolicon.app/setu' + params = { + 'apikey': config.lolicon_api, + 'r18': r18, + 'num': 10, + } + if keyword: + params['keyword'] = keyword + if get_config('lolicon', 'use_thumb'): + params['size1200'] = 'true' + if get_config('lolicon', 'pixiv_direct'): + params['proxy'] = 'disable' + + try: + async with aiohttp.ClientSession() as session: + async with session.get(url, params=params) as resp: + data = await resp.json(content_type='application/json') + except Exception: + traceback.print_exc() + return image_list + if 'code' not in data: + return image_list + if data['code'] != 0: + print('lolicon api error code:', data['code'], ',msg:', data['msg']) + if data['code'] == 429: + print('lolicon api 已到达本日调用额度上限') + quota_limit_time = datetime.datetime.now() + datetime.timedelta(seconds=data['quota_min_ttl']) + return image_list + for item in data['data']: + image = generate_image_struct() + image['id'] = item['pid'] + image['title'] = item['title'] + image['url'] = item['url'] + image['tags'] = item['tags'] + image['r18'] = item['r18'] + image['author'] = item['author'] + image_list.append(image) + return image_list + +async def download_image(url: str): + print('lolicon downloading image', url) + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as resp: + data = await resp.read() + #转jpg + byte_stream = io.BytesIO(data) + roiImg = Image.open(byte_stream) + if roiImg.mode != 'RGB': + roiImg = roiImg.convert('RGB') + imgByteArr = io.BytesIO() + roiImg.save(imgByteArr, format='JPEG') + return imgByteArr.getvalue() + except : + print('download image failed') + #traceback.print_exc() + return None + +async def download_pixiv_image(url: str, id): + print('lolicon downloading pixiv image', url) + headers = { + 'referer': f'https://www.pixiv.net/member_illust.php?mode=medium&illust_id={id}' + } + try: + async with aiohttp.ClientSession(headers=headers) as session: + async with session.get(url, proxy=get_config('lolicon', 'pixiv_proxy')) as resp: + data = await resp.read() + #转jpg + byte_stream = io.BytesIO(data) + roiImg = Image.open(byte_stream) + if roiImg.mode != 'RGB': + roiImg = roiImg.convert('RGB') + imgByteArr = io.BytesIO() + roiImg.save(imgByteArr, format='JPEG') + return imgByteArr.getvalue() + except : + print('download image failed') + #traceback.print_exc() + return None + +def save_image(image): + path = f'setu_mix/lolicon/{image["id"]}' + if image['r18']: + path = f'setu_mix/lolicon_r18/{image["id"]}' + + res = R.img(path + '.jpg') + with open(res.path, 'wb') as f: + f.write(image['data']) + + res = R.img(path + '.json') + info = { + 'title': image['title'], + 'author': image['author'], + 'url': image['url'], + 'tags': image['tags'], + } + with open(res.path, 'w', encoding='utf8') as f: + json.dump(info, f, ensure_ascii=False, indent=2) + +async def get_setu_online(num, r18 = 0, keyword = None): + image_list = await query_setu(r18 = r18, keyword = keyword) + valid_list = [] + + while len(image_list) > 0: + image = image_list.pop(random.randint(0, len(image_list) - 1)) + #检查本地是否存在该图片 + path = f'setu_mix/lolicon/{image["id"]}.jpg' + if image['r18']: + path = f'setu_mix/lolicon_r18/{image["id"]}' + res = R.img(path) + if os.path.exists(res.path): + with open(res.path, 'rb') as f: + image['data'] = f.read() + image['native'] = True + else: + if get_config('lolicon', 'pixiv_direct'): + image['data'] = await download_pixiv_image(image['url'], image['id']) + else: + image['data'] = await download_image(image['url']) + image['native'] = False + if image['data'] and get_config('lolicon', 'mode') == 2: + save_image(image) + if image['data']: + valid_list.append(image) + if len(valid_list) >= num: + break + return valid_list + +def get_setu_native(r18 = 0, uid = 0): + image = generate_image_struct() + + path = f'setu_mix/lolicon' + if r18 == 1: + path = f'setu_mix/lolicon_r18' + elif r18 == 2: + if random.randint(1, 100) > 50: + path = f'setu_mix/lolicon_r18' + res = R.img(path) + if not os.path.exists(res.path): + return image + + if uid == 0: + fn = random.choice(os.listdir(res.path)) + if fn.split('.')[0].isdigit(): + uid = int(fn.split('.')[0]) + + if not uid: + return image + + image['id'] = int(uid) + image['native'] = True + + path += f'/{uid}' + res = R.img(path) + try: + with open(res.path + '.jpg', 'rb') as f: + image['data'] = f.read() + with open(res.path + '.json', encoding='utf8') as f: + d = json.load(f) + if 'title' in d: + image['title'] = d['title'] + if 'author' in d: + image['author'] = d['author'] + except: + pass + + return image + +def search_setu_native(keyword, r18, num): + result_list = [] + if r18 == 0 or r18 == 2: + for k, v in native_info.items(): + if v.find(keyword) >= 0: + result_list.append({ + 'uid': k, + 'r18': 0, + }) + if r18 == 1 or r18 == 2: + for k, v in native_r18_info.items(): + if v.find(keyword) >= 0: + result_list.append({ + 'uid': k, + 'r18': 1, + }) + if len(result_list) > num: + result_list = random.sample(result_list, num) + image_list = [] + for result in result_list: + image = get_setu_native(result['r18'], result['uid']) + if image['data']: + image_list.append(image) + return image_list + +# r18: 0 正常 1 r18 2 混合 +async def lolicon_get_setu(r18): + if get_config('lolicon', 'mode') >= 2: + return get_setu_native(r18) + elif get_config('lolicon', 'mode') == 1: + image_list = await get_setu_online(1, r18) + if len(image_list) > 0: + return image_list[0] + else: + return None + else: + return None + +# r18: 0 正常 1 r18 2 混合 +async def lolicon_search_setu(keyword, r18, num): + if get_config('lolicon', 'mode') == 1 or get_config('lolicon', 'mode') == 2: + return await get_setu_online(num, r18, keyword) + elif get_config('lolicon', 'mode') == 3: #离线模式 + return search_setu_native(keyword, r18, num) + else: + return None + +async def lolicon_fetch_process(): + if get_config('lolicon', 'mode') == 2: + print('fetch lolicon setu') + await get_setu_online(10, 0) + if get_config('lolicon', 'r18'): + print('fetch lolicon r18 setu') + await get_setu_online(10, 1) + +def lolicon_init(): + global native_info + global native_r18_info + if get_config('lolicon', 'mode') == 3: + native_info = load_native_info('lolicon') + native_r18_info = load_native_info('lolicon_r18') + +''' +class Lolicon: + + def __init__(self): + pass + + async def get_setu(self): + pass + + async def search_setu(self): + pass + + async def get_ranking(self): + pass + + async def get_ranking_setu(self): + pass + + async def fetch_process(self): + await lolicon_fetch_process() +''' \ No newline at end of file