55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
from ..config import config, nickname
|
||
from ..utils.save import save_img
|
||
from io import BytesIO
|
||
import base64
|
||
import aiohttp
|
||
import asyncio
|
||
from nonebot.adapters.onebot.v11 import MessageSegment
|
||
from nonebot.log import logger
|
||
|
||
|
||
async def check_safe_method(fifo, img_bytes, message):
|
||
if config.novelai_h:
|
||
for i in img_bytes:
|
||
await save_img(fifo, i)
|
||
message += MessageSegment.image(i)
|
||
else:
|
||
nsfw_count = 0
|
||
for i in img_bytes:
|
||
try:
|
||
label = await check_safe(i)
|
||
except RuntimeError as e:
|
||
logger.error(f"NSFWAPI调用失败,错误代码为{e.args}")
|
||
label = "unknown"
|
||
if label != "explicit":
|
||
message += MessageSegment.image(i)
|
||
else:
|
||
nsfw_count += 1
|
||
await save_img(fifo, i, label)
|
||
if nsfw_count > 0:
|
||
message += f"\n有{nsfw_count}张图片太涩了,{nickname}已经帮你吃掉了哦"
|
||
return message
|
||
|
||
|
||
async def check_safe(img_bytes: BytesIO):
|
||
# 检查图片是否安全
|
||
start = "data:image/jpeg;base64,"
|
||
image = img_bytes.getvalue()
|
||
image = str(base64.b64encode(image), "utf-8")
|
||
str0 = start + image
|
||
# 重试三次
|
||
for i in range(3):
|
||
async with aiohttp.ClientSession() as session:
|
||
# 调用API
|
||
async with session.post('https://hf.space/embed/mayhug/rainchan-image-porn-detection/api/predict/',
|
||
json={"data": [str0]}) as resp:
|
||
if resp.status == 200:
|
||
jsonresult = await resp.json()
|
||
break
|
||
else:
|
||
await asyncio.sleep(2)
|
||
error = resp.status
|
||
else:
|
||
raise RuntimeError(error)
|
||
return jsonresult["data"][0]["label"]
|