update browser

This commit is contained in:
felinae98
2021-07-06 20:01:34 +08:00
parent 9270f01843
commit 10a2fbfa27
8 changed files with 58 additions and 22 deletions
@@ -7,3 +7,4 @@ from . import send
from . import post
from . import platform
from . import types
from . import utils
@@ -1,4 +1,6 @@
from pydantic import BaseSettings
import warnings
import nonebot
class PlugConfig(BaseSettings):
@@ -6,6 +8,7 @@ class PlugConfig(BaseSettings):
hk_reporter_config_path: str = ""
hk_reporter_use_pic: bool = False
hk_reporter_use_local: bool = False
hk_reporter_browser: str = ''
hk_reporter_init_filter: bool = True
class Config:
@@ -13,3 +16,5 @@ class PlugConfig(BaseSettings):
global_config = nonebot.get_driver().config
plugin_config = PlugConfig(**global_config.dict())
if plugin_config.hk_reporter_use_local:
warnings.warn('HK_REPORTER_USE_LOCAL is deprecated, please use HK_REPORTER_BROWSER')
+26 -19
View File
@@ -1,14 +1,12 @@
import asyncio
from html import escape
import os
from tempfile import NamedTemporaryFile
from typing import Awaitable, Callable, Optional
from urllib.parse import quote
from pyppeteer import launch
from pyppeteer.browser import Browser
from pyppeteer.chromium_downloader import check_chromium, download_chromium
from pyppeteer.page import Page
from nonebot.log import logger
from pyppeteer import connect, launch
from pyppeteer.browser import Browser
from pyppeteer.page import Page
from .plugin_config import plugin_config
@@ -19,9 +17,6 @@ class Singleton(type):
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
if not plugin_config.hk_reporter_use_local and not check_chromium():
download_chromium()
class Render(metaclass=Singleton):
@@ -29,6 +24,24 @@ class Render(metaclass=Singleton):
self.lock = asyncio.Lock()
self.browser: Browser
self.interval_log = ''
self.remote_browser = False
async def get_browser(self) -> Browser:
if plugin_config.hk_reporter_browser:
if plugin_config.hk_reporter_browser.startswith('local:'):
path = plugin_config.hk_reporter_browser.split('local:', 1)[1]
return await launch(executablePath=path, args=['--no-sandbox'])
if plugin_config.hk_reporter_browser.startswith('ws:'):
self.remote_browser = True
return await connect(browserWSEndpoint=plugin_config.hk_reporter_browser)
raise RuntimeError('HK_REPORTER_BROWSER error')
if plugin_config.hk_reporter_use_local:
return await launch(executablePath='/usr/bin/chromium', args=['--no-sandbox'])
return await launch(args=['--no-sandbox'])
async def close_browser(self):
if not self.remote_browser:
await self.browser.close()
async def render(self, url: str, viewport: Optional[dict] = None, target: Optional[str] = None,
operation: Optional[Callable[[Page], Awaitable[None]]] = None) -> Optional[str]:
@@ -51,10 +64,7 @@ class Render(metaclass=Singleton):
async def do_render(self, url: str, viewport: Optional[dict] = None, target: Optional[str] = None,
operation: Optional[Callable[[Page], Awaitable[None]]] = None) -> str:
async with self.lock:
if plugin_config.hk_reporter_use_local:
self.browser = await launch(executablePath='/usr/bin/chromium', args=['--no-sandbox'])
else:
self.browser = await launch(args=['--no-sandbox'])
self.browser = await self.get_browser()
self._inter_log('open browser')
page = await self.browser.newPage()
if operation:
@@ -73,7 +83,7 @@ class Render(metaclass=Singleton):
self._inter_log('screenshot')
await page.close()
self._inter_log('close page')
await self.browser.close()
await self.close_browser()
self._inter_log('close browser')
return str(data)
@@ -81,11 +91,8 @@ class Render(metaclass=Singleton):
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 NamedTemporaryFile('wt', suffix='.html', delete=False) as tmp:
tmp_path = tmp.name
tmp.write(html_text)
data = await self.render('file://{}'.format(tmp_path), target='div')
os.remove(tmp_path)
url = 'data:text/html,{}'.format(quote(html_text))
data = await self.render(url, target='div')
return data
async def text_to_pic_cqcode(self, text:str) -> str: