mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
修复色图重复发送相同图片
This commit is contained in:
parent
2796083c4c
commit
ea54edcbcf
@ -331,6 +331,10 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能
|
||||
|
||||
## 更新
|
||||
|
||||
### 2023/3/18
|
||||
|
||||
* 修复色图重复发送相同图片
|
||||
|
||||
### 2023/3/12 \[v0.1.6.7]
|
||||
|
||||
* 新增`更新武器箱ALL`命令来更新所有武器箱
|
||||
|
||||
@ -13,12 +13,13 @@ from nonebot.adapters.onebot.v11 import (
|
||||
)
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import run_postprocessor
|
||||
from nonebot.params import Command, CommandArg, RegexGroup
|
||||
from nonebot.params import CommandArg, RegexGroup
|
||||
from nonebot.typing import T_State
|
||||
|
||||
from configs.config import NICKNAME, Config
|
||||
from models.sign_group_user import SignGroupUser
|
||||
from services.log import logger
|
||||
from utils.depends import OneCommand
|
||||
from utils.manager import withdraw_message_manager
|
||||
from utils.message_builder import custom_forward_msg
|
||||
from utils.utils import is_number
|
||||
@ -27,7 +28,6 @@ from .._model import Setu
|
||||
from .data_source import (
|
||||
add_data_to_database,
|
||||
check_local_exists_or_download,
|
||||
find_img_index,
|
||||
gen_message,
|
||||
get_luoxiang,
|
||||
get_setu_list,
|
||||
@ -59,7 +59,13 @@ usage:
|
||||
tag至多取前20项,| 为或,萝莉|少女=萝莉或者少女
|
||||
""".strip()
|
||||
__plugin_des__ = "不要小看涩图啊混蛋!"
|
||||
__plugin_cmd__ = ["色图 ?[id]", "色图 ?[tags]", "色图r ?[tags]", "[1-9]张?[tags]色图", "[1-9]张色图?[tags]"]
|
||||
__plugin_cmd__ = [
|
||||
"色图 ?[id]",
|
||||
"色图 ?[tags]",
|
||||
"色图r ?[tags]",
|
||||
"[1-9]张?[tags]色图",
|
||||
"[1-9]张色图?[tags]",
|
||||
]
|
||||
__plugin_type__ = ("来点好康的",)
|
||||
__plugin_version__ = 0.1
|
||||
__plugin_author__ = "HibiKier"
|
||||
@ -130,7 +136,7 @@ setu_data_list = []
|
||||
|
||||
|
||||
@run_postprocessor
|
||||
async def do_something(
|
||||
async def _(
|
||||
matcher: Matcher,
|
||||
exception: Optional[Exception],
|
||||
bot: Bot,
|
||||
@ -160,7 +166,7 @@ setu_reg = on_regex("(.*)[份|发|张|个|次|点](.*)[瑟|色|涩]图(r?)(.*)$"
|
||||
async def _(
|
||||
bot: Bot,
|
||||
event: MessageEvent,
|
||||
cmd: Tuple[str, ...] = Command(),
|
||||
cmd: str = OneCommand(),
|
||||
arg: Message = CommandArg(),
|
||||
):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
@ -169,16 +175,15 @@ async def _(
|
||||
user_qq=event.user_id, group_id=event.group_id
|
||||
)
|
||||
impression = user.impression
|
||||
luox = get_luoxiang(impression)
|
||||
if luox:
|
||||
if luox := get_luoxiang(impression):
|
||||
await setu.finish(luox)
|
||||
r18 = False
|
||||
num = 1
|
||||
# 是否看r18
|
||||
if cmd[0] == "色图r" and isinstance(event, PrivateMessageEvent):
|
||||
if cmd == "色图r" and isinstance(event, PrivateMessageEvent):
|
||||
r18 = True
|
||||
num = 10
|
||||
elif cmd[0] == "色图r" and isinstance(event, GroupMessageEvent):
|
||||
elif cmd == "色图r" and isinstance(event, GroupMessageEvent):
|
||||
if not Config.get_config("send_setu", "ALLOW_GROUP_R18"):
|
||||
await setu.finish(
|
||||
random.choice(["这种不好意思的东西怎么可能给这么多人看啦", "羞羞脸!给我滚出克私聊!", "变态变态变态变态大变态!"])
|
||||
@ -191,13 +196,12 @@ async def _(
|
||||
if code != 200:
|
||||
await setu.finish(setu_list[0], at_sender=True)
|
||||
setu_img, code = await check_local_exists_or_download(setu_list[0])
|
||||
msg_id = await setu.send(
|
||||
Message(gen_message(setu_list[0])) + setu_img, at_sender=True
|
||||
)
|
||||
msg_id = await setu.send(gen_message(setu_list[0]) + setu_img, at_sender=True)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP "
|
||||
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 发送色图 {setu_list[0].local_id}.jpd"
|
||||
f"发送色图 {setu_list[0].local_id}.jpg",
|
||||
cmd,
|
||||
event.user_id,
|
||||
getattr(event, "group_id", None),
|
||||
)
|
||||
if msg_id:
|
||||
withdraw_message_manager.withdraw_message(
|
||||
@ -206,7 +210,7 @@ async def _(
|
||||
Config.get_config("send_setu", "WITHDRAW_SETU_MESSAGE"),
|
||||
)
|
||||
return
|
||||
await send_setu_handle(bot, setu, event, cmd[0], msg, num, r18)
|
||||
await send_setu_handle(bot, setu, event, cmd, msg, num, r18)
|
||||
|
||||
|
||||
num_key = {
|
||||
@ -231,11 +235,10 @@ async def _(bot: Bot, event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGro
|
||||
user_qq=event.user_id, group_id=event.group_id
|
||||
)
|
||||
impression = user.impression
|
||||
luox = get_luoxiang(impression)
|
||||
if luox:
|
||||
if luox := get_luoxiang(impression):
|
||||
await setu.finish(luox, at_sender=True)
|
||||
num, tags, r18, tags2 = reg_group
|
||||
num = num or 1
|
||||
num = num or "一"
|
||||
tags = tags[:-1] if tags and tags[-1] == "的" else tags
|
||||
if num_key.get(num):
|
||||
num = num_key[num]
|
||||
@ -252,7 +255,9 @@ async def _(bot: Bot, event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGro
|
||||
if limit and num > limit:
|
||||
num = limit
|
||||
await setu.send(f"一次只能给你看 {num} 张哦")
|
||||
await send_setu_handle(bot, setu_reg, event, "色图r" if r18 else "色图", tags + " " + tags2, num, r18)
|
||||
await send_setu_handle(
|
||||
bot, setu_reg, event, "色图r" if r18 else "色图", tags + " " + tags2, num, r18
|
||||
)
|
||||
|
||||
|
||||
async def send_setu_handle(
|
||||
@ -273,6 +278,7 @@ async def send_setu_handle(
|
||||
# 本地先拿图,下载失败补上去
|
||||
setu_list, code = None, 200
|
||||
setu_count = await Setu.filter(is_r18=r18).count()
|
||||
max_once_num2forward = Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
if (
|
||||
not Config.get_config("send_setu", "ONLY_USE_LOCAL_SETU") and tags
|
||||
) or setu_count <= 0:
|
||||
@ -294,14 +300,14 @@ async def send_setu_handle(
|
||||
# 下载成功的话
|
||||
if index != -1:
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP "
|
||||
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 发送色图 {index}.png"
|
||||
f"发送色图 {index}.png",
|
||||
"command",
|
||||
event.user_id,
|
||||
getattr(event, "group_id", None),
|
||||
)
|
||||
if (
|
||||
Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
and num
|
||||
>= Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
max_once_num2forward
|
||||
and num >= max_once_num2forward
|
||||
and isinstance(event, GroupMessageEvent)
|
||||
):
|
||||
forward_list.append(Message(f"{text_list[i]}\n{setu_img}"))
|
||||
@ -318,38 +324,28 @@ async def send_setu_handle(
|
||||
setu_image = random.choice(setu_list)
|
||||
setu_list.remove(setu_image)
|
||||
if (
|
||||
Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
and num
|
||||
>= Config.get_config(
|
||||
"send_setu", "MAX_ONCE_NUM2FORWARD"
|
||||
)
|
||||
max_once_num2forward
|
||||
and num >= max_once_num2forward
|
||||
and isinstance(event, GroupMessageEvent)
|
||||
):
|
||||
forward_list.append(
|
||||
Message(
|
||||
gen_message(setu_image)
|
||||
+ (
|
||||
await check_local_exists_or_download(
|
||||
setu_image
|
||||
)
|
||||
)[0]
|
||||
)
|
||||
gen_message(setu_image)
|
||||
+ (
|
||||
await check_local_exists_or_download(setu_image)
|
||||
)[0]
|
||||
)
|
||||
else:
|
||||
msg_id = await matcher.send(
|
||||
Message(
|
||||
gen_message(setu_image)
|
||||
+ (
|
||||
await check_local_exists_or_download(
|
||||
setu_image
|
||||
)
|
||||
)[0]
|
||||
)
|
||||
gen_message(setu_image)
|
||||
+ (
|
||||
await check_local_exists_or_download(setu_image)
|
||||
)[0]
|
||||
)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP "
|
||||
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 发送本地色图 {setu_image.local_id}.png"
|
||||
f"发送本地色图 {setu_image.local_id}.png",
|
||||
"command",
|
||||
event.user_id,
|
||||
getattr(event, "group_id", None),
|
||||
)
|
||||
else:
|
||||
msg_id = await matcher.send(text_list[i] + "\n" + setu_img)
|
||||
@ -361,7 +357,7 @@ async def send_setu_handle(
|
||||
)
|
||||
except ActionFailed:
|
||||
await matcher.finish("坏了,这张图色过头了,我自己看看就行了!", at_sender=True)
|
||||
if forward_list:
|
||||
if forward_list and isinstance(event, GroupMessageEvent):
|
||||
msg_id = await bot.send_group_forward_msg(
|
||||
group_id=event.group_id,
|
||||
messages=custom_forward_msg(forward_list, bot.self_id),
|
||||
@ -387,8 +383,8 @@ async def send_setu_handle(
|
||||
setu_image = random.choice(setu_list)
|
||||
setu_list.remove(setu_image)
|
||||
if (
|
||||
Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
and num >= Config.get_config("send_setu", "MAX_ONCE_NUM2FORWARD")
|
||||
max_once_num2forward
|
||||
and num >= max_once_num2forward
|
||||
and isinstance(event, GroupMessageEvent)
|
||||
):
|
||||
forward_list.append(
|
||||
@ -400,10 +396,8 @@ async def send_setu_handle(
|
||||
else:
|
||||
try:
|
||||
msg_id = await matcher.send(
|
||||
Message(
|
||||
gen_message(setu_image)
|
||||
+ (await check_local_exists_or_download(setu_image))[0]
|
||||
)
|
||||
gen_message(setu_image)
|
||||
+ (await check_local_exists_or_download(setu_image))[0]
|
||||
)
|
||||
withdraw_message_manager.withdraw_message(
|
||||
event,
|
||||
@ -411,13 +405,14 @@ async def send_setu_handle(
|
||||
Config.get_config("send_setu", "WITHDRAW_SETU_MESSAGE"),
|
||||
)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP "
|
||||
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 发送本地色图 {setu_image.local_id}.png"
|
||||
f"发送本地色图 {setu_image.local_id}.png",
|
||||
"command",
|
||||
event.user_id,
|
||||
getattr(event, "group_id", None),
|
||||
)
|
||||
except ActionFailed:
|
||||
await matcher.finish("坏了,这张图色过头了,我自己看看就行了!", at_sender=True)
|
||||
if forward_list:
|
||||
if forward_list and isinstance(event, GroupMessageEvent):
|
||||
msg_id = await bot.send_group_forward_msg(
|
||||
group_id=event.group_id,
|
||||
messages=custom_forward_msg(forward_list, bot.self_id),
|
||||
|
||||
@ -3,10 +3,10 @@ import os
|
||||
import random
|
||||
import re
|
||||
from asyncio.exceptions import TimeoutError
|
||||
from typing import List, Optional, Tuple, Union
|
||||
from typing import Any, List, Optional, Tuple, Union
|
||||
|
||||
from asyncpg.exceptions import UniqueViolationError
|
||||
from nonebot.adapters.onebot.v11 import Message, MessageSegment
|
||||
from nonebot.adapters.onebot.v11 import MessageSegment
|
||||
|
||||
from configs.config import NICKNAME, Config
|
||||
from configs.path_config import IMAGE_PATH, TEMP_PATH
|
||||
@ -14,16 +14,10 @@ from services.log import logger
|
||||
from utils.http_utils import AsyncHttpx
|
||||
from utils.image_utils import compressed_image, get_img_hash
|
||||
from utils.message_builder import image
|
||||
from utils.utils import change_img_md5
|
||||
from utils.utils import change_img_md5, change_pixiv_image_links
|
||||
|
||||
from .._model import Setu
|
||||
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
|
||||
|
||||
url = "https://api.lolicon.app/setu/v2"
|
||||
path = "_setu"
|
||||
r18_path = "_r18"
|
||||
@ -42,7 +36,7 @@ async def get_setu_urls(
|
||||
"size": ["original"],
|
||||
}
|
||||
for count in range(3):
|
||||
logger.info(f"get_setu_url: count --> {count}")
|
||||
logger.debug(f"尝试获取图片URL第 {count+1} 次", "色图")
|
||||
try:
|
||||
response = await AsyncHttpx.get(
|
||||
url, timeout=Config.get_config("send_setu", "TIMEOUT"), params=params
|
||||
@ -70,10 +64,10 @@ async def get_setu_urls(
|
||||
return x_urls, x_text_lst, add_databases_list, 200
|
||||
else:
|
||||
return ["没找到符合条件的色图..."], [], [], 401
|
||||
except TimeoutError:
|
||||
pass
|
||||
except TimeoutError as e:
|
||||
logger.error(f"获取图片URL超时", "色图", e=e)
|
||||
except Exception as e:
|
||||
logger.error(f"send_setu 访问页面错误 {type(e)}:{e}")
|
||||
logger.error(f"访问页面错误", "色图", e=e)
|
||||
return ["我网线被人拔了..QAQ"], [], [], 999
|
||||
|
||||
|
||||
@ -93,43 +87,40 @@ async def search_online_setu(
|
||||
:param id_: 本地id
|
||||
:param path_: 存储路径
|
||||
"""
|
||||
ws_url = Config.get_config("pixiv", "PIXIV_NGINX_URL")
|
||||
if ws_url:
|
||||
host_match = re.match(host_pattern, url_)
|
||||
host = host_match.group(1)
|
||||
url_ = url_.replace(host, ws_url)
|
||||
url_ = change_pixiv_image_links(url_)
|
||||
index = random.randint(1, 100000) if id_ is None else id_
|
||||
path_ = IMAGE_PATH / path_ if path_ else TEMP_PATH
|
||||
base_path = IMAGE_PATH / path_ if path_ else TEMP_PATH
|
||||
file_name = f"{index}_temp_setu.jpg" if path_ == TEMP_PATH else f"{index}.jpg"
|
||||
path_.mkdir(parents=True, exist_ok=True)
|
||||
file = base_path / file_name
|
||||
base_path.mkdir(parents=True, exist_ok=True)
|
||||
for i in range(3):
|
||||
logger.info(f"search_online_setu --> {i}")
|
||||
logger.debug(f"尝试在线搜索第 {i+1} 次", "色图")
|
||||
try:
|
||||
if not await AsyncHttpx.download_file(
|
||||
url_,
|
||||
path_ / file_name,
|
||||
file,
|
||||
timeout=Config.get_config("send_setu", "TIMEOUT"),
|
||||
):
|
||||
continue
|
||||
if id_ is not None:
|
||||
if os.path.getsize(path_ / f"{index}.jpg") > 1024 * 1024 * 1.5:
|
||||
if os.path.getsize(base_path / f"{index}.jpg") > 1024 * 1024 * 1.5:
|
||||
compressed_image(
|
||||
path_ / f"{index}.jpg",
|
||||
base_path / f"{index}.jpg",
|
||||
)
|
||||
logger.info(f"下载 lolicon 图片 {url_} 成功, id:{index}")
|
||||
change_img_md5(path_ / file_name)
|
||||
return image(path_ / file_name), index
|
||||
except TimeoutError:
|
||||
pass
|
||||
change_img_md5(file)
|
||||
return image(file), index
|
||||
except TimeoutError as e:
|
||||
logger.error(f"下载图片超时", "色图", e=e)
|
||||
except Exception as e:
|
||||
logger.error(f"send_setu 下载图片错误 {type(e)}:{e}")
|
||||
logger.error(f"下载图片错误", "色图", e=e)
|
||||
return "图片被小怪兽恰掉啦..!QAQ", -1
|
||||
|
||||
|
||||
# 检测本地是否有id涩图,无的话则下载
|
||||
async def check_local_exists_or_download(
|
||||
setu_image: Setu,
|
||||
) -> Tuple[MessageSegment, int]:
|
||||
) -> Tuple[Union[MessageSegment, str], int]:
|
||||
path_ = None
|
||||
id_ = None
|
||||
if Config.get_config("send_setu", "DOWNLOAD_SETU"):
|
||||
@ -182,45 +173,45 @@ async def get_setu_list(
|
||||
image_list = await Setu.query_image(r18=r18)
|
||||
if not image_list:
|
||||
return ["没找到符合条件的色图..."], 998
|
||||
return image_list, 200
|
||||
return image_list, 200 # type: ignore
|
||||
|
||||
|
||||
# 初始化消息
|
||||
def gen_message(
|
||||
setu_image: Setu
|
||||
) -> Union[Message, MessageSegment]:
|
||||
def gen_message(setu_image: Setu) -> str:
|
||||
"""判断是否获取图片信息
|
||||
|
||||
Args:
|
||||
setu_image (Setu): Setu
|
||||
|
||||
Returns:
|
||||
str: 图片信息
|
||||
"""
|
||||
local_id = setu_image.local_id
|
||||
title = setu_image.title
|
||||
author = setu_image.author
|
||||
pid = setu_image.pid
|
||||
path_ = r18_path if setu_image.is_r18 else path
|
||||
image_path = IMAGE_PATH / path_ / f"{local_id}.jpg"
|
||||
if Config.get_config("send_setu", "SHOW_INFO"):
|
||||
return Message(
|
||||
f"id:{local_id}\n"
|
||||
f"title:{title}\n"
|
||||
f"author:{author}\n"
|
||||
f"PID:{pid}\n" + image(image_path)
|
||||
)
|
||||
return image(image_path)
|
||||
return f"id:{local_id}\n" f"title:{title}\n" f"author:{author}\n" f"PID:{pid}\n"
|
||||
return ""
|
||||
|
||||
|
||||
# 罗翔老师!
|
||||
def get_luoxiang(impression):
|
||||
probability = (
|
||||
float(impression)
|
||||
+ Config.get_config("send_setu", "INITIAL_SETU_PROBABILITY") * 100
|
||||
initial_setu_probability = Config.get_config(
|
||||
"send_setu", "INITIAL_SETU_PROBABILITY"
|
||||
)
|
||||
if probability < random.randint(1, 101):
|
||||
return (
|
||||
"我为什么要给你发这个?"
|
||||
+ image(
|
||||
IMAGE_PATH
|
||||
/ "luoxiang"
|
||||
/ random.choice(os.listdir(IMAGE_PATH / "luoxiang"))
|
||||
if initial_setu_probability:
|
||||
probability = float(impression) + initial_setu_probability * 100
|
||||
if probability < random.randint(1, 101):
|
||||
return (
|
||||
"我为什么要给你发这个?"
|
||||
+ image(
|
||||
IMAGE_PATH
|
||||
/ "luoxiang"
|
||||
/ random.choice(os.listdir(IMAGE_PATH / "luoxiang"))
|
||||
)
|
||||
+ f"\n(快向{NICKNAME}签到提升好感度吧!)"
|
||||
)
|
||||
+ f"\n(快向{NICKNAME}签到提升好感度吧!)"
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
@ -243,17 +234,15 @@ async def find_img_index(img_url, user_id):
|
||||
|
||||
|
||||
# 处理色图数据
|
||||
def _setu_data_process(data: dict, command: str) -> "list, list, list":
|
||||
def _setu_data_process(
|
||||
data: dict, command: str
|
||||
) -> Tuple[List[str], List[str], List[Tuple[Any, ...]]]:
|
||||
urls = []
|
||||
text_list = []
|
||||
add_databases_list = []
|
||||
for i in range(len(data)):
|
||||
img_url = data[i]["urls"]["original"]
|
||||
img_url = (
|
||||
img_url.replace("i.pixiv.cat", "i.pximg.net")
|
||||
if "i.pixiv.cat" in img_url
|
||||
else img_url
|
||||
)
|
||||
img_url = change_pixiv_image_links(img_url)
|
||||
title = data[i]["title"]
|
||||
author = data[i]["author"]
|
||||
pid = data[i]["pid"]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user