mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-05-30 15:46:11 +08:00
use screen shot
This commit is contained in:
parent
80b49ae886
commit
d21305e5f4
@ -1,4 +1,5 @@
|
||||
FROM python:3.9
|
||||
RUN apt-get update && apt-get install chromium fonts-wqy-microhei
|
||||
RUN python3 -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
|
||||
RUN python3 -m pip install poetry && poetry config virtualenvs.create false
|
||||
WORKDIR /app
|
||||
|
413
poetry.lock
generated
413
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@ -18,6 +18,7 @@ bs4 = "^0.0.1"
|
||||
tinydb = "^4.3.0"
|
||||
nonebot_plugin_apscheduler = "^0.1.2"
|
||||
feedparser = "^6.0.2"
|
||||
pyppeteer = "^0.2.5"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
pylint = "^2.6.0"
|
||||
|
@ -23,8 +23,7 @@ class NoSuchUserException(Exception):
|
||||
class NoSuchSubscribeException(Exception):
|
||||
pass
|
||||
|
||||
@Singleton
|
||||
class Config():
|
||||
class Config(metaclass=Singleton):
|
||||
|
||||
migrate_version = 1
|
||||
|
||||
|
@ -7,6 +7,7 @@ from nonebot import on_command
|
||||
|
||||
from .platform.utils import check_sub_target
|
||||
from .config import Config, NoSuchSubscribeException
|
||||
from .utils import parse_text
|
||||
|
||||
async def check_is_owner_or_admin(bot: Bot, event: Event):
|
||||
return await (GROUP_ADMIN | GROUP_OWNER)(bot, event)
|
||||
@ -36,7 +37,7 @@ async def _(bot: Bot, event: Event, state: T_State):
|
||||
res = '订阅的帐号为:\n'
|
||||
for sub in sub_list:
|
||||
res += '{} {} {}\n'.format(sub['target_type'], sub['target_name'], sub['target'])
|
||||
await query_sub.finish(res)
|
||||
await query_sub.finish(await parse_text(res))
|
||||
|
||||
del_sub = on_command("删除订阅", rule=to_me(), priority=5)
|
||||
@del_sub.handle()
|
||||
|
@ -6,8 +6,7 @@ import httpx
|
||||
import json
|
||||
import time
|
||||
|
||||
@Singleton
|
||||
class Bilibili:
|
||||
class Bilibili(metaclass=Singleton):
|
||||
|
||||
def __init__(self):
|
||||
self.exists_posts = defaultdict(set)
|
||||
|
@ -18,8 +18,7 @@ async def get_rss_info(url) -> str:
|
||||
feed = feedparser.parse(data)
|
||||
return feed.feed.title
|
||||
|
||||
@Singleton
|
||||
class Rss:
|
||||
class Rss(metaclass=Singleton):
|
||||
|
||||
def __init__(self):
|
||||
self.exists_posts = defaultdict(set)
|
||||
|
@ -9,8 +9,7 @@ from nonebot import logger
|
||||
from ..utils import Singleton
|
||||
from ..post import Post
|
||||
|
||||
@Singleton
|
||||
class Weibo:
|
||||
class Weibo(metaclass=Singleton):
|
||||
|
||||
def __init__(self):
|
||||
self.exists_posts = defaultdict(set)
|
||||
|
@ -3,6 +3,7 @@ from pydantic import BaseSettings
|
||||
class PlugConfig(BaseSettings):
|
||||
|
||||
hk_reporter_config_path: str = ""
|
||||
use_pic: bool = False
|
||||
|
||||
class Config:
|
||||
extra = 'ignore'
|
||||
|
@ -1,12 +1,54 @@
|
||||
class Singleton(object):
|
||||
import nonebot
|
||||
from pyppeteer import launch
|
||||
from html import escape
|
||||
from hashlib import sha256
|
||||
|
||||
def __init__(self, cls):
|
||||
self._cls = cls
|
||||
self._instance = {}
|
||||
def __call__(self):
|
||||
if self._cls not in self._instance:
|
||||
self._instance[self._cls] = self._cls()
|
||||
return self._instance[self._cls]
|
||||
from . import plugin_config
|
||||
|
||||
class Singleton(type):
|
||||
_instances = {}
|
||||
def __call__(cls, *args, **kwargs):
|
||||
if cls not in cls._instances:
|
||||
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
||||
return cls._instances[cls]
|
||||
|
||||
supported_target_type = ('weibo', 'bilibili', 'rss')
|
||||
|
||||
class Render(metaclass=Singleton):
|
||||
|
||||
def __init__(self):
|
||||
self.page = None
|
||||
|
||||
async def init(self):
|
||||
browser = await launch(execublePath='/usr/bin/chromium')
|
||||
self.page = await browser.newPage()
|
||||
|
||||
async def text_to_pic(self, text: str) -> str:
|
||||
hash_text = sha256(text.encode()).hexdigest()[:20]
|
||||
lines = text.split('\n')
|
||||
parsed_lines = list(map(lambda x: '<p>{}</p>'.format(escape(x)), lines))
|
||||
html_text = '<div style="width:17em;padding:1em">{}</div>'.format(''.join(parsed_lines))
|
||||
with open('/tmp/text-{}.html'.format(hash_text), 'w') as f:
|
||||
f.write(html_text)
|
||||
await self.page.goto('file:///tmp/text-{}.html'.format(hash_text))
|
||||
div = await self.page.querySelector('div')
|
||||
path = '/tmp/img-{}.png'.format(hash_text)
|
||||
await div.screenshot(path=path)
|
||||
return path
|
||||
|
||||
async def text_to_pic_cqcode(self, text:str) -> str:
|
||||
path = await self.text_to_pic(text)
|
||||
return '[CQ:image,file=file://{}]'.format(path)
|
||||
|
||||
async def _start():
|
||||
r = Render()
|
||||
await r.init()
|
||||
|
||||
nonebot.get_driver().on_startup(_start)
|
||||
async def parse_text(text: str):
|
||||
if plugin_config.use_pic:
|
||||
r = Render()
|
||||
return await r.text_to_pic_cqcode(text)
|
||||
else:
|
||||
return text
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user