在请求中使用异步代替同步防止进程阻塞,优化部分代码样式

This commit is contained in:
snowy 2024-08-15 18:22:24 +08:00
parent b5525ce662
commit fc5931bf33
6 changed files with 161 additions and 82 deletions

3
.gitignore vendored
View File

@ -122,13 +122,14 @@ celerybeat.pid
*.sage.py *.sage.py
# Environments # Environments
.env .env.prod
.venv .venv
env/ env/
venv/ venv/
ENV/ ENV/
env.bak/ env.bak/
venv.bak/ venv.bak/
.idea
# Spyder project settings # Spyder project settings
.spyderproject .spyderproject

View File

@ -25,7 +25,7 @@ __plugin_meta__ = PluginMetadata(
config=ConfigModel, config=ConfigModel,
homepage="https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow", homepage="https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow",
supported_adapters=inherit_supported_adapters("nonebot_plugin_alconna"), supported_adapters=inherit_supported_adapters("nonebot_plugin_alconna"),
extra={"License":"MIT","Author":"Asankilp"} extra={"License":"MIT","Author":"Swankily"}
) )
driver = get_driver() driver = get_driver()

View File

@ -1,50 +1,69 @@
import json import json
import requests from typing import Dict
from aiohttp import ClientSession
from .models import *
from .util 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 = { 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" "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():
'''
返回支持的地区数据 async def get_cities_data() -> CityResp:
''' """
regions_data = json.loads(requests.get(CITY_API_ROOT, headers=HEADERS).text) 返回支持的城市数据
return regions_data """
def get_regions_dict(): 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 返回支持的地区键名为地区名键值为地区id
''' """
dicts = {} data = {}
cityjson = get_regions_data() city_data = await get_cities_data()
for i in cityjson["data"]["list"]: for i in city_data.data.list:
for j in i["city_list"]: for j in i.city_list:
name = j["name"] data.update({
id = j["id"] j.name: j.id
dicts.update({name: id}) })
dicts.update({"全国": -1,"海外": 900000}) #添加api中未返回的结果 data.update({
#print(dicts) "全国": -1,
return dicts "海外": 900000
def get_shows_data(region_id: int, page=1, pagesize=20): })
''' return data
async def get_shows_data(region_id: int, page=1, pagesize=20):
"""
返回举办中/即将举办/取消举办的展览数据 返回举办中/即将举办/取消举办的展览数据
Args: Args:
region_id: 地区id region_id: 地区id
page: 页码 page: 页码
pagesize: 一页最大条目数最大20 pagesize: 一页最大条目数最大20
''' """
param = { param = {
"version": 133, "version" : 133,
"area": region_id, "area" : region_id,
"page": page, "page" : page,
"pagesize": pagesize, "pagesize": pagesize,
"platform": "web", "platform": "web",
"p_type": "展览", "p_type" : "展览",
"style": 1 "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 return shows_data
def process_shows_data_to_text(shows_data: dict): def process_shows_data_to_text(shows_data: dict):
showlist = [] showlist = []
data = shows_data["data"] data = shows_data["data"]
@ -55,7 +74,7 @@ def process_shows_data_to_text(shows_data: dict):
venue_name = i["venue_name"] venue_name = i["venue_name"]
project_id = i["project_id"] project_id = i["project_id"]
sale_flag = i["sale_flag"] sale_flag = i["sale_flag"]
#start_time = i["start_time"] # start_time = i["start_time"]
start_unix = i["start_unix"] start_unix = i["start_unix"]
start_time = convert_timestamp(start_unix) start_time = convert_timestamp(start_unix)
end_time = i["end_time"] end_time = i["end_time"]
@ -66,6 +85,7 @@ def process_shows_data_to_text(shows_data: dict):
showlist.append(text) showlist.append(text)
return showlist return showlist
def process_shows_data_to_template(shows_data: dict): def process_shows_data_to_template(shows_data: dict):
showlist = [] showlist = []
data = shows_data["data"] data = shows_data["data"]
@ -79,7 +99,7 @@ def process_shows_data_to_template(shows_data: dict):
venue_name = i["venue_name"] venue_name = i["venue_name"]
project_id = i["project_id"] project_id = i["project_id"]
sale_flag = i["sale_flag"] sale_flag = i["sale_flag"]
#start_time = i["start_time"] # start_time = i["start_time"]
start_unix = i["start_unix"] start_unix = i["start_unix"]
start_time = convert_timestamp(start_unix) start_time = convert_timestamp(start_unix)
end_time = i["end_time"] end_time = i["end_time"]
@ -88,30 +108,30 @@ def process_shows_data_to_template(shows_data: dict):
district_name = i["district_name"] district_name = i["district_name"]
wish = i["wish"] wish = i["wish"]
cover = "https:" + i["cover"] cover = "https:" + i["cover"]
if district_name == None : district_name = "" if district_name == None: district_name = ""
guests_list = i["guests"] guests_list = i["guests"]
guests = "" guests = ""
if guests_list != None: if guests_list != None:
for n in guests_list: for n in guests_list:
guests += n["name"] + "," guests += n["name"] + ","
item_dict = { item_dict = {
"name": name, "name" : name,
"location": district_name + venue_name, "location" : district_name + venue_name,
"sale_flag": sale_flag, "sale_flag" : sale_flag,
"id": project_id, "id" : project_id,
"price": price_low, "price" : price_low,
"start_time": start_time, "start_time" : start_time,
"end_time": end_time, "end_time" : end_time,
"wish": wish, "wish" : wish,
"image_url": cover, "image_url" : cover,
"guests": guests, "guests" : guests,
"page": page, "page" : page,
"total_pages": total_pages "total_pages": total_pages
} }
showlist.append(item_dict) showlist.append(item_dict)
global_data_dict = { global_data_dict = {
"page": page, "page" : page,
"total_pages": total_pages, "total_pages" : total_pages,
"total_results": total_results "total_results": total_results
} }
return [showlist, global_data_dict] return [showlist, global_data_dict]

View File

@ -1,3 +1,5 @@
import traceback
from nonebot.typing import T_State from nonebot.typing import T_State
from typing import Optional from typing import Optional
from .acgnapis import * from .acgnapis import *
@ -8,6 +10,7 @@ from arclet.alconna import Alconna, Args
from .config import RES_PATH, TEMPLATE_NAME, config from .config import RES_PATH, TEMPLATE_NAME, config
from .util import * from .util import *
from .__init__ import __plugin_meta__ from .__init__ import __plugin_meta__
showcmd = on_alconna( showcmd = on_alconna(
Alconna( Alconna(
"展览", "展览",
@ -17,37 +20,37 @@ showcmd = on_alconna(
showcmd.shortcut( showcmd.shortcut(
r"(?P<region>.+?)展览\s*(?P<page>\d+)?\s*(?P<date>.+)?", r"(?P<region>.+?)展览\s*(?P<page>\d+)?\s*(?P<date>.+)?",
{ {
"prefix": True, "prefix" : True,
"command": "展览", "command": "展览",
"args": ["{region}", "{page}", "{date}"], "args" : ["{region}", "{page}", "{date}"],
} }
) )
@showcmd.handle() @showcmd.handle()
async def find_show( 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 page: page = 1
if not date: date = "" if not date: date = ""
regions_dict = get_regions_dict() regions_dict = await get_regions_dict()
regionid = regions_dict.get(region,None) regionid = regions_dict.get(region, None)
if regionid == None: await UniMessage("不支持此地区").send() ; return if regionid == None: await UniMessage("不支持此地区").send(); return
#await showcmd.send("日期:"+ date) # await showcmd.send("日期:"+ date)
shows = get_shows_data(regionid,page=page,pagesize=config.acgnshow_pagesize) shows = await get_shows_data(regionid, page=page, pagesize=config.acgnshow_pagesize)
# print(shows) # print(shows)
try: try:
showsdata = process_shows_data_to_template(shows) shows_data = process_shows_data_to_template(shows)
template = { template = {
"shows": showsdata[0], "shows" : shows_data[0],
"bgimage": choose_random_bgimage(), "bgimage" : choose_random_bgimage(),
"global_data": showsdata[1] "global_data": shows_data[1]
} }
pic = await template_to_pic(RES_PATH,TEMPLATE_NAME,template) pic = await template_to_pic(RES_PATH, TEMPLATE_NAME, template)
except: except Exception as e:
await UniMessage("发生错误").send() await UniMessage("发生错误").send()
traceback.print_exc()
return return
# print(pic)
# a = Image.open(io.BytesIO(pic)) await UniMessage.image(raw=pic).send()
# a.save("template2pic.png", format="PNG")
await UniMessage.image(pic).send()

View File

@ -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

View File

@ -5,16 +5,16 @@ description = "Nonebot2插件从哔哩哔哩会员购获取简易展览数据
readme = "README.md" readme = "README.md"
requires-python = "<4.0,>=3.9" requires-python = "<4.0,>=3.9"
authors = [ authors = [
{name = "Asankilp", email = "asankilp@outlook.com"}, { name = "Asankilp", email = "asankilp@outlook.com" },
] ]
dependencies = [ dependencies = [
"nonebot2>=2.2.0", "nonebot2[fastapi, websockets]>=2.2.0",
"nonebot-plugin-alconna>=0.48.0", "nonebot-plugin-alconna>=0.48.0",
"nonebot-plugin-htmlrender>=0.3.2", "nonebot-plugin-htmlrender>=0.3.2",
"jinja2>=3.1.4", "jinja2>=3.1.4",
"requests>=2.32.3" "aiohttp>=4.0.0a1",
] ]
license = {text = "MIT"} license = { text = "MIT" }
[project.urls] [project.urls]
Homepage = "https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow" Homepage = "https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow"
@ -23,7 +23,8 @@ Homepage = "https://github.com/LiteyukiStudio/nonebot-plugin-acgnshow"
[tool.nonebot] [tool.nonebot]
plugins = ["nonebot_plugin_acgnshow"] plugins = ["nonebot_plugin_acgnshow"]
adapters = [ adapters = [
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" } { name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" },
] ]