mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-08 05:10:01 +08:00
refactor code
This commit is contained in:
@@ -1,96 +1,92 @@
|
||||
from nonebot import on_command, on_regex
|
||||
from nonebot.rule import to_me
|
||||
from .query_resource import get_resource_map_mes, get_resource_list_mes, up_label_and_point_list
|
||||
from .query_resource import get_resource_type_list, query_resource, init
|
||||
from utils.utils import get_message_text, scheduler
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent, Message
|
||||
from nonebot.typing import T_State
|
||||
import os
|
||||
from services.log import logger
|
||||
import re
|
||||
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
|
||||
__plugin_name__ = '原神资源查询'
|
||||
__plugin_name__ = "原神资源查询"
|
||||
|
||||
__plugin_usage__ = '用法:\n' \
|
||||
'\t原神资源查询 [消息]\n' \
|
||||
'\t原神资源列表\n' \
|
||||
'\t[消息]在哪\n' \
|
||||
'\t哪有[消息]\n' \
|
||||
'[消息] = 资源名称'
|
||||
__plugin_usage__ = (
|
||||
"用法:\n" "\t原神资源查询 [消息]\n" "\t原神资源列表\n" "\t[消息]在哪\n" "\t哪有[消息]\n" "[消息] = 资源名称"
|
||||
)
|
||||
|
||||
qr = on_command("原神资源查询", priority=5, block=True)
|
||||
qr_lst = on_command("原神资源列表", priority=5, block=True)
|
||||
rex_qr = on_regex('.*?(在哪|在哪里|哪有|哪里有).*?', rule=to_me(), priority=5, block=True)
|
||||
|
||||
|
||||
with open(os.path.dirname(__file__) + '/resource_type_id.json', 'r', encoding='utf-8') as f:
|
||||
in_list = [n['name'] for n in json.load(f).values()]
|
||||
rex_qr = on_regex(".*?(在哪|在哪里|哪有|哪里有).*?", rule=to_me(), priority=5, block=True)
|
||||
update_info = on_command('更新原神资源信息', priority=1, block=True)
|
||||
|
||||
|
||||
@qr.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
resource_name = get_message_text(event.json())
|
||||
if resource_name == "" or resource_name not in in_list:
|
||||
return
|
||||
|
||||
await qr.send(await get_resource_map_mes(resource_name), at_sender=True)
|
||||
await qr.send('正在生成位置....')
|
||||
rst = await query_resource(resource_name)
|
||||
await qr.send(Message(rst), at_sender=True)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})"
|
||||
f" 查询原神材料:" + resource_name)
|
||||
f"(USER {event.user_id}, GROUP {event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 查询原神材料:" + resource_name
|
||||
)
|
||||
|
||||
|
||||
@rex_qr.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
msg = get_message_text(event.json())
|
||||
if msg.find('在哪') != -1:
|
||||
rs = re.search('(.*)在哪.*?', msg)
|
||||
resource_name = rs.group(1) if rs else ''
|
||||
if msg.find("在哪") != -1:
|
||||
rs = re.search("(.*)在哪.*?", msg)
|
||||
resource_name = rs.group(1) if rs else ""
|
||||
else:
|
||||
rs = re.search('.*?(哪有|哪里有)(.*)', msg)
|
||||
resource_name = rs.group(2) if rs else ''
|
||||
rs = re.search(".*?(哪有|哪里有)(.*)", msg)
|
||||
resource_name = rs.group(2) if rs else ""
|
||||
if resource_name:
|
||||
msg = await get_resource_map_mes(resource_name)
|
||||
if msg == '发送 原神资源列表 查看所有资源名称':
|
||||
return
|
||||
await rex_qr.send(msg, at_sender=True)
|
||||
await qr.send('正在生成位置....')
|
||||
msg = await query_resource(resource_name)
|
||||
await rex_qr.send(Message(msg), at_sender=True)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})"
|
||||
f" 查询原神材料:" + resource_name)
|
||||
f"(USER {event.user_id}, GROUP {event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 查询原神材料:" + resource_name
|
||||
)
|
||||
|
||||
|
||||
@qr_lst.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
# 长条消息经常发送失败,所以只能这样了
|
||||
mes_list = []
|
||||
txt = get_resource_list_mes()
|
||||
txt = get_resource_type_list()
|
||||
txt_list = txt.split("\n")
|
||||
if event.message_type == 'group':
|
||||
if event.message_type == "group":
|
||||
for txt in txt_list:
|
||||
data = {
|
||||
"type": "node",
|
||||
"data": {
|
||||
"name": f"这里是{list(bot.config.nickname)[0]}酱",
|
||||
"uin": f"{bot.self_id}",
|
||||
"content": txt
|
||||
}
|
||||
"content": txt,
|
||||
},
|
||||
}
|
||||
mes_list.append(data)
|
||||
# await bot.send(ev, get_resource_list_mes(), at_sender=True)
|
||||
if event.message_type == 'group':
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
await bot.send_group_forward_msg(group_id=event.group_id, messages=mes_list)
|
||||
else:
|
||||
rst = ''
|
||||
rst = ""
|
||||
for i in range(len(txt_list)):
|
||||
rst += txt_list[i] + '\n'
|
||||
rst += txt_list[i] + "\n"
|
||||
if i % 5 == 0:
|
||||
if rst:
|
||||
await qr_lst.send(rst)
|
||||
rst = ''
|
||||
rst = ""
|
||||
|
||||
# await qr_lst.send(Message(mes_list))
|
||||
|
||||
@update_info.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
await init(True)
|
||||
await update_info.send('更新原神资源信息完成...')
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
@@ -100,7 +96,7 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
)
|
||||
async def _():
|
||||
try:
|
||||
await up_label_and_point_list()
|
||||
await init()
|
||||
logger.info(f'每日更新原神材料信息成功!')
|
||||
except Exception as e:
|
||||
logger.error(f'每日更新原神材料信息错误:{e}')
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
from pathlib import Path
|
||||
from configs.path_config import IMAGE_PATH, TXT_PATH
|
||||
from utils.image_utils import CreateImg
|
||||
from typing import Tuple
|
||||
from math import sqrt, pow
|
||||
import random
|
||||
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
|
||||
icon_path = Path(IMAGE_PATH) / "genshin" / "genshin_icon"
|
||||
map_path = Path(IMAGE_PATH) / "genshin" / "map" / "map.png"
|
||||
resource_label_file = Path(TXT_PATH) / "genshin" / "resource_label_file.json"
|
||||
resource_point_file = Path(TXT_PATH) / "genshin" / "resource_point_file.json"
|
||||
|
||||
|
||||
class Map:
|
||||
"""
|
||||
原神资源生成类
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
resource_name: str,
|
||||
center_point: Tuple[int, int],
|
||||
deviation: Tuple[int, int] = (25, 51),
|
||||
padding: int = 100,
|
||||
planning_route: bool = False,
|
||||
):
|
||||
"""
|
||||
参数:
|
||||
:param resource_name: 资源名称
|
||||
:param center_point: 中心点
|
||||
:param deviation: 坐标误差
|
||||
:param padding: 截图外边距
|
||||
:param planning_route: 是否规划最佳线路
|
||||
"""
|
||||
self.map = CreateImg(0, 0, background=map_path)
|
||||
self.resource_name = resource_name
|
||||
self.center_x = center_point[0]
|
||||
self.center_y = center_point[1]
|
||||
self.deviation = deviation
|
||||
self.padding = padding
|
||||
self.planning_route = planning_route
|
||||
|
||||
data = json.load(open(resource_label_file, "r", encoding="utf8"))
|
||||
# 资源 id
|
||||
self.resource_id = [
|
||||
data[x]["id"]
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["name"] == resource_name
|
||||
][0]
|
||||
# 传送锚点 id
|
||||
self.teleport_anchor_id = [
|
||||
data[x]["id"]
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["name"] == "传送锚点"
|
||||
][0]
|
||||
# 神像 id
|
||||
self.teleport_god_id = [
|
||||
data[x]["id"]
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["name"] == "七天神像"
|
||||
][0]
|
||||
# 资源坐标
|
||||
data = json.load(open(resource_point_file, "r", encoding="utf8"))
|
||||
self.resource_point = [
|
||||
(
|
||||
self.center_x + int(data[x]["x_pos"]),
|
||||
self.center_y + int(data[x]["y_pos"]),
|
||||
)
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["label_id"] == self.resource_id
|
||||
]
|
||||
# 传送锚点坐标
|
||||
self.teleport_anchor_point = [
|
||||
(
|
||||
self.center_x + int(data[x]["x_pos"]),
|
||||
self.center_y + int(data[x]["y_pos"]),
|
||||
)
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["label_id"] == self.teleport_anchor_id
|
||||
]
|
||||
# 神像坐标
|
||||
self.teleport_god_point = [
|
||||
(
|
||||
self.center_x + int(data[x]["x_pos"]),
|
||||
self.center_y + int(data[x]["y_pos"]),
|
||||
)
|
||||
for x in data
|
||||
if x != "CENTER_POINT" and data[x]["label_id"] == self.teleport_god_id
|
||||
]
|
||||
|
||||
# 将地图上生成资源图标
|
||||
def generate_resource_icon_in_map(self) -> int:
|
||||
x_list = [x[0] for x in self.resource_point]
|
||||
y_list = [x[1] for x in self.resource_point]
|
||||
min_width = min(x_list) - self.padding
|
||||
max_width = max(x_list) + self.padding
|
||||
min_height = min(y_list) - self.padding
|
||||
max_height = max(y_list) + self.padding
|
||||
if self.planning_route:
|
||||
self._generate_best_route()
|
||||
self._generate_transfer_icon((min_width, min_height, max_width, max_height))
|
||||
for x, y in self.resource_point:
|
||||
icon = self._get_icon_image(self.resource_id)
|
||||
self.map.paste(icon, (x - self.deviation[0], y - self.deviation[1]), True)
|
||||
self.map.crop((min_width, min_height, max_width, max_height))
|
||||
rand = random.randint(1, 10000)
|
||||
self.map.save(f'{IMAGE_PATH}/temp/genshin_map_{rand}.png')
|
||||
return rand
|
||||
|
||||
# 资源数量
|
||||
def get_resource_count(self) -> int:
|
||||
return len(self.resource_point)
|
||||
|
||||
# 生成传送锚点和神像
|
||||
def _generate_transfer_icon(self, box: Tuple[int, int, int, int]):
|
||||
min_width, min_height, max_width, max_height = box
|
||||
for points in [self.teleport_anchor_point, self.teleport_god_point]:
|
||||
id_ = (
|
||||
self.teleport_anchor_id
|
||||
if points == self.teleport_anchor_point
|
||||
else self.teleport_god_id
|
||||
)
|
||||
for x, y in points:
|
||||
if min_width < x < max_width and min_height < y < max_height:
|
||||
icon = self._get_icon_image(id_)
|
||||
self.map.paste(
|
||||
icon, (x - self.deviation[0], y - self.deviation[1]), True
|
||||
)
|
||||
|
||||
# 生成最优路线(说是最优其实就是直线最短)
|
||||
def _generate_best_route(self):
|
||||
for x, y in self.resource_point:
|
||||
min_deviation = 999999
|
||||
xy = None
|
||||
for points in [
|
||||
self.resource_point,
|
||||
self.teleport_anchor_point,
|
||||
self.teleport_god_point,
|
||||
]:
|
||||
for r_x, r_y in points:
|
||||
distance = int(sqrt(pow(abs(r_x - x), 2) + pow(abs(r_y - y), 2)))
|
||||
if distance < min_deviation and x != r_x and y != r_y:
|
||||
min_deviation = distance
|
||||
xy = (x, y, r_x, r_y)
|
||||
|
||||
self.map.line(xy, (255, 0, 0), width=3)
|
||||
|
||||
# 获取资源图标
|
||||
def _get_icon_image(self, id_: int) -> "CreateImg":
|
||||
icon = icon_path / f"{id_}.png"
|
||||
if icon.exists():
|
||||
return CreateImg(50, 50, background=icon)
|
||||
return CreateImg(50, 50, background=f"{icon_path}/box.png")
|
||||
@@ -1,312 +1,240 @@
|
||||
from urllib import request
|
||||
from PIL import Image, ImageMath
|
||||
from io import BytesIO
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
import base64
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from utils.init_result import image
|
||||
from typing import Tuple, Optional, List
|
||||
from configs.path_config import IMAGE_PATH, TXT_PATH
|
||||
from PIL.Image import UnidentifiedImageError
|
||||
from utils.message_builder import image
|
||||
from services.log import logger
|
||||
from .map import Map
|
||||
from utils.image_utils import CreateImg
|
||||
import asyncio
|
||||
from pathlib import Path
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from asyncio import Semaphore
|
||||
from aiohttp.client import ClientSession
|
||||
from utils.user_agent import get_user_agent
|
||||
from utils.image_utils import is_valid
|
||||
import nonebot
|
||||
import aiohttp
|
||||
import aiofiles
|
||||
import os
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
|
||||
driver: nonebot.Driver = nonebot.get_driver()
|
||||
|
||||
LABEL_URL = 'https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/label/tree?app_sn=ys_obc'
|
||||
POINT_LIST_URL = 'https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/point/list?map_id=2&app_sn=ys_obc'
|
||||
LABEL_URL = "https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/label/tree?app_sn=ys_obc"
|
||||
POINT_LIST_URL = "https://api-static.mihoyo.com/common/blackboard/ys_obc/v1/map/point/list?map_id=2&app_sn=ys_obc"
|
||||
MAP_URL = "https://api-static.mihoyo.com/common/map_user/ys_obc/v1/map/info?map_id=2&app_sn=ys_obc&lang=zh-cn"
|
||||
|
||||
header = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
|
||||
'Chrome/84.0.4147.105 Safari/537.36'
|
||||
icon_path = Path(IMAGE_PATH) / "genshin" / "genshin_icon"
|
||||
map_path = Path(IMAGE_PATH) / "genshin" / "map"
|
||||
resource_label_file = Path(TXT_PATH) / "genshin" / "resource_label_file.json"
|
||||
resource_point_file = Path(TXT_PATH) / "genshin" / "resource_point_file.json"
|
||||
resource_type_file = Path(TXT_PATH) / "genshin" / "resource_type_file.json"
|
||||
|
||||
FILE_PATH = IMAGE_PATH + 'genshin/'
|
||||
if not os.path.exists(IMAGE_PATH + 'genshin/genshin_icon/'):
|
||||
os.mkdir(IMAGE_PATH + 'genshin/genshin_icon/')
|
||||
# 地图中心坐标
|
||||
CENTER_POINT: Optional[Tuple[int, int]] = None
|
||||
|
||||
MAP_PATH = None
|
||||
MAP_IMAGE = None
|
||||
MAP_SIZE = None
|
||||
|
||||
# resource_point里记录的坐标是相对坐标,是以蒙德城的大雕像为中心的,所以图片合成时需要转换坐标
|
||||
CENTER = (3505, 1907)
|
||||
|
||||
zoom = 0.75
|
||||
resource_icon_offset = (-int(150 * 0.5 * zoom), -int(150 * zoom))
|
||||
resource_name_list: List[str] = []
|
||||
|
||||
|
||||
@driver.on_startup
|
||||
async def init():
|
||||
global MAP_SIZE, MAP_PATH, MAP_IMAGE
|
||||
MAP_PATH = os.path.join(IMAGE_PATH, "genshin", "seek_god_eye", "icon", "map_icon.jpg")
|
||||
MAP_IMAGE = await asyncio.get_event_loop().run_in_executor(None, Image.open, MAP_PATH)
|
||||
MAP_SIZE = MAP_IMAGE.size
|
||||
await up_label_and_point_list()
|
||||
# 查找资源
|
||||
async def query_resource(resource_name: str) -> str:
|
||||
planning_route: bool = False
|
||||
if resource_name and resource_name[-2:] == "路径":
|
||||
resource_name = resource_name[:-2].strip()
|
||||
planning_route = True
|
||||
if not resource_name or resource_name not in resource_name_list:
|
||||
return f"未查找到 {resource_name} 资源,可通过 “原神资源列表” 获取全部资源名称.."
|
||||
map_ = Map(resource_name, CENTER_POINT, planning_route=planning_route)
|
||||
count = map_.get_resource_count()
|
||||
rand = await asyncio.get_event_loop().run_in_executor(None, map_.generate_resource_icon_in_map)
|
||||
return f"{image(f'genshin_map_{rand}.png', 'temp')}" \
|
||||
f"\n\n※ {resource_name} 一共找到 {count} 个位置点\n※ 数据来源于米游社wiki"
|
||||
|
||||
|
||||
data = {
|
||||
"all_resource_type": {
|
||||
# 这个字典保存所有资源类型,
|
||||
# "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_icon_image(sublist):
|
||||
# 检查是否有图标,没有图标下载保存到本地
|
||||
id = sublist["id"]
|
||||
icon_url = sublist["icon"]
|
||||
|
||||
icon_path = os.path.join(FILE_PATH, "genshin_icon", f"{id}.png")
|
||||
|
||||
if not os.path.exists(icon_path):
|
||||
schedule = request.Request(icon_url)
|
||||
schedule.add_header('User-Agent', header)
|
||||
with request.urlopen(schedule) as f:
|
||||
icon = Image.open(f)
|
||||
icon = icon.resize((150, 150))
|
||||
|
||||
box_alpha = Image.open(os.path.join(FILE_PATH, "genshin_icon", "box_alpha.png")).getchannel("A")
|
||||
box = Image.open(os.path.join(FILE_PATH, "genshin_icon", "box.png"))
|
||||
logger.info(f'原神资源更新 --> {sublist}')
|
||||
|
||||
try:
|
||||
icon_alpha = icon.getchannel("A")
|
||||
icon_alpha = ImageMath.eval("convert(a*b/256, 'L')", a=icon_alpha, b=box_alpha)
|
||||
except ValueError:
|
||||
# 米游社的图有时候会没有alpha导致报错,这时候直接使用box_alpha当做alpha就行
|
||||
icon_alpha = box_alpha
|
||||
|
||||
icon2 = Image.new("RGBA", (150, 150), "#00000000")
|
||||
icon2.paste(icon, (0, -10))
|
||||
|
||||
bg = Image.new("RGBA", (150, 150), "#00000000")
|
||||
bg.paste(icon2, mask=icon_alpha)
|
||||
bg.paste(box, mask=box)
|
||||
|
||||
with open(icon_path, "wb") as icon_file:
|
||||
bg.save(icon_file)
|
||||
|
||||
|
||||
async def up_label_and_point_list():
|
||||
# 更新label列表和资源点列表
|
||||
try:
|
||||
if os.path.exists(os.path.dirname(__file__) + '/icon/box_alpha.png'):
|
||||
os.rename(os.path.dirname(__file__) + '/icon/box_alpha.png', IMAGE_PATH + 'genshin/genshin_icon/box_alpha.png')
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
if os.path.exists(os.path.dirname(__file__) + '/icon/box.png'):
|
||||
os.rename(os.path.dirname(__file__) + '/icon/box.png', IMAGE_PATH + 'genshin/genshin_icon/box.png')
|
||||
except:
|
||||
pass
|
||||
|
||||
schedule = request.Request(LABEL_URL)
|
||||
schedule.add_header('User-Agent', header)
|
||||
with request.urlopen(schedule, timeout=5) as f:
|
||||
if f.code != 200: # 检查返回的状态码是否是200
|
||||
raise ValueError(f"资源标签列表初始化失败,错误代码{f.code}")
|
||||
label_data = json.loads(f.read().decode('utf-8'))
|
||||
tasks = []
|
||||
for label in label_data["data"]["tree"]:
|
||||
data["all_resource_type"][str(label["id"])] = label
|
||||
|
||||
for sublist in label["children"]:
|
||||
data["all_resource_type"][str(sublist["id"])] = sublist
|
||||
data["can_query_type_list"][sublist["name"]] = str(sublist["id"])
|
||||
tasks.append(asyncio.get_event_loop().run_in_executor(None, up_icon_image, sublist))
|
||||
# logger.info(f'原神资源更新 --> {sublist}')
|
||||
|
||||
label["children"] = []
|
||||
await asyncio.gather(*tasks)
|
||||
|
||||
schedule = request.Request(POINT_LIST_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()
|
||||
|
||||
|
||||
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(self.get_icon_path())
|
||||
self.resource_icon = self.resource_icon.resize((int(150 * zoom), int(150 * zoom)))
|
||||
|
||||
self.resource_xy_list = self.get_resource_point_list()
|
||||
|
||||
def get_icon_path(self):
|
||||
# 检查有没有图标,有返回正确图标,没有返回默认图标
|
||||
icon_path = os.path.join(FILE_PATH, "genshin_icon", f"{self.resource_id}.png")
|
||||
|
||||
if os.path.exists(icon_path):
|
||||
return icon_path
|
||||
else:
|
||||
return os.path.join(FILE_PATH, "genshin_icon", "0.png")
|
||||
|
||||
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='JPEG')
|
||||
base64_str = 'base64://' + base64.b64encode(bio.getvalue()).decode()
|
||||
|
||||
return image(b64=base64_str)
|
||||
|
||||
def get_resource_count(self):
|
||||
return len(self.resource_xy_list)
|
||||
|
||||
|
||||
async def get_resource_map_mes(name):
|
||||
if data["date"] != time.strftime("%d"):
|
||||
await up_label_and_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():
|
||||
# 原神资源列表
|
||||
def get_resource_type_list():
|
||||
with open(resource_type_file, "r", encoding="utf8") as f:
|
||||
data = json.load(f)
|
||||
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)
|
||||
for id_ in data.keys():
|
||||
temp[data[id_]["name"]] = []
|
||||
for x in data[id_]["children"]:
|
||||
temp[data[id_]["name"]].append(x["name"])
|
||||
|
||||
mes = "当前资源列表如下:\n"
|
||||
|
||||
for resource_type_id in temp.keys():
|
||||
|
||||
if resource_type_id in ["1", "12", "50", "51", "95", "131"]:
|
||||
# 在游戏里能查到的数据这里就不列举了,不然消息太长了
|
||||
continue
|
||||
|
||||
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"
|
||||
|
||||
for resource_type in temp.keys():
|
||||
mes += f"{resource_type}:{','.join(temp[resource_type])}\n"
|
||||
return mes
|
||||
|
||||
|
||||
@driver.on_startup
|
||||
async def init(flag: bool = False):
|
||||
global CENTER_POINT, resource_name_list
|
||||
semaphore = asyncio.Semaphore(10)
|
||||
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
|
||||
await download_map_init(session, semaphore, flag)
|
||||
await download_resource_data(session, semaphore)
|
||||
await download_resource_type(session)
|
||||
if not CENTER_POINT:
|
||||
CENTER_POINT = json.load(open(resource_label_file, "r", encoding="utf8"))[
|
||||
"CENTER_POINT"
|
||||
]
|
||||
with open(resource_type_file, "r", encoding="utf8") as f:
|
||||
data = json.load(f)
|
||||
for id_ in data:
|
||||
for x in data[id_]["children"]:
|
||||
resource_name_list.append(x["name"])
|
||||
|
||||
|
||||
# 图标及位置资源
|
||||
async def download_resource_data(session: ClientSession, semaphore: Semaphore):
|
||||
icon_path.mkdir(parents=True, exist_ok=True)
|
||||
resource_label_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
try:
|
||||
async with session.get(POINT_LIST_URL, timeout=5) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
if data["message"] == "OK":
|
||||
data = data["data"]
|
||||
for lst in ["label_list", "point_list"]:
|
||||
resource_data = {"CENTER_POINT": CENTER_POINT}
|
||||
tasks = []
|
||||
file = (
|
||||
resource_label_file
|
||||
if lst == "label_list"
|
||||
else resource_point_file
|
||||
)
|
||||
for x in data[lst]:
|
||||
id_ = x["id"]
|
||||
if lst == "label_list":
|
||||
img_url = x["icon"]
|
||||
tasks.append(
|
||||
asyncio.ensure_future(
|
||||
download_image(
|
||||
img_url,
|
||||
f"{icon_path}/{id_}.png",
|
||||
session,
|
||||
semaphore,
|
||||
True,
|
||||
)
|
||||
)
|
||||
)
|
||||
resource_data[id_] = x
|
||||
await asyncio.gather(*tasks)
|
||||
with open(file, "w", encoding="utf8") as f:
|
||||
json.dump(resource_data, f, ensure_ascii=False, indent=4)
|
||||
else:
|
||||
logger.warning(f'获取原神资源失败 msg: {data["message"]}')
|
||||
else:
|
||||
logger.warning(f"获取原神资源失败 code:{response.status}")
|
||||
except TimeoutError:
|
||||
logger.warning("获取原神资源数据超时...已再次尝试...")
|
||||
await download_resource_data(session, semaphore)
|
||||
|
||||
|
||||
# 下载原神地图并拼图
|
||||
async def download_map_init(session: ClientSession, semaphore: Semaphore, flag: bool = False):
|
||||
global CENTER_POINT
|
||||
map_path.mkdir(exist_ok=True, parents=True)
|
||||
async with session.get(MAP_URL, timeout=5) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
if data["message"] == "OK":
|
||||
data = json.loads(data["data"]["info"]["detail"])
|
||||
CENTER_POINT = (data["origin"][0], data["origin"][1])
|
||||
# padding_w, padding_h = data['padding']
|
||||
data = data["slices"]
|
||||
idx = 0
|
||||
for x in data:
|
||||
idj = 0
|
||||
for j in x:
|
||||
await download_image(
|
||||
j["url"],
|
||||
f"{map_path}/{idx}_{idj}.png",
|
||||
session,
|
||||
semaphore,
|
||||
force_flag=flag
|
||||
)
|
||||
idj += 1
|
||||
idx += 1
|
||||
map_width, map_height = CreateImg(
|
||||
0, 0, background=f"{map_path}/0_0.png"
|
||||
).size
|
||||
lens = len([x for x in os.listdir(f"{map_path}") if x.startswith("0")])
|
||||
background_image = CreateImg(
|
||||
map_width * lens, map_height * lens, map_width, map_height
|
||||
)
|
||||
for i in range(idx):
|
||||
for j in range(idj):
|
||||
x = CreateImg(0, 0, background=f"{map_path}/{i}_{j}.png")
|
||||
background_image.paste(x)
|
||||
background_image.save(f"{map_path}/map.png")
|
||||
else:
|
||||
logger.warning(f'获取原神地图失败 msg: {data["message"]}')
|
||||
else:
|
||||
logger.warning(f"获取原神地图失败 code:{response.status}")
|
||||
|
||||
|
||||
# 下载资源类型数据
|
||||
async def download_resource_type(session: ClientSession):
|
||||
resource_type_file.parent.mkdir(parents=True, exist_ok=True)
|
||||
async with session.get(LABEL_URL, timeout=5) as response:
|
||||
if response.status == 200:
|
||||
data = await response.json()
|
||||
if data["message"] == "OK":
|
||||
data = data["data"]["tree"]
|
||||
resource_data = {}
|
||||
for x in data:
|
||||
id_ = x["id"]
|
||||
resource_data[id_] = x
|
||||
with open(resource_type_file, "w", encoding="utf8") as f:
|
||||
json.dump(resource_data, f, ensure_ascii=False, indent=4)
|
||||
logger.info(f"更新原神资源类型成功...")
|
||||
else:
|
||||
logger.warning(f'获取原神资源类型失败 msg: {data["message"]}')
|
||||
else:
|
||||
logger.warning(f"获取原神资源类型失败 code:{response.status}")
|
||||
|
||||
|
||||
# 初始化资源图标
|
||||
def gen_icon(icon: str):
|
||||
A = CreateImg(0, 0, background=f"{icon_path}/box.png")
|
||||
B = CreateImg(0, 0, background=f"{icon_path}/box_alpha.png")
|
||||
icon_ = icon_path / f"{icon}"
|
||||
icon_img = CreateImg(115, 115, background=icon_)
|
||||
icon_img.circle()
|
||||
B.paste(icon_img, (17, 10), True)
|
||||
B.paste(A, alpha=True)
|
||||
B.save(icon)
|
||||
logger.info(f"生成图片成功 file:{str(icon)}")
|
||||
|
||||
|
||||
# 下载图片
|
||||
async def download_image(
|
||||
img_url: str,
|
||||
path: str,
|
||||
session: ClientSession,
|
||||
semaphore: Semaphore,
|
||||
gen_flag: bool = False,
|
||||
force_flag: bool = False,
|
||||
):
|
||||
async with semaphore:
|
||||
try:
|
||||
if not os.path.exists(path) or not is_valid or force_flag:
|
||||
async with session.get(img_url, timeout=5) as response:
|
||||
async with aiofiles.open(path, "wb") as f:
|
||||
await f.write(await response.read())
|
||||
logger.info(f"下载原神资源图标:{img_url}")
|
||||
if gen_flag:
|
||||
gen_icon(path)
|
||||
except TimeoutError:
|
||||
logger.warning("下载原神资源图片超时...已再次尝试...")
|
||||
await download_image(img_url, path, session, semaphore, gen_flag)
|
||||
except UnidentifiedImageError:
|
||||
logger.warning(f"原神图片打开错误..已删除,等待下次更新... file: {path}")
|
||||
if os.path.exists(path):
|
||||
os.remove(path)
|
||||
|
||||
@@ -1,926 +0,0 @@
|
||||
{
|
||||
"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": []
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user