Files
astrbot_plugin_jx3/main.py
T
2025-09-22 14:21:56 +08:00

290 lines
10 KiB
Python

import urllib3
from datetime import datetime
from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult
from astrbot.api.star import Context, Star, register
from astrbot.api import logger
from astrbot.api import AstrBotConfig
from .core.jx3jiaoyihang import fetch_jx3_jiaoyihang
from .core.load_template import load_template
from .core.api_data import api_data, fetch_jx3_data
# 禁用 SSL 警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
@register("jx3api", "fxdyz", "通过接口调用剑网三API接口获取游戏数据", "1.0.0")
class Jx3ApiPlugin(Star):
def __init__(self, context: Context, config: AstrBotConfig):
super().__init__(context)
self.conf = config
print(self.conf)
async def initialize(self):
"""可选择实现异步的插件初始化方法,当实例化该插件类之后会自动调用该方法。"""
@filter.command("剑三日常")
async def jx3_richang(self, event: AstrMessageEvent):
"""剑三日常"""
# 接口URL
custom_url = "https://www.jx3api.com/data/active/calendar"
# 接口参数
params = {
"server": "眉间雪", # 默认服务器
"num": 0 # 默认当天
}
# 获取消息内容
message_str = event.message_str.strip()
parts = message_str.split()
# 解析消息内容
if len(parts) > 1:
params["server"] = parts[1] # 第二个参数为服务器
if len(parts) > 2:
try:
params["num"] = int(parts[2]) # 第三个参数为日期偏移
except ValueError:
params["num"] = 0 # 参数为日期偏移
# 获取数据
data = fetch_jx3_data(custom_url, **params)
if not data:
yield event.plain_result("获取获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 构建回复消息
result_msg = f"{params['server']}-{data.get('date')}-星期{data.get('week')}\n"
result_msg += f"大战:{data.get('war')}\n"
result_msg += f"战场:{data.get('battle')}\n"
result_msg += f"阵营:{data.get('orecar')}\n"
result_msg += f"宗门:{data.get('school')}\n"
result_msg += f"驰援:{data.get('rescue')}\n"
result_msg += f"画像:{data.get('draw')}\n"
result_msg += f"宠物福缘:\n{data.get('luck')}\n"
result_msg += f"家园声望:\n{data.get('card')}\n"
result_msg += f"武林通鉴:\n{data.get('team')}\n"
yield event.plain_result(result_msg)
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
@filter.command("剑三骚话")
async def jx3_shaohua(self, event: AstrMessageEvent):
"""剑三骚话"""
# 接口URL
custom_url = "https://www.jx3api.com/data/saohua/random"
# 接口参数
params = {
"name": "万花", # 默认值
}
# 获取消息内容
# 解析消息内容
# 获取数据
data = fetch_jx3_data(custom_url, **params)
if not data:
yield event.plain_result("获取获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 构建回复消息
result_msg = f"{data.get('text')}\n"
yield event.plain_result(result_msg)
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
@filter.command("剑三技改")
async def jx3_jigai(self, event: AstrMessageEvent):
"""剑三技改"""
# 接口URL
custom_url = "https://www.jx3api.com/data/skills/records"
# 接口参数
params = {
}
# 获取消息内容
# 解析消息内容
# 获取数据
data = fetch_jx3_data(custom_url,**params)
if not data:
yield event.plain_result("获取获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 构建回复消息
result_msg = f"剑网三最近技改\n"
for i, item in enumerate(data[:2], 1):
result_msg += f"{i}. {item.get('title', '无标题')}\n"
result_msg += f"时间:{item.get('time', '未知时间')}\n"
result_msg += f"链接:{item.get('url', '无链接')}\n\n"
yield event.plain_result(result_msg)
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
@filter.command("剑三交易行")
async def jx3_jiaoyihang(self, event: AstrMessageEvent):
"""剑三交易行 服务器 物品名称"""
# 接口参数
params = {
"server": "眉间雪", # 默认服务器
"name": "守缺" # 默认当天
}
# 获取消息内容
message_str = event.message_str.strip()
parts = message_str.split()
# 解析消息内容
if len(parts) > 1:
params["server"] = parts[1] # 第二个参数为服务器
if len(parts) > 2:
params["name"] = parts[2] # 第三个参数为日期偏移
# 获取交易行数据
try:
items_data = fetch_jx3_jiaoyihang(params["server"], params["name"])
if not items_data or items_data == "无交易行数据":
yield event.plain_result(f"在服务器【{params['server']}】未找到物品【{params['name']}】的交易行数据")
return
if not items_data or items_data == "未找到改物品":
yield event.plain_result(f"未找到物品【{params['name']}】")
return
# 加载模板
try:
template_content = load_template("jiaoyihang.html")
except FileNotFoundError as e:
logger.error(f"加载模板失败: {e}")
yield event.plain_result("系统错误:模板文件不存在")
return
# 准备模板渲染数据
render_data = {
"items": items_data,
"server": params["server"],
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
# 调整渲染图片的尺寸
options = {
}
url = await self.html_render(template_content, render_data, options)
yield event.image_result(url)
except Exception as e:
logger.error(f"交易行查询出错: {e}")
yield event.plain_result("查询交易行数据时出错,请稍后再试")
@filter.command("剑三沙盘")
async def jx3_shapan(self, event: AstrMessageEvent):
"""剑三沙盘 服务器"""
# 接口URL
custom_url = "https://www.jianxiachaguan.cn/api2/aijx3-jxcg/game/get-sand-table-img"
# 接口参数
params = {
"serverName": "眉间雪" # 默认服务器
}
# 获取消息内容
message_str = event.message_str.strip()
parts = message_str.split()
# 解析消息内容
if len(parts) > 1:
params["serverName"] = parts[1] # 第二个参数为服务器
# 获取数据
data = api_data(custom_url,params)
if not data:
yield event.plain_result("获取获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 构建回复消息
yield event.image_result(data.get("picUrl"))
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
@filter.command("剑三金价")
async def jx3_jinjia(self, event: AstrMessageEvent):
"""剑三金价 服务器"""
# 接口URL
custom_url = "https://www.jianxiachaguan.cn/api2/aijx3-jxcg/game/get-gold"
# 接口参数
params = {
"serverName": "眉间雪" # 默认服务器
}
# 获取消息内容
message_str = event.message_str.strip()
parts = message_str.split()
# 解析消息内容
if len(parts) > 1:
params["serverName"] = parts[1] # 第二个参数为服务器
# 获取数据
data = api_data(custom_url,params)
if not data:
yield event.plain_result("获取获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 加载模板
try:
template_content = load_template("jinjia.html")
except FileNotFoundError as e:
logger.error(f"加载模板失败: {e}")
yield event.plain_result("系统错误:模板文件不存在")
return
# 准备模板渲染数据
render_data = {
"items": data,
"server": params["serverName"],
"update_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
# 调整渲染图片的尺寸
options = {
}
url = await self.html_render(template_content, render_data, options)
yield event.image_result(url)
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""