This commit is contained in:
2025-09-18 19:30:18 +08:00
parent c78add7247
commit a4774b272c
10 changed files with 293 additions and 19 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
# helloworld # JX3API
AstrBot 插件模板 AstrBot 插件模板
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
{
"api_token": {
"description": "JX3API的token",
"type": "string",
"default": "",
"hint": "填写购买的JX3API的token,用于访问的付费接口服务"
}
}
View File
Binary file not shown.
Binary file not shown.
+71
View File
@@ -0,0 +1,71 @@
# core/jx3jiaoyihang.py
import requests
import json
from astrbot.api import logger
from urllib.parse import quote
def fetch_jx3_data(api_url=None, **params):
# 函数实现
try:
response = requests.get(api_url, params=params, timeout=10, verify=False)
response.raise_for_status()
data = response.json()
return data
except requests.exceptions.RequestException as e:
logger.error(f"请求出错: {e}")
return None
except json.JSONDecodeError as e:
logger.error(f"JSON解析错误: {e}")
return None
def fetch_jx3_jiaoyihang(inserver="眉间雪", inname="守缺"):
# URL 编码
encoded_text = quote(inname)
custom_url = f"https://node.jx3box.com/item_merged/name/{encoded_text}"
params = {
"strictly": 0
}
data = fetch_jx3_data(custom_url,**params)
# 创建一个空列表来存储结果
filtered_items = []
# 遍历列表中的每个项目
for item in data.get("list", []):
# 提取id和Name字段
filtered_item = {
"id": item.get("id"),
"Name": item.get("Name")
}
# 添加到结果列表
filtered_items.append(filtered_item)
# 提取所有ID
ids = [item.get("id") for item in filtered_items]
# 返回格式化结果
stringids = ",".join(ids) if ids else ""
custom_url = f"https://next2.jx3box.com/api/item-price/list"
params = {
"server": "眉间雪", # 默认服务器
"itemIds": "5_47129" # 默认当天
}
# 接受传入的参数
params["server"]=inserver
params["itemIds"]=stringids
data = fetch_jx3_data(custom_url,**params)
logger.error(f"搜索到物品: \n{filtered_items}\n{params}")
return data.get("data", "无交易行数据")
+24
View File
@@ -0,0 +1,24 @@
# core/request.py
import requests
import json
from astrbot.api import logger
def fetch_jx3_data(api_url=None,outdata="data", **params):
# 函数实现
try:
response = requests.get(api_url, params=params, timeout=10, verify=False)
response.raise_for_status()
data = response.json()
if data.get('code') != 200:
logger.error(f"API返回错误: {data.get('msg', '未知错误')}")
return None
return data.get(outdata, {})
except requests.exceptions.RequestException as e:
logger.error(f"请求出错: {e}")
return None
except json.JSONDecodeError as e:
logger.error(f"JSON解析错误: {e}")
return None
+184 -13
View File
@@ -1,24 +1,195 @@
import requests
import json
import urllib3
from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult
from astrbot.api.star import Context, Star, register from astrbot.api.star import Context, Star, register
from astrbot.api import logger from astrbot.api import logger
from astrbot.api import AstrBotConfig
@register("helloworld", "YourName", "一个简单的 Hello World 插件", "1.0.0") from .core.request import fetch_jx3_data
class MyPlugin(Star): from .core.jx3jiaoyihang import fetch_jx3_jiaoyihang
def __init__(self, context: Context): # 禁用 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) super().__init__(context)
self.conf = config
print(self.conf)
async def initialize(self): async def initialize(self):
"""可选择实现异步的插件初始化方法,当实例化该插件类之后会自动调用该方法。""" """可选择实现异步的插件初始化方法,当实例化该插件类之后会自动调用该方法。"""
# 注册指令的装饰器。指令名为 helloworld。注册成功后,发送 `/helloworld` 就会触发这个指令,并回复 `你好, {user_name}!` @filter.command("剑三日常")
@filter.command("helloworld") async def jx3_richang(self, event: AstrMessageEvent):
async def helloworld(self, event: AstrMessageEvent): """获取剑网3日常活动信息"""
"""这是一个 hello world 指令""" # 这是 handler 的描述,将会被解析方便用户了解插件内容。建议填写。 # 接口URL
user_name = event.get_sender_name() custom_url = "https://www.jx3api.com/data/active/calendar"
message_str = event.message_str # 用户发的纯文本消息字符串 # 接口参数
message_chain = event.get_messages() # 用户所发的消息的消息链 # from astrbot.api.message_components import * params = {
logger.info(message_chain) "server": "眉间雪", # 默认服务器
yield event.plain_result(f"Hello, {user_name}, 你发了 {message_str}!") # 发送一条纯文本消息 "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("处理接口返回信息时出错")
async def terminate(self): async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。""" """可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
@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("处理接口返回信息时出错")
async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
@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("处理接口返回信息时出错")
async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
@filter.command("剑三交易行")
async def jx3_jiaoyihang(self, event: AstrMessageEvent):
"""获取剑网3交易行信息"""
# 接口参数
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] # 第三个参数为日期偏移
# 获取数据
data = fetch_jx3_jiaoyihang(params["server"], params["name"])
if not data:
yield event.plain_result("获取接口信息失败,请稍后再试")
return
# 格式化返回消息
try:
# 构建回复消息
result_msg = f"{data}\n"
yield event.plain_result(result_msg)
except Exception as e:
logger.error(f"处理数据时出错: {e}")
yield event.plain_result("处理接口返回信息时出错")
async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
+5 -5
View File
@@ -1,5 +1,5 @@
name: helloworld # 这是你的插件的唯一识别名。 name: jx3api # 这是你的插件的唯一识别名。
desc: 这是 AstrBot 的默认插件,支持关键词回复。 # 插件简短描述 desc: 通过接口调用剑网三API接口获取游戏数据 # 插件简短描述
version: v1.3 # 插件版本号。格式:v1.1.1 或者 v1.1 version: v1.0.0 # 插件版本号。格式:v1.1.1 或者 v1.1
author: Soulter # 作者 author: fxdyz # 作者
repo: https://github.com/Soulter/helloworld # 插件的仓库地址 repo: https://github.com/qsc20001102/astrbot_plugin_jx3api # 插件的仓库地址