zhenxun_bot/plugins/white2black_img.py
2021-11-04 16:11:50 +08:00

153 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from nonebot.typing import T_State
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
from nonebot import on_command
from utils.utils import get_message_imgs, get_local_proxy, get_message_text, is_chinese
from utils.message_builder import image
import aiohttp
import aiofiles
from configs.path_config import IMAGE_PATH
from utils.image_utils import CreateImg
from utils.user_agent import get_user_agent
from services.log import logger
# ZH_CN2EN 中文 » 英语
# ZH_CN2JA 中文 » 日语
# ZH_CN2KR 中文 » 韩语
# ZH_CN2FR 中文 » 法语
# ZH_CN2RU 中文 » 俄语
# ZH_CN2SP 中文 » 西语
# EN2ZH_CN 英语 » 中文
# JA2ZH_CN 日语 » 中文
# KR2ZH_CN 韩语 » 中文
# FR2ZH_CN 法语 » 中文
# RU2ZH_CN 俄语 » 中文
# SP2ZH_CN 西语 » 中文
__zx_plugin_name__ = "黑白草图"
__plugin_usage__ = """
usage
将图片黑白化并配上中文与日语
指令:
黑白图 [文本] [图片]
""".strip()
__plugin_des__ = "为设想过得黑白草图"
__plugin_cmd__ = ["黑白图"]
__plugin_version__ = 0.1
__plugin_author__ = "HibiKier"
__plugin_settings__ = {
"level": 5,
"default_status": True,
"limit_superuser": False,
"cmd": ["黑白图", "黑白草图"],
}
w2b_img = on_command("黑白草图", aliases={"黑白图"}, priority=5, block=True)
@w2b_img.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
# try:
img = get_message_imgs(event.json())
msg = get_message_text(event.json())
if not img or not msg:
await w2b_img.finish(f"格式错误:\n" + __plugin_usage__)
img = img[0]
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
async with session.get(img, proxy=get_local_proxy()) as response:
async with aiofiles.open(
IMAGE_PATH + f"temp/{event.user_id}_w2b.png", "wb"
) as f:
await f.write(await response.read())
msg = await get_translate(msg)
w2b = CreateImg(0, 0, background=IMAGE_PATH + f"temp/{event.user_id}_w2b.png")
w2b.convert("L")
msg_sp = msg.split("<|>")
w, h = w2b.size
add_h, font_size = init_h_font_size(h)
bg = CreateImg(w, h + add_h, color="black", font_size=font_size)
bg.paste(w2b)
chinese_msg = formalization_msg(msg)
if not bg.check_font_size(chinese_msg):
if len(msg_sp) == 1:
centered_text(bg, chinese_msg, add_h)
else:
centered_text(bg, chinese_msg + "<|>" + msg_sp[1], add_h)
elif not bg.check_font_size(msg_sp[0]):
centered_text(bg, msg, add_h)
else:
ratio = (bg.getsize(msg_sp[0])[0] + 20) / bg.w
add_h = add_h * ratio
bg.resize(ratio)
centered_text(bg, msg, add_h)
await w2b_img.send(image(b64=bg.pic2bs4()))
logger.info(
f"(USER {event.user_id}, GROUP {event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
f" 制作黑白草图 {msg}"
)
def centered_text(img: CreateImg, text: str, add_h: int):
top_h = img.h - add_h + (img.h / 100)
bottom_h = img.h - (img.h / 100)
text_sp = text.split("<|>")
w, h = img.getsize(text_sp[0])
if len(text_sp) == 1:
w = (img.w - w) / 2
h = top_h + (bottom_h - top_h - h) / 2
img.text((w, h), text_sp[0], (255, 255, 255))
else:
br_h = top_h + (bottom_h - top_h) / 2
w = (img.w - w) / 2
h = top_h + (br_h - top_h - h) / 2
img.text((w, h), text_sp[0], (255, 255, 255))
w, h = img.getsize(text_sp[1])
w = (img.w - w) / 2
h = br_h + (bottom_h - br_h - h) / 2
img.text((w, h), text_sp[1], (255, 255, 255))
async def get_translate(msg: str) -> str:
url = f"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
data = {
"type": "ZH_CN2JA",
"i": msg,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"ue": "UTF-8",
"action": "FY_BY_CLICKBUTTON",
"typoResult": "true",
}
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
try:
async with session.post(url, data=data, proxy=get_local_proxy()) as res:
data = await res.json()
if data["errorCode"] == 0:
translate = data["translateResult"][0][0]["tgt"]
msg += "<|>" + translate
except Exception as e:
logger.warning(f"黑白草图翻译出错 e:{e}")
return msg
def formalization_msg(msg: str) -> str:
rst = ""
for i in range(len(msg)):
if is_chinese(msg[i]):
rst += msg[i] + " "
else:
rst += msg[i]
if i + 1 < len(msg) and is_chinese(msg[i + 1]) and msg[i].isalpha():
rst += " "
return rst
def init_h_font_size(h):
# 高度 字体
if h < 400:
return init_h_font_size(400)
elif 400 < h < 800:
return init_h_font_size(800)
return h * 0.2, h * 0.05