From fc5931bf3332f75f23339480a6175eefac23c508 Mon Sep 17 00:00:00 2001 From: snowy Date: Thu, 15 Aug 2024 18:22:24 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E5=9C=A8=E8=AF=B7=E6=B1=82=E4=B8=AD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=BC=82=E6=AD=A5=E4=BB=A3=E6=9B=BF=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=98=B2=E6=AD=A2=E8=BF=9B=E7=A8=8B=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- nonebot_plugin_acgnshow/__init__.py | 2 +- nonebot_plugin_acgnshow/acgnapis.py | 128 +++++++++++++++----------- nonebot_plugin_acgnshow/acgnshower.py | 45 ++++----- nonebot_plugin_acgnshow/models.py | 54 +++++++++++ pyproject.toml | 11 ++- 6 files changed, 161 insertions(+), 82 deletions(-) create mode 100644 nonebot_plugin_acgnshow/models.py diff --git a/.gitignore b/.gitignore index a4bac96..71d17b8 100644 --- a/.gitignore +++ b/.gitignore @@ -122,13 +122,14 @@ celerybeat.pid *.sage.py # Environments -.env +.env.prod .venv env/ venv/ ENV/ env.bak/ venv.bak/ +.idea # Spyder project settings .spyderproject diff --git a/nonebot_plugin_acgnshow/__init__.py b/nonebot_plugin_acgnshow/__init__.py index 5adf2ec..10c90e7 100644 --- a/nonebot_plugin_acgnshow/__init__.py +++ b/nonebot_plugin_acgnshow/__init__.py @@ -25,7 +25,7 @@ __plugin_meta__ = PluginMetadata( config=ConfigModel, homepage="https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow", supported_adapters=inherit_supported_adapters("nonebot_plugin_alconna"), - extra={"License":"MIT","Author":"Asankilp"} + extra={"License":"MIT","Author":"Swankily"} ) driver = get_driver() diff --git a/nonebot_plugin_acgnshow/acgnapis.py b/nonebot_plugin_acgnshow/acgnapis.py index 6039ee2..d6de04f 100644 --- a/nonebot_plugin_acgnshow/acgnapis.py +++ b/nonebot_plugin_acgnshow/acgnapis.py @@ -1,50 +1,69 @@ import json -import requests +from typing import Dict + +from aiohttp import ClientSession + +from .models import * from .util import * -CITY_API_ROOT="https://show.bilibili.com/api/ticket/city/list?channel=3" -SHOWS_API_ROOT="https://show.bilibili.com/api/ticket/project/listV2" + +CITY_API_ROOT = "https://show.bilibili.com/api/ticket/city/list?channel=3" +SHOWS_API_ROOT = "https://show.bilibili.com/api/ticket/project/listV2" HEADERS = { - "user-agent": "Mozilla/5.0 (Linux; Android 14; 114514YAJU Build/UKQ1.114514.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.165 Mobile Safari/537.36 BiliApp/7810200 mobi_app/android isNotchWindow/0 NotchHeight=34 mallVersion/7810200 mVersion/242 disable_rcmd/0 7.81.0 os/android model/114514YAJU mobi_app/android build/7810200 channel/bilih5 innerVer/7810210 osVer/14 network/2" - } -def get_regions_data(): - ''' - 返回支持的地区数据 - ''' - regions_data = json.loads(requests.get(CITY_API_ROOT, headers=HEADERS).text) - return regions_data -def get_regions_dict(): - ''' + "user-agent": "Mozilla/5.0 (Linux; Android 14; 114514YAJU Build/UKQ1.114514.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.165 Mobile Safari/537.36 BiliApp/7810200 mobi_app/android isNotchWindow/0 NotchHeight=34 mallVersion/7810200 mVersion/242 disable_rcmd/0 7.81.0 os/android model/114514YAJU mobi_app/android build/7810200 channel/bilih5 innerVer/7810210 osVer/14 network/2" +} + + +async def get_cities_data() -> CityResp: + """ + 返回支持的城市数据 + """ + async with ClientSession() as session: + async with session.get(CITY_API_ROOT, headers=HEADERS) as resp: + regions_data = await resp.json() + return CityResp.model_validate(regions_data) + + +async def get_regions_dict() -> Dict[str, int]: + """ 返回支持的地区,键名为地区名,键值为地区id - ''' - dicts = {} - cityjson = get_regions_data() - for i in cityjson["data"]["list"]: - for j in i["city_list"]: - name = j["name"] - id = j["id"] - dicts.update({name: id}) - dicts.update({"全国": -1,"海外": 900000}) #添加api中未返回的结果 - #print(dicts) - return dicts -def get_shows_data(region_id: int, page=1, pagesize=20): - ''' + """ + data = {} + city_data = await get_cities_data() + for i in city_data.data.list: + for j in i.city_list: + data.update({ + j.name: j.id + }) + data.update({ + "全国": -1, + "海外": 900000 + }) + return data + + +async def get_shows_data(region_id: int, page=1, pagesize=20): + """ 返回举办中/即将举办/取消举办的展览数据 Args: region_id: 地区id page: 页码 pagesize: 一页最大条目数,最大20 - ''' + """ param = { - "version": 133, - "area": region_id, - "page": page, - "pagesize": pagesize, - "platform": "web", - "p_type": "展览", - "style": 1 + "version" : 133, + "area" : region_id, + "page" : page, + "pagesize": pagesize, + "platform": "web", + "p_type" : "展览", + "style" : 1 } - shows_data = json.loads(requests.get(SHOWS_API_ROOT, headers=HEADERS,params=param).text) + async with ClientSession() as session: + async with session.get(SHOWS_API_ROOT, headers=HEADERS, params=param) as resp: + shows_data = await resp.json() return shows_data + + def process_shows_data_to_text(shows_data: dict): showlist = [] data = shows_data["data"] @@ -55,7 +74,7 @@ def process_shows_data_to_text(shows_data: dict): venue_name = i["venue_name"] project_id = i["project_id"] sale_flag = i["sale_flag"] - #start_time = i["start_time"] + # start_time = i["start_time"] start_unix = i["start_unix"] start_time = convert_timestamp(start_unix) end_time = i["end_time"] @@ -66,6 +85,7 @@ def process_shows_data_to_text(shows_data: dict): showlist.append(text) return showlist + def process_shows_data_to_template(shows_data: dict): showlist = [] data = shows_data["data"] @@ -79,7 +99,7 @@ def process_shows_data_to_template(shows_data: dict): venue_name = i["venue_name"] project_id = i["project_id"] sale_flag = i["sale_flag"] - #start_time = i["start_time"] + # start_time = i["start_time"] start_unix = i["start_unix"] start_time = convert_timestamp(start_unix) end_time = i["end_time"] @@ -88,30 +108,30 @@ def process_shows_data_to_template(shows_data: dict): district_name = i["district_name"] wish = i["wish"] cover = "https:" + i["cover"] - if district_name == None : district_name = "" + if district_name == None: district_name = "" guests_list = i["guests"] guests = "" if guests_list != None: for n in guests_list: guests += n["name"] + "," item_dict = { - "name": name, - "location": district_name + venue_name, - "sale_flag": sale_flag, - "id": project_id, - "price": price_low, - "start_time": start_time, - "end_time": end_time, - "wish": wish, - "image_url": cover, - "guests": guests, - "page": page, - "total_pages": total_pages - } + "name" : name, + "location" : district_name + venue_name, + "sale_flag" : sale_flag, + "id" : project_id, + "price" : price_low, + "start_time" : start_time, + "end_time" : end_time, + "wish" : wish, + "image_url" : cover, + "guests" : guests, + "page" : page, + "total_pages": total_pages + } showlist.append(item_dict) global_data_dict = { - "page": page, - "total_pages": total_pages, - "total_results": total_results + "page" : page, + "total_pages" : total_pages, + "total_results": total_results } return [showlist, global_data_dict] diff --git a/nonebot_plugin_acgnshow/acgnshower.py b/nonebot_plugin_acgnshow/acgnshower.py index 4233714..11abca1 100644 --- a/nonebot_plugin_acgnshow/acgnshower.py +++ b/nonebot_plugin_acgnshow/acgnshower.py @@ -1,3 +1,5 @@ +import traceback + from nonebot.typing import T_State from typing import Optional from .acgnapis import * @@ -8,6 +10,7 @@ from arclet.alconna import Alconna, Args from .config import RES_PATH, TEMPLATE_NAME, config from .util import * from .__init__ import __plugin_meta__ + showcmd = on_alconna( Alconna( "展览", @@ -17,37 +20,37 @@ showcmd = on_alconna( showcmd.shortcut( r"(?P.+?)展览\s*(?P\d+)?\s*(?P.+)?", { - "prefix": True, - "command": "展览", - "args": ["{region}", "{page}", "{date}"], + "prefix" : True, + "command": "展览", + "args" : ["{region}", "{page}", "{date}"], } ) + @showcmd.handle() async def find_show( - state: T_State, region: Optional[str] = None, page: Optional[int] = None, date: Optional[str] = None, + region: Optional[str] = None, page: Optional[int] = None, date: Optional[str] = None, ): - if not region: await UniMessage(__plugin_meta__.usage).send() ; return + if not region: await UniMessage(__plugin_meta__.usage).send(); return if not page: page = 1 if not date: date = "" - regions_dict = get_regions_dict() - regionid = regions_dict.get(region,None) - if regionid == None: await UniMessage("不支持此地区").send() ; return - #await showcmd.send("日期:"+ date) - shows = get_shows_data(regionid,page=page,pagesize=config.acgnshow_pagesize) + regions_dict = await get_regions_dict() + regionid = regions_dict.get(region, None) + if regionid == None: await UniMessage("不支持此地区").send(); return + # await showcmd.send("日期:"+ date) + shows = await get_shows_data(regionid, page=page, pagesize=config.acgnshow_pagesize) # print(shows) try: - showsdata = process_shows_data_to_template(shows) + shows_data = process_shows_data_to_template(shows) template = { - "shows": showsdata[0], - "bgimage": choose_random_bgimage(), - "global_data": showsdata[1] - } - pic = await template_to_pic(RES_PATH,TEMPLATE_NAME,template) - except: + "shows" : shows_data[0], + "bgimage" : choose_random_bgimage(), + "global_data": shows_data[1] + } + pic = await template_to_pic(RES_PATH, TEMPLATE_NAME, template) + except Exception as e: await UniMessage("发生错误").send() + traceback.print_exc() return - # print(pic) - # a = Image.open(io.BytesIO(pic)) - # a.save("template2pic.png", format="PNG") - await UniMessage.image(pic).send() \ No newline at end of file + + await UniMessage.image(raw=pic).send() diff --git a/nonebot_plugin_acgnshow/models.py b/nonebot_plugin_acgnshow/models.py new file mode 100644 index 0000000..b1afa0e --- /dev/null +++ b/nonebot_plugin_acgnshow/models.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +""" +Copyright (C) 2020-2024 LiteyukiStudio. All Rights Reserved + +@Time : 2024/8/15 下午5:50 +@Author : snowykami +@Email : snowykami@outlook.com +@File : models.py +@Software: PyCharm +""" +from typing import List + +from pydantic import BaseModel + + +class City(BaseModel): + """ + 热门城市 + """ + id: int + type: int + first_letter: str + name: str + fullname: str + num: int + parent_id: int + booked: bool + + +class CityDataList(BaseModel): + """ + 城市首字母 + """ + letter: str + city_list: List[City] + + +class CityData(BaseModel): + """ + 城市数据 + """ + hot: List[City] + list: List[CityDataList] + located_id: int + + +class CityResp(BaseModel): + """ + 城市数据 + """ + errno: int + errtag: int + msg: str + data: CityData diff --git a/pyproject.toml b/pyproject.toml index 3e0b1bd..02e9a72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,16 +5,16 @@ description = "Nonebot2插件,从哔哩哔哩会员购获取简易展览数据 readme = "README.md" requires-python = "<4.0,>=3.9" authors = [ - {name = "Asankilp", email = "asankilp@outlook.com"}, + { name = "Asankilp", email = "asankilp@outlook.com" }, ] dependencies = [ - "nonebot2>=2.2.0", + "nonebot2[fastapi, websockets]>=2.2.0", "nonebot-plugin-alconna>=0.48.0", "nonebot-plugin-htmlrender>=0.3.2", "jinja2>=3.1.4", - "requests>=2.32.3" + "aiohttp>=4.0.0a1", ] -license = {text = "MIT"} +license = { text = "MIT" } [project.urls] Homepage = "https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow" @@ -23,7 +23,8 @@ Homepage = "https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow" [tool.nonebot] plugins = ["nonebot_plugin_acgnshow"] adapters = [ - { name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" } + { name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" }, + ]