feat✨: 识图 和 buff皮肤查询

This commit is contained in:
HibiKier
2024-05-23 16:26:06 +08:00
parent 1aed19035e
commit bd4106190e
5 changed files with 312 additions and 2 deletions
@@ -0,0 +1,101 @@
from nonebot.permission import SUPERUSER
from nonebot.plugin import PluginMetadata
from nonebot.rule import to_me
from nonebot_plugin_alconna import Alconna, Args, Arparma, Match, on_alconna
from nonebot_plugin_saa import Text
from nonebot_plugin_session import EventSession
from zhenxun.configs.config import NICKNAME
from zhenxun.configs.utils import BaseBlock, PluginExtraData, RegisterConfig
from zhenxun.services.log import logger
from .data_source import get_price, update_buff_cookie
__plugin_meta__ = PluginMetadata(
name="BUFF查询皮肤",
description="BUFF皮肤底价查询",
usage="""
在线实时获取BUFF指定皮肤所有磨损底价
指令:
查询皮肤 [枪械名] [皮肤名称]
示例:查询皮肤 ak47 二西莫夫
""".strip(),
extra=PluginExtraData(
author="HibiKier",
version="0.1",
menu_type="一些工具",
limits=[BaseBlock(result="您有皮肤正在搜索,请稍等...")],
configs=[
RegisterConfig(
key="BUFF_PROXY",
value=None,
help="BUFF代理,有些厂ip可能被屏蔽",
),
RegisterConfig(
key="COOKIE",
value=None,
help="BUFF的账号cookie",
),
],
).dict(),
)
_matcher = on_alconna(
Alconna("查询皮肤", Args["name", str]["skin", str]),
aliases={"皮肤查询"},
priority=5,
block=True,
)
_cookie_matcher = on_alconna(
Alconna("设置cookie", Args["cookie", str]),
rule=to_me(),
permission=SUPERUSER,
priority=1,
)
@_matcher.handle()
async def _(name: Match[str], skin: Match[str]):
if name.available:
_matcher.set_path_arg("name", name.result)
if skin.available:
_matcher.set_path_arg("skin", skin.result)
@_matcher.got_path("name", prompt="要查询什么武器呢?")
@_matcher.got_path("skin", prompt="要查询该武器的什么皮肤呢?")
async def arg_handle(
session: EventSession,
arparma: Arparma,
name: str,
skin: str,
):
if name in ["算了", "取消"] or skin in ["算了", "取消"]:
await Text("已取消操作...").finish()
result = ""
if name in ["ak", "ak47"]:
name = "ak-47"
name = name + " | " + skin
try:
result, status_code = await get_price(name)
except FileNotFoundError:
await Text(f'请先对{NICKNAME}说"设置cookie"来设置cookie!').send(at_sender=True)
if status_code in [996, 997, 998]:
await Text(result).finish()
if result:
logger.info(f"查询皮肤: {name}", arparma.header_result, session=session)
await Text(result).finish()
else:
logger.info(
f" 查询皮肤:{name} 没有查询到", arparma.header_result, session=session
)
await Text("没有查询到哦,请检查格式吧").send()
@_cookie_matcher.handle()
async def _(session: EventSession, arparma: Arparma, cookie: str):
result = update_buff_cookie(cookie)
await Text(result).send(at_sender=True)
logger.info("更新BUFF COOKIE", arparma.header_result, session=session)
@@ -0,0 +1,58 @@
from asyncio.exceptions import TimeoutError
from configs.config import Config
from utils.http_utils import AsyncHttpx
from services.log import logger
url = "https://buff.163.com/api/market/goods"
async def get_price(d_name: str) -> "str, int":
"""
查看皮肤价格
:param d_name: 武器皮肤,如:awp 二西莫夫
"""
cookie = {"session": Config.get_config("search_buff_skin_price", "COOKIE")}
name_list = []
price_list = []
parameter = {"game": "csgo", "page_num": "1", "search": d_name}
try:
response = await AsyncHttpx.get(
url,
proxy=Config.get_config("search_buff_skin_price", "BUFF_PROXY"),
params=parameter,
cookies=cookie,
)
if response.status_code == 200:
try:
if response.text.find("Login Required") != -1:
return "BUFF登录被重置,请联系管理员重新登入", 996
data = response.json()["data"]
total_page = data["total_page"]
data = data["items"]
for _ in range(total_page):
for i in range(len(data)):
name = data[i]["name"]
price = data[i]["sell_reference_price"]
name_list.append(name)
price_list.append(price)
except Exception as e:
logger.error(f"BUFF查询皮肤发生错误 {type(e)}:{e}")
return "没有查询到...", 998
else:
return "访问失败!", response.status_code
except TimeoutError:
return "访问超时! 请重试或稍后再试!", 997
result = f"皮肤: {d_name}({len(name_list)})\n"
for i in range(len(name_list)):
result += name_list[i] + ": " + price_list[i] + "\n"
return result[:-1], 999
def update_buff_cookie(cookie: str) -> str:
Config.set_config("search_buff_skin_price", "COOKIE", cookie)
return "更新cookie成功"
if __name__ == "__main__":
print(get_price("awp 二西莫夫"))