From 596315fe00ca627731ba55fcc276e8ba5ff6ae0b Mon Sep 17 00:00:00 2001
From: divandia <106718176+Cvandia@users.noreply.github.com>
Date: Sat, 30 Mar 2024 09:47:45 +0800
Subject: [PATCH] Update Genshin Cos plugin version and add support for ZZZ cos
images
---
README.md | 2 +-
nonebot_plugin_genshin_cos/__init__.py | 34 +++++++----
nonebot_plugin_genshin_cos/hoyospider.py | 32 ++++++-----
nonebot_plugin_genshin_cos/utils.py | 72 ++++++++++++++++--------
pyproject.toml | 2 +-
5 files changed, 90 insertions(+), 52 deletions(-)
diff --git a/README.md b/README.md
index d975ce1..33ea430 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ _⭐基于Nonebot2的一款获取米游社cos的插件⭐_
-### 目前不仅有原神,现在支持崩坏3、星穹铁道、大别野的cos图!
+### 目前不仅有原神,现在支持崩坏3、星穹铁道、大别野、绝区零的cos图!
diff --git a/nonebot_plugin_genshin_cos/__init__.py b/nonebot_plugin_genshin_cos/__init__.py
index d998bc6..d91c39c 100644
--- a/nonebot_plugin_genshin_cos/__init__.py
+++ b/nonebot_plugin_genshin_cos/__init__.py
@@ -31,7 +31,7 @@
"unique_name": "genshin_cos",
"example": "保存cos:保存cos图片至本地文件",
"author": "divandia <106718176+Cvandia@users.noreply.github.com>",
- "version": "0.2.8",
+ "version": "0.3.0",
},
)
logo = """
@@ -88,7 +88,9 @@
"精品cos", aliases={"精品coser", "精品cos图"}, block=False, priority=5
)
search_cos = on_regex(
- r"^搜索(原神|崩坏3|星穹铁道|大别野)cos[r]?[图]?(.+)?", block=False, priority=5
+ r"^搜索(原神|崩坏3|星穹铁道|大别野|绝区零)cos[r]?[图]?(.+)?",
+ block=False,
+ priority=5,
)
turn_aps = on_regex(
r"^(开启|关闭)每日推送(原神|崩坏3|星穹铁道|大别野)(\s)?(.+)?",
@@ -125,6 +127,8 @@ async def _(
search_class = Search(ForumType.DBYCOS, groups[0])
elif args[0] == "星穹铁道":
search_class = Search(ForumType.StarRailCos, groups[0])
+ elif args[0] == "绝区零":
+ search_class = Search(ForumType.ZZZ, groups[0])
else:
await search_cos.finish("暂不支持该类型")
await send_images(bot, matcher, groups, event, search_class)
@@ -149,6 +153,8 @@ async def _(event: GroupMessageEvent, args: Tuple[str, ...] = RegexGroup()):
await turn_aps.finish("未安装apscheduler插件,无法使用此功能")
mode = args[0]
game_type = args[1]
+ if game_type not in GENSHIN_NAME + DBY_NAME:
+ await turn_aps.finish("暂不支持其他类型的订阅,仅支持原神和大别野")
time = args[3]
aps_group_id = str(event.group_id)
MyConfig = CONFIG.copy()
@@ -205,6 +211,8 @@ async def _(
send_type = dbycos_hot
elif args[0] in STAR_RAIL:
send_type = starrail_hot
+ elif args[0] in ZZZ_NAME:
+ send_type = zzz_hot
else:
await hot_cos.finish("暂不支持该类型")
await send_images(bot, matcher, args, event, send_type)
@@ -229,12 +237,8 @@ async def _(
if args[0] in GENSHIN_NAME:
send_type = Rank(ForumType.GenshinCos, rank_type)
- elif args[0] in HONKAI3RD_NAME:
- send_type = Rank(ForumType.Honkai3rdPic, rank_type)
elif args[0] in DBY_NAME:
send_type = Rank(ForumType.DBYCOS, rank_type)
- elif args[0] in STAR_RAIL:
- send_type = Rank(ForumType.StarRailCos, rank_type)
else:
await rank_cos.finish("暂不支持该类型")
await send_images(bot, matcher, args, event, send_type)
@@ -255,6 +259,8 @@ async def _(
send_type = dbycos_latest_comment
elif args[0] in STAR_RAIL:
send_type = starrail_latest_comment
+ elif args[0] in ZZZ_NAME:
+ send_type = zzz_latest_comment
else:
await latest_cos.finish("暂不支持该类型")
await send_images(bot, matcher, args, event, send_type)
@@ -273,6 +279,8 @@ async def _(
send_type = honkai3rd_good
elif args[0] in DBY_NAME:
send_type = dbycos_good
+ elif args[0] in ZZZ_NAME:
+ send_type = zzz_good
elif args[0] in STAR_RAIL:
await good_cos.finish("星穹铁道暂不支持精品cos")
else:
@@ -292,6 +300,10 @@ async def got_type(game_type: str = ArgPlainText()):
hot = honkai3rd_hot
elif game_type in STAR_RAIL:
hot = starrail_hot
+ elif game_type in ZZZ_NAME:
+ hot = zzz_hot
+ else:
+ await download_cos.finish("暂不支持该类型")
image_urls = await hot.async_get_urls()
if not image_urls:
await download_cos.finish(f"没有找到{game_type}的cos图片")
@@ -330,10 +342,6 @@ async def aps_send(aps_goup_id: str):
send_type = genshin_rank_daily
elif game_type in DBY_NAME:
send_type = dbycos_rank_daily
- elif game_type in HONKAI3RD_NAME:
- send_type = honkai3rd_rank_daily
- elif game_type in STAR_RAIL:
- send_type = starrail_rank_daily
else:
continue
image_list = await send_type.async_get_urls(page_size=5)
@@ -387,8 +395,10 @@ async def send_images(
await matcher.send(f"获取{num}张图片中…请稍等")
msg_list = [MessageSegment.text(f"✅找到最新的一些{args[0]}图如下:✅")]
image_list = await send_type.async_get_urls()
- '''random随机从列表中取出num个元素'''
- image_list = [image_list[i] for i in random.sample(range(len(image_list)), num)]
+ """random随机从列表中取出num个元素"""
+ image_list = [
+ image_list[i] for i in random.sample(range(len(image_list)), num)
+ ]
if num > len(image_list):
await matcher.finish(
f"最多只能获取{len(image_list)}张图片", at_sender=True
diff --git a/nonebot_plugin_genshin_cos/hoyospider.py b/nonebot_plugin_genshin_cos/hoyospider.py
index 5b70c9f..6882c99 100644
--- a/nonebot_plugin_genshin_cos/hoyospider.py
+++ b/nonebot_plugin_genshin_cos/hoyospider.py
@@ -169,6 +169,7 @@ class GameType(Enum):
DBY = 5 # 大别野
StarRail = 6 # 星穹铁道
Honkai2 = 3 # 崩坏2
+ ZZZ = 8 # 绝区零
@unique
@@ -185,7 +186,7 @@ class ForumType(Enum):
StarRailPic = 56 # 星穹铁道同人图
StarRailCos = 62 # 星穹铁道cos
Honkai2Pic = 40 # 崩坏2同人图
- TearsOfThemisPic = 38 # 泪水同人图
+ ZZZ = 65 # 绝区零
def get_gids(forum: str) -> GameType:
@@ -201,6 +202,7 @@ def get_gids(forum: str) -> GameType:
"StarRailPic": GameType.StarRail,
"Honkai2Pic": GameType.Honkai2,
"StarRailCos": GameType.StarRail,
+ "ZZZ": GameType.ZZZ,
}
return forum2gids[forum]
@@ -359,13 +361,14 @@ def sync_get_name(self, page_size: int = 20) -> List:
async def async_get_name(self, page_size: int = 20) -> List:
params = self.get_params(page_size)
return await self.async_name(params)
-
+
class Search(HoyoBasicSpider):
- '''
+ """
搜索帖子
url: https://bbs.mihoyo.com/ys/searchPost?keyword=原神
- '''
+ """
+
def __init__(self, forum_id: ForumType, keyword: str) -> None:
super().__init__()
self.api = self.base_url + "searchPosts"
@@ -375,31 +378,26 @@ def __init__(self, forum_id: ForumType, keyword: str) -> None:
self.keyword = keyword + "+cos"
def get_params(self, page_size: int) -> Dict:
- params = {
- "gids": self.gids,
- "size": page_size,
- "keyword": self.keyword
- }
+ params = {"gids": self.gids, "size": page_size, "keyword": self.keyword}
return params
-
+
def sync_get_urls(self, page_size: int = 20) -> List:
params = self.get_params(page_size)
return self.sync_get(params, is_good=True)
-
+
async def async_get_urls(self, page_size: int = 20) -> List:
params = self.get_params(page_size)
return await self.async_get(params, is_good=True)
-
+
def sync_get_name(self, page_size: int = 20) -> List:
params = self.get_params(page_size)
return self.sync_name(params, is_good=True)
-
+
async def async_get_name(self, page_size: int = 20) -> List:
params = self.get_params(page_size)
return await self.async_name(params, is_good=True)
-
# 实例化对象
genshin_rank_daily = Rank(ForumType.GenshinCos, RankType.Daily)
@@ -430,4 +428,8 @@ async def async_get_name(self, page_size: int = 20) -> List:
dbycos_rank_daily = Rank(ForumType.DBYCOS, RankType.Daily)
dbycos_hot = Hot(ForumType.DBYCOS)
dbycos_good = Good(ForumType.DBYCOS)
-dbycos_latest_comment = Latest(ForumType.DBYCOS, LatestType.LatestComment)
\ No newline at end of file
+dbycos_latest_comment = Latest(ForumType.DBYCOS, LatestType.LatestComment)
+
+zzz_hot = Hot(ForumType.ZZZ)
+zzz_good = Good(ForumType.ZZZ)
+zzz_latest_comment = Latest(ForumType.ZZZ, LatestType.LatestComment)
diff --git a/nonebot_plugin_genshin_cos/utils.py b/nonebot_plugin_genshin_cos/utils.py
index 82aa3f2..86fd535 100644
--- a/nonebot_plugin_genshin_cos/utils.py
+++ b/nonebot_plugin_genshin_cos/utils.py
@@ -6,7 +6,14 @@
import httpx
from httpx import TimeoutException
from nonebot import get_driver
-from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, MessageSegment, Message, GROUP_ADMIN, GROUP_OWNER
+from nonebot.adapters.onebot.v11 import (
+ Bot,
+ MessageEvent,
+ GroupMessageEvent,
+ Message,
+ GROUP_ADMIN,
+ GROUP_OWNER,
+)
from nonebot.exception import ActionFailed
from nonebot.log import logger
from nonebot.matcher import Matcher
@@ -18,15 +25,29 @@
# 拓展的异常类和函数
SUPER_PERMISSION = GROUP_ADMIN | GROUP_OWNER | SUPERUSER
-GENSHIN_NAME = ["原神", 'OP', 'op', '欧泡', '⭕', '🅾️', '🅾️P', '🅾️p', '原', '圆', '原']
-HONKAI3RD_NAME = ['崩坏3', '崩崩崩', '蹦蹦蹦', '崩坏三', '崩三', '崩崩崩三', '崩坏3rd', '崩坏3Rd', '崩坏3RD', '崩坏3rd',
- '崩坏3RD', '崩坏3Rd']
-DBY_NAME = ['大别野', 'DBY', 'dby']
-STAR_RAIL = ['星穹铁道', '星穹', '崩铁', '铁道', '星铁', '穹p', '穹铁']
+GENSHIN_NAME = ["原神", "OP", "op", "欧泡", "⭕", "🅾️", "🅾️P", "🅾️p", "原", "圆", "原"]
+HONKAI3RD_NAME = [
+ "崩坏3",
+ "崩崩崩",
+ "蹦蹦蹦",
+ "崩坏三",
+ "崩三",
+ "崩崩崩三",
+ "崩坏3rd",
+ "崩坏3Rd",
+ "崩坏3RD",
+ "崩坏3rd",
+ "崩坏3RD",
+ "崩坏3Rd",
+]
+DBY_NAME = ["大别野", "DBY", "dby"]
+STAR_RAIL = ["星穹铁道", "星穹", "崩铁", "铁道", "星铁", "穹p", "穹铁"]
+ZZZ_NAME = ["绝区零", "绝零区", "绝零", "0", "零", "绝区", "0区"]
class WriteError(Exception):
"""写入错误"""
+
pass
@@ -52,7 +73,7 @@ def check_cd(user_id: int, user_data: Dict[str, datetime]) -> Tuple[bool, int, d
data = user_data
if str(user_id) not in data:
data[str(user_id)] = datetime.now()
- if datetime.now() < data[f'{user_id}']:
+ if datetime.now() < data[f"{user_id}"]:
delta = (data[str(user_id)] - datetime.now()).seconds
return False, delta, data
else:
@@ -61,44 +82,49 @@ def check_cd(user_id: int, user_data: Dict[str, datetime]) -> Tuple[bool, int, d
async def download_from_urls(urls: List[str], path: Path):
- '''
+ """
下载图片
:param urls: 图片链接
:param path: 保存路径
:return: None
- '''
+ """
is_download_error = False
error_cnt = 0
success_cnt = 0
if not path.exists():
path.mkdir(parents=True)
if not path.is_dir():
- raise WriteError('路径不是文件夹')
+ raise WriteError("路径不是文件夹")
async with httpx.AsyncClient() as client:
for url in urls:
try:
- filename = url.split('/')[-1]
+ filename = url.split("/")[-1]
new_path = path / filename
rsp = await client.get(url)
content = rsp.content
- with open(new_path, 'wb') as f:
+ with open(new_path, "wb") as f:
f.write(content)
- except (httpx.ConnectError, httpx.RequestError, httpx.ReadTimeout, TimeoutException):
+ except (
+ httpx.ConnectError,
+ httpx.RequestError,
+ httpx.ReadTimeout,
+ TimeoutException,
+ ):
is_download_error = True
error_cnt += 1
continue
if is_download_error:
- raise WriteError(f'有{error_cnt}张图片由于超时下载失败了')
+ raise WriteError(f"有{error_cnt}张图片由于超时下载失败了")
success_cnt += 1
- logger.success(f'下载{success_cnt}张成功')
+ logger.success(f"下载{success_cnt}张成功")
async def send_forward_msg(
- bot: Bot,
- event: MessageEvent,
- name: str,
- uin: str,
- msgs: list,
+ bot: Bot,
+ event: MessageEvent,
+ name: str,
+ uin: str,
+ msgs: list,
) -> dict:
"""调用合并转发API
@@ -141,11 +167,11 @@ def to_json(msg: Message):
async def send_regular_msg(matcher: Matcher, messages: list):
- '''
+ """
发送常规消息
:param matcher: Matcher
:param messages: 消息列表
- '''
+ """
cnt = 1
for msg in messages:
try:
@@ -154,4 +180,4 @@ async def send_regular_msg(matcher: Matcher, messages: list):
await sleep(DELAY)
except ActionFailed:
if cnt <= 2:
- await matcher.send('消息可能风控,请尝试更改为合并转发模式')
+ await matcher.send("消息可能风控,请尝试更改为合并转发模式")
diff --git a/pyproject.toml b/pyproject.toml
index aadf10e..ddeb9fe 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "nonebot-plugin-genshin-cos"
-version = "0.2.8"
+version = "0.3.0"
description = "米游社原神cos图获取"
authors = ["Cvandia <106718176+Cvandia@users.noreply.github.com>"]
license = "MIT"