diff --git a/README.md b/README.md index ae9c1f0..cfca54a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# helloworld +# JX3API AstrBot 插件模板 diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000..2f61c24 Binary files /dev/null and b/__pycache__/main.cpython-313.pyc differ diff --git a/_conf_schema.json b/_conf_schema.json new file mode 100644 index 0000000..7fe4d6e --- /dev/null +++ b/_conf_schema.json @@ -0,0 +1,8 @@ +{ + "api_token": { + "description": "JX3API的token", + "type": "string", + "default": "", + "hint": "填写购买的JX3API的token,用于访问的付费接口服务" + } +} \ No newline at end of file diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/__pycache__/__init__.cpython-313.pyc b/core/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..e008624 Binary files /dev/null and b/core/__pycache__/__init__.cpython-313.pyc differ diff --git a/core/__pycache__/request.cpython-313.pyc b/core/__pycache__/request.cpython-313.pyc new file mode 100644 index 0000000..506f62b Binary files /dev/null and b/core/__pycache__/request.cpython-313.pyc differ diff --git a/core/jx3jiaoyihang.py b/core/jx3jiaoyihang.py new file mode 100644 index 0000000..4410fd5 --- /dev/null +++ b/core/jx3jiaoyihang.py @@ -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", "无交易行数据") + diff --git a/core/request.py b/core/request.py new file mode 100644 index 0000000..b3f8c26 --- /dev/null +++ b/core/request.py @@ -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 diff --git a/main.py b/main.py index 99ca4be..06df2ed 100644 --- a/main.py +++ b/main.py @@ -1,24 +1,195 @@ +import requests +import json +import urllib3 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 -@register("helloworld", "YourName", "一个简单的 Hello World 插件", "1.0.0") -class MyPlugin(Star): - def __init__(self, context: Context): +from .core.request import fetch_jx3_data +from .core.jx3jiaoyihang import fetch_jx3_jiaoyihang +# 禁用 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): """可选择实现异步的插件初始化方法,当实例化该插件类之后会自动调用该方法。""" - - # 注册指令的装饰器。指令名为 helloworld。注册成功后,发送 `/helloworld` 就会触发这个指令,并回复 `你好, {user_name}!` - @filter.command("helloworld") - async def helloworld(self, event: AstrMessageEvent): - """这是一个 hello world 指令""" # 这是 handler 的描述,将会被解析方便用户了解插件内容。建议填写。 - user_name = event.get_sender_name() - message_str = event.message_str # 用户发的纯文本消息字符串 - message_chain = event.get_messages() # 用户所发的消息的消息链 # from astrbot.api.message_components import * - logger.info(message_chain) - yield event.plain_result(f"Hello, {user_name}, 你发了 {message_str}!") # 发送一条纯文本消息 + + @filter.command("剑三日常") + async def jx3_richang(self, event: AstrMessageEvent): + """获取剑网3日常活动信息""" + # 接口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("处理接口返回信息时出错") 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): + """可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。""" \ No newline at end of file diff --git a/metadata.yaml b/metadata.yaml index c8d3f94..28603d4 100644 --- a/metadata.yaml +++ b/metadata.yaml @@ -1,5 +1,5 @@ -name: helloworld # 这是你的插件的唯一识别名。 -desc: 这是 AstrBot 的默认插件,支持关键词回复。 # 插件简短描述 -version: v1.3 # 插件版本号。格式:v1.1.1 或者 v1.1 -author: Soulter # 作者 -repo: https://github.com/Soulter/helloworld # 插件的仓库地址 +name: jx3api # 这是你的插件的唯一识别名。 +desc: 通过接口调用剑网三API接口获取游戏数据 # 插件简短描述 +version: v1.0.0 # 插件版本号。格式:v1.1.1 或者 v1.1 +author: fxdyz # 作者 +repo: https://github.com/qsc20001102/astrbot_plugin_jx3api # 插件的仓库地址