This commit is contained in:
2026-04-24 18:31:30 +08:00
parent f54ac15c9f
commit a9edf2ee32
7 changed files with 481 additions and 189 deletions
+5
View File
@@ -1,5 +1,10 @@
## 更新记录
### version: 2.0
接口地址调整
### version: 1.2.4
角色信息查询数据展示优化
+214 -72
View File
@@ -1,6 +1,7 @@
import json
from datetime import datetime
from typing import Dict, Any, Optional, List, Union
from collections import defaultdict
from astrbot.api import logger
from astrbot.api import AstrBotConfig
@@ -144,7 +145,7 @@ class JX3Service:
try:
# 格式化字符串,利用字典的 get 方法提供默认值
result_msg = (
f"{server}\n{data.get('date', '未知日期')}-星期{data.get('week', '未知')}\n"
f"{server}\n{data.get('date', '未知日期')} 星期{data.get('week', '未知')}\n"
f"大战:{data.get('war', '')}\n"
f"战场:{data.get('battle', '')}\n"
f"阵营:{data.get('orecar', '')}\n"
@@ -159,7 +160,7 @@ class JX3Service:
card = data.get('card', [])
card_msg = f"【家园声望·加倍道具】\n{', '.join(card)}\n"
team = data.get('team', [None, None, None])
team_msg = f"【武林通鉴·公共任务】\n{team[0] or ''}\n【武林通鉴·团队秘境】\n{team[2] or ''}\n"
team_msg = f"【武林通鉴·公共任务】\n{team[0] or ''}\n【武林通鉴·团队秘境】\n{team[1] or ''}\n"
return_data["data"] = result_msg + luck_msg + card_msg + team_msg
return_data["code"] = 200
@@ -342,7 +343,7 @@ class JX3Service:
async def zhuangshi(self,name: str) -> Dict[str, Any]:
"""花价"""
"""装饰"""
return_data = self._init_return_data()
# 1. 构造请求参数
@@ -416,31 +417,113 @@ class JX3Service:
return return_data
async def shapan(self, server: str ) -> Dict[str, Any]:
"""区服沙盘"""
async def xinwen(self, num:int) -> Dict[str, Any]:
"""新闻资讯"""
return_data = self._init_return_data()
params = {"limit": num}
# 提取字段可能返回列表
data: Optional[List[Dict[str, Any]]] = await self._base_request(
"jx3_xinweng", "GET", params=params)
if not data or not isinstance(data, list):
return_data["msg"] = "获取接口信息失败或数据格式错误"
return return_data
try:
#
result = data[0]
return_data["status"] = result.get('id')
result_msg = "新闻资讯推送\n"
# 仅展示前1条,避免消息过长
for i, item in enumerate(data[:num], 1):
result_msg += f"{i}. 【{item.get('type', '无类型')}\n"
result_msg += f"标题:{item.get('title', '未知时间')}\n"
result_msg += f"时间:{item.get('date', '未知时间')}\n"
result_msg += f"链接:{item.get('url', '无链接')}\n"
return_data["data"] = result_msg
except Exception as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
return_data["code"] = 200
return return_data
async def weihu(self, num:int) -> Dict[str, Any]:
"""维护"""
return_data = self._init_return_data()
params = {"limit": num}
# 提取字段可能返回列表
data: Optional[List[Dict[str, Any]]] = await self._base_request(
"jx3_weihu", "GET", params=params)
if not data or not isinstance(data, list):
return_data["msg"] = "获取接口信息失败或数据格式错误"
return return_data
try:
#
result = data[0]
return_data["status"] = result.get('id')
result_msg = "维护推送\n"
# 仅展示前1条,避免消息过长
for i, item in enumerate(data[:num], 1):
result_msg += f"{i}. 【{item.get('type', '无类型')}\n"
result_msg += f"标题:{item.get('title', '未知时间')}\n"
result_msg += f"时间:{item.get('date', '未知时间')}\n"
result_msg += f"链接:{item.get('url', '无链接')}\n"
return_data["data"] = result_msg
except Exception as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
return_data["code"] = 200
return return_data
async def qufu(self,name: str) -> Dict[str, Any]:
"""区服信息"""
return_data = self._init_return_data()
# 1. 构造请求参数
params = {"serverName": server}
params = {"name": name}
# 2. 调用基础请求
data: Optional[Dict[str, Any]] = await self._base_request(
"aijx3_shapan", "POST", params=params
"jx3_qufu", "GET", params=params
)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 3. 处理返回数据
try:
# 格式化字符串,利用字典的 get 方法提供默认值
result_msg = f"主服:{data.get('zone', '')}-{data.get('name', '')}\n"
# 3. 处理返回数据 (直接提取图片 URL)
pic_url = data.get("picUrl")
if pic_url:
return_data["data"] = pic_url
else:
return_data["msg"] = "接口未返回图片URL"
slave = data.get('slave', [])
slave_msg = f"区服:{', '.join(slave)}\n"
alias = data.get('alias', [])
alias_msg = f"别名:{', '.join(alias)}\n"
return_data["data"] = result_msg + slave_msg + alias_msg
return_data["code"] = 200
except Exception as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
return return_data
return_data["code"] = 200
return_data["code"] = 200
return return_data
@@ -450,11 +533,11 @@ class JX3Service:
return_data = self._init_return_data()
# 1. 构造请求参数
params = {"server": server}
params = {"server": server,"type": "1"}
# 2. 调用基础请求
data: Optional[Dict[str, Union[int, str]]] = await self._base_request(
"jx3_kaifu", "GET", params=params
"jx3_zhuangtai", "GET", params=params
)
if not data:
@@ -464,15 +547,17 @@ class JX3Service:
# 3. 处理返回数据
try:
status = data.get("status", 0)
timestamp = data.get("time", 0)
lasttime = data.get("lasttime", 0)
shuttime = data.get("shuttime", 0)
status_time = datetime.fromtimestamp(float(timestamp)).strftime("%Y-%m-%d %H:%M:%S")
lasttime_t = datetime.fromtimestamp(float(lasttime)).strftime("%Y-%m-%d %H:%M:%S")
shuttime_t = datetime.fromtimestamp(float(shuttime)).strftime("%Y-%m-%d %H:%M:%S")
if status == 1:
status_str = f"{server}服务器已开服,快冲,快冲!\n开服时间:{status_time}"
status_str = f"{server}服务器已开服,快冲,快冲!\n开服时间:{lasttime_t}"
status_bool = True
else:
status_str = f"{server}服务器当前维护中,等会再来吧!\n维护时间:{status_time}"
status_str = f"{server}服务器当前维护中,等会再来吧!\n维护时间:{shuttime_t}"
status_bool = False
return_data["status"] = status_bool
@@ -488,36 +573,15 @@ class JX3Service:
return return_data
async def shaohua(self) -> Dict[str, Any]:
"""骚话"""
return_data = self._init_return_data()
# 因为没有参数,所以 params=None
data: Optional[Dict[str, Any]] = await self._base_request("jx3_shaohua", "GET")
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
text = data.get("text")
if text:
return_data["data"] = text
else:
return_data["msg"] = "接口未返回文本"
return return_data
return_data["code"] = 200
return return_data
async def zhuangtai(self) -> Dict[str, Any]:
"""区服状态"""
return_data = self._init_return_data()
# 1. 构造请求参数
params = {"server": "","type": "2"}
data: Optional[List[Dict[str, Any]]] = await self._base_request("jx3_zhuangtai", "GET")
data: Optional[List[Dict[str, Any]]] = await self._base_request("jx3_zhuangtai", "GET", params=params)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
@@ -566,9 +630,9 @@ class JX3Service:
return return_data
try:
result_msg = "剑网三最近技改\n"
# 仅展示前1条,避免消息过长
for i, item in enumerate(data[:1], 1):
result_msg = "最近技改\n"
for i, item in enumerate(data[:3], 1):
result_msg += f"{i}. {item.get('title', '无标题')}\n"
result_msg += f"时间:{item.get('time', '未知时间')}\n"
result_msg += f"链接:{item.get('url', '无链接')}\n\n"
@@ -583,42 +647,120 @@ class JX3Service:
return_data["code"] = 200
return return_data
async def xinwen(self, num:int) -> Dict[str, Any]:
"""新闻资讯"""
async def xiaoyao(self) -> Dict[str, Any]:
"""小药"""
return_data = self._init_return_data()
params = {"limit": num}
# 提取字段可能返回列表
data: Optional[List[Dict[str, Any]]] = await self._base_request(
"jx3_xinweng", "GET", params=params)
if not data or not isinstance(data, list):
return_data["msg"] = "获取接口信息失败或数据格式错误"
data: Optional[List[Dict[str, Any]]] = await self._base_request("jx3_xiaoyao", "GET")
logger.debug(data)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 处理返回数据
try:
#
result = data[0]
return_data["status"] = result.get('id')
result = {}
for item in data:
k = item["kungfu"]
color = item["color"]
cls = item["class"]
name = item["name"]
if k not in result:
result[k] = {
"kungfu": k,
"purple": {},
"blue": {}
}
if color == "":
result[k]["purple"][cls] = name
else:
result[k]["blue"][cls] = name
return_data["data"]["items"] = list(result.values())
logger.debug(return_data["data"])
result_msg = "新闻资讯推送\n"
# 仅展示前1条,避免消息过长
for i, item in enumerate(data[:num], 1):
result_msg += f"{i}. {item.get('title', '无标题')}\n"
result_msg += f"时间:{item.get('date', '未知时间')}\n"
result_msg += f"链接:{item.get('url', '无链接')}\n"
return_data["data"] = result_msg
except Exception as e:
logger.error(f"数据处理时出错: {e}")
return_data["msg"] = "处理接口返回信息时出错"
# 加载模板
try:
return_data["temp"] = await load_template("xiaoyao.html")
except FileNotFoundError as e:
logger.error(f"加载模板失败: {e}")
return_data["msg"] = "系统错误:模板文件不存在"
return return_data
return_data["code"] = 200
return return_data
async def shaohua(self) -> Dict[str, Any]:
"""骚话"""
return_data = self._init_return_data()
# 因为没有参数,所以 params=None
data: Optional[Dict[str, Any]] = await self._base_request("jx3_shaohua", "GET")
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
text = data.get("text")
if text:
return_data["data"] = text
else:
return_data["msg"] = "接口未返回文本"
return return_data
return_data["code"] = 200
return return_data
async def shapan(self, server: str ) -> Dict[str, Any]:
"""区服沙盘"""
return_data = self._init_return_data()
# 1. 构造请求参数
params = {"serverName": server}
# 2. 调用基础请求
data: Optional[Dict[str, Any]] = await self._base_request(
"aijx3_shapan", "POST", params=params
)
if not data:
return_data["msg"] = "获取接口信息失败"
return return_data
# 3. 处理返回数据 (直接提取图片 URL)
pic_url = data.get("picUrl")
if pic_url:
return_data["data"] = pic_url
else:
return_data["msg"] = "接口未返回图片URL"
return return_data
return_data["code"] = 200
return return_data
async def shuamamsg(self,server:str,type:str,subtype:str) -> Dict[str, Any]:
+41 -26
View File
@@ -207,31 +207,6 @@ class MessageBuilder:
return await self.T2I_image_msg(event, lambda: self.jx3api.xingxiashijian(name))
async def jx3_kaifu(self, event: AstrMessageEvent,server: str = ""):
"""剑三 开服 服务器"""
return await self.plain_msg(event, lambda: self.jx3api.kaifu(self.serverdefault(server)))
async def jx3_zhuangtai(self, event: AstrMessageEvent):
"""剑三 状态"""
return await self.T2I_image_msg(event, self.jx3api.zhuangtai)
async def jx3_shaohua(self, event: AstrMessageEvent,):
"""剑三 骚话"""
return await self.plain_msg(event, self.jx3api.shaohua)
async def jx3_jigai(self, event: AstrMessageEvent,):
"""剑三 技改"""
return await self.plain_msg(event, self.jx3api.jigai)
async def jx3_xinwen(self, event: AstrMessageEvent,num:int = 5):
"""剑三 新闻"""
return await self.plain_msg(event, lambda: self.jx3api.xinwen(num))
async def jx3_keju(self, event: AstrMessageEvent,subject: str, limit: int = 5):
"""剑三 科举"""
return await self.plain_msg(event, lambda: self.jx3api.keju(subject,limit))
@@ -250,7 +225,47 @@ class MessageBuilder:
async def jx3_qiwu(self, event: AstrMessageEvent, name: str):
"""剑三 器物 地图名称"""
return await self.T2I_image_msg(event, lambda: self.jx3api.qiwu(name))
async def jx3_xinwen(self, event: AstrMessageEvent,num:int = 5):
"""剑三 新闻"""
return await self.plain_msg(event, lambda: self.jx3api.xinwen(num))
async def jx3_weihu(self, event: AstrMessageEvent,num:int = 5):
"""剑三 维护"""
return await self.plain_msg(event, lambda: self.jx3api.weihu(num))
async def jx3_qufu(self, event: AstrMessageEvent,name: str = "双梦镇"):
"""剑三 区服"""
return await self.plain_msg(event, lambda: self.jx3api.qufu(name))
async def jx3_kaifu(self, event: AstrMessageEvent,server: str = ""):
"""剑三 开服 服务器"""
return await self.plain_msg(event, lambda: self.jx3api.kaifu(self.serverdefault(server)))
async def jx3_zhuangtai(self, event: AstrMessageEvent):
"""剑三 状态"""
return await self.T2I_image_msg(event, self.jx3api.zhuangtai)
async def jx3_jigai(self, event: AstrMessageEvent,):
"""剑三 技改"""
return await self.plain_msg(event, self.jx3api.jigai)
async def jx3_xiaoyao(self, event: AstrMessageEvent):
"""剑三 小药"""
return await self.T2I_image_msg(event, self.jx3api.xiaoyao)
async def jx3_shaohua(self, event: AstrMessageEvent,):
"""剑三 骚话"""
return await self.plain_msg(event, self.jx3api.shaohua)
async def jx3_shapan(self, event: AstrMessageEvent,server: str = ""):
"""剑三 沙盘 服务器"""
+92 -84
View File
@@ -8,27 +8,102 @@
"num": 0
}
},
"jx3_shaohua":{
"url":"https://www.jx3api.com/data/saohua/random",
"jx3_richangyuche":{
"url":"https://www.jx3api.com/data/active/list/calendar",
"method":"GET",
"description":"获取剑网三骚话",
"description":"该 API 用于预测每天的日常任务,您可以通过指定时间范围来获取相关任务数据。",
"params":{
"name": "万花"
"num": "30"
}
},
"jx3_xingxiashijian":{
"url":"https://www.jx3api.com/data/active/celebs",
"method":"GET",
"description":"查询当前时间的楚天社或云从社的进度。",
"params":{
"name": "穹野卫"
}
},
"jx3_keju":{
"url":"https://www.jx3api.com/data/exam/search",
"method":"GET",
"description":"此接口用于科举考试时的答案查询,支持模糊查询和拼音首字母查询。",
"params":{
"subject": "",
"limit": "5"
}
},
"jx3_huajia":{
"url":"https://www.jx3api.com/data/home/flower",
"method":"GET",
"description":"此接口用于查询家园系统中特定鲜花的最高价格及其对应的采集线路,包括区服和地图信息。",
"params":{
"server": "",
"name": "",
"map": ""
}
},
"jx3_zhuangshi":{
"url":"https://www.jx3api.com/data/home/furniture",
"method":"GET",
"description":"此接口用于查询家园系统中特定装饰的详细信息,包括来源、属性和外观等内容。",
"params":{
"name": ""
}
},
"jx3_qiwu":{
"url":"https://www.jx3api.com/data/home/travel",
"method":"GET",
"description":"此接口用于查询指定地图的装饰物品产出信息,包括装饰的属性、来源和外观等内容。",
"params":{
"name": ""
}
},
"jx3_xinweng":{
"url":"https://www.jx3api.com/data/news/allnews",
"method":"GET",
"description":"此接口用于获取官方最新公告及新闻内容,包括新闻分类、标题及链接等信息。",
"params":{
"limit": 1
}
},
"jx3_weihu":{
"url":"https://www.jx3api.com/data/news/announce",
"method":"GET",
"description":"获取《剑网3》官方发布的最新维护与版本更新公告列表,包含公告标题、发布日期及原文链接",
"params":{
"limit": 1
}
},
"jx3_qufu":{
"url":"https://www.jx3api.com/data/master/search",
"method":"GET",
"description":"此接口用于根据区服简称搜索主服务器及其附属服务器的详细信息",
"params":{
"name": "双梦镇"
}
},
"jx3_zhuangtai":{
"url":"https://www.jx3api.com/data/status/check",
"method":"GET",
"description":"此接口用于根据区服简称搜索主服务器及其附属服务器的详细信息",
"params":{
"type": "",
"server": ""
}
},
"jx3_jigai":{
"url":"https://www.jx3api.com/data/skills/records",
"url":"https://www.jx3api.com/data/skill/rework",
"method":"GET",
"description":"获取剑网三技能记录",
"params":{
}
},
"jx3_kaifu":{
"url":"https://www.jx3api.com/data/server/check",
"jx3_xiaoyao":{
"url":"https://www.jx3api.com/data/school/foods",
"method":"GET",
"description":"剑网三开服查询",
"description":"小药",
"params":{
"server": "梦江南"
}
},
"aijx3_shapan":{
@@ -39,6 +114,14 @@
"serverName": "眉间雪"
}
},
"jx3_shaohua":{
"url":"https://www.jx3api.com/data/saohua/random",
"method":"GET",
"description":"获取剑网三骚话",
"params":{
"name": "万花"
}
},
"aijx3_qiyu":{
"url":"https://www.jianxiachaguan.cn/api2/aijx3-jxcg/game/get-adventure-record",
"method":"POST",
@@ -141,22 +224,6 @@
"token":""
}
},
"jx3_xinweng":{
"url":"https://www.jx3api.com/data/news/allnews",
"method":"GET",
"description":"此接口用于获取官方最新公告及新闻内容,包括新闻分类、标题及链接等信息。",
"params":{
"limit": 1
}
},
"jx3_weihu":{
"url":"https://www.jx3api.com/data/news/announce",
"method":"GET",
"description":"此接口用于获取官方最新维护公告,包括公告标题、发布日期及链接等信息。",
"params":{
"limit": 1
}
},
"jx3_zhengyingpaimai":{
"url":"https://www.jx3api.com/data/auction/records",
"method":"GET",
@@ -196,30 +263,6 @@
"token": ""
}
},
"jx3_zhuangtai":{
"url":"https://www.jx3api.com/data/server/status",
"method":"GET",
"description":"此接口用于查询指定服务器的当前状态,包括 维护、正常、繁忙 和 爆满 等状态信息。",
"params":{
"server": ""
}
},
"jx3_richangyuche":{
"url":"https://www.jx3api.com/data/active/list/calendar",
"method":"GET",
"description":"该 API 用于预测每天的日常任务,您可以通过指定时间范围来获取相关任务数据。",
"params":{
"num": "30"
}
},
"jx3_xingxiashijian":{
"url":"https://www.jx3api.com/data/active/celebs",
"method":"GET",
"description":"查询当前时间的楚天社或云从社的进度。",
"params":{
"name": "穹野卫"
}
},
"jx3_pianzhi":{
"url":"https://www.jx3api.com/data/fraud/detailed",
"method":"GET",
@@ -240,41 +283,6 @@
"token": ""
}
},
"jx3_keju":{
"url":"https://www.jx3api.com/data/exam/answer",
"method":"GET",
"description":"此接口用于科举考试时的答案查询,支持模糊查询和拼音首字母查询。",
"params":{
"subject": "",
"limit": "5"
}
},
"jx3_huajia":{
"url":"https://www.jx3api.com/data/home/flower",
"method":"GET",
"description":"此接口用于查询家园系统中特定鲜花的最高价格及其对应的采集线路,包括区服和地图信息。",
"params":{
"server": "",
"name": "",
"map": ""
}
},
"jx3_zhuangshi":{
"url":"https://www.jx3api.com/data/home/furniture",
"method":"GET",
"description":"此接口用于查询家园系统中特定装饰的详细信息,包括来源、属性和外观等内容。",
"params":{
"name": ""
}
},
"jx3_qiwu":{
"url":"https://www.jx3api.com/data/home/travel",
"method":"GET",
"description":"此接口用于查询指定地图的装饰物品产出信息,包括装饰的属性、来源和外观等内容。",
"params":{
"name": ""
}
},
"jx3box_qiyugonglue":{
"url":"https://node.jx3box.com/serendipities",
"method":"GET",
+9 -6
View File
@@ -16,7 +16,7 @@ from .core.fun_basic import load_as_base64
@register("astrbot_plugin_jx3",
"fxdyz",
"通过调用剑网三API接口获取游戏数据,处理发送。",
"1.2.4",
"2.0",
"https://github.com/qsc20001102/astrbot_plugin_jx3api"
)
class Jx3ApiPlugin(Star):
@@ -188,15 +188,18 @@ class Jx3ApiPlugin(Star):
"日常": self.jx3cmd.jx3_richang,
"日常预测": self.jx3cmd.jx3_richangyuche,
"名望": self.jx3cmd.jx3_xingxiashijian,
"开服": self.jx3cmd.jx3_kaifu,
"全服状态": self.jx3cmd.jx3_zhuangtai,
"骚话": self.jx3cmd.jx3_shaohua,
"技改": self.jx3cmd.jx3_jigai,
"公告": self.jx3cmd.jx3_xinwen,
"科举": self.jx3cmd.jx3_keju,
"花价": self.jx3cmd.jx3_huajia,
"装饰": self.jx3cmd.jx3_zhuangshi,
"器物": self.jx3cmd.jx3_qiwu,
"公告": self.jx3cmd.jx3_xinwen,
"维护": self.jx3cmd.jx3_weihu,
"区服": self.jx3cmd.jx3_qufu,
"开服": self.jx3cmd.jx3_kaifu,
"状态": self.jx3cmd.jx3_zhuangtai,
"技改": self.jx3cmd.jx3_jigai,
"小药": self.jx3cmd.jx3_xiaoyao,
"骚话": self.jx3cmd.jx3_shaohua,
"沙盘": self.jx3cmd.jx3_shapan,
"统计": self.jx3cmd.jx3_qufuqiyu,
"攻略": self.jx3cmd.jx3_qiyugonglue,
+1 -1
View File
@@ -1,6 +1,6 @@
name: astrbot_plugin_jx3
display_name: 剑网三游戏数据查询工具
desc: 通过接口调用剑网三API接口获取游戏数据,处理发送。
version: v1.2.4
version: v2.0
author: 飞翔大野猪
repo: https://github.com/qsc20001102/astrbot_plugin_jx3
+119
View File
@@ -0,0 +1,119 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>小药表</title>
<style>
body {
font-family: 'Microsoft YaHei', Arial, sans-serif;
background: #f1f2f6;
margin: 0;
padding: 20px;
}
.container {
max-width: 1400px;
margin: 0 auto;
text-align: center;
}
h1 {
font-size: 32px;
margin-bottom: 25px;
color: #222;
font-weight: 800;
}
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0,0,0,0.08);
text-align: center;
}
thead {
background: #d93939;
color: white;
font-size: 16px;
}
th, td {
padding: 12px 10px;
border-bottom: 1px solid #eee;
}
tbody tr:hover {
background: #fff2f2;
}
.purple {
color: #a020f0;
font-weight: 600;
}
.blue {
color: #1e90ff;
font-weight: 600;
}
.kungfu {
font-weight: bold;
color: #333;
}
</style>
</head>
<body>
<div class="container">
<h1>心法小药表</h1>
<table>
<thead>
<tr>
<th rowspan="2">心法</th>
<th colspan="4">紫色小药</th>
<th colspan="4">蓝色小药</th>
</tr>
<tr>
<th>增强食品</th>
<th>增强药品</th>
<th>辅助食品</th>
<th>辅助药品</th>
<th>增强食品</th>
<th>增强药品</th>
<th>辅助食品</th>
<th>辅助药品</th>
</tr>
</thead>
<tbody>
{% for m in items %}
<tr>
<td class="kungfu">{{ m.kungfu }}</td>
<!-- 紫色 -->
<td class="purple">{{ m.purple["增强食品"] }}</td>
<td class="purple">{{ m.purple["增强药品"] }}</td>
<td class="purple">{{ m.purple["辅助食品"] }}</td>
<td class="purple">{{ m.purple["辅助药品"] }}</td>
<!-- 蓝色 -->
<td class="blue">{{ m.blue["增强食品"] }}</td>
<td class="blue">{{ m.blue["增强药品"] }}</td>
<td class="blue">{{ m.blue["辅助食品"] }}</td>
<td class="blue">{{ m.blue["辅助药品"] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>