This commit is contained in:
CMHopeSunshine 2024-02-07 23:24:03 +08:00
commit 3c7db17a9d
13 changed files with 1342 additions and 1051 deletions

View File

@ -50,6 +50,7 @@ class ConfigModel(BaseModel):
admin_theme: Literal['default', 'antd', 'ang', 'dark'] = Field('default', alias='Web端主题')
command_alias_enable: bool = Field(True, alias='启用命令别名')
browser_type: Literal['chromium', 'firefox', 'webkit'] = Field('firefox', alias='浏览器内核')
# 早报60s
morning_news: str = Field('https://api.vvhan.com/api/60s', alias='早报60s')

View File

@ -1,9 +1,7 @@
from os import getcwd
import jinja2
from .event import *
from datetime import datetime, timedelta
from LittlePaimon.utils.brower import get_new_page
from LittlePaimon.utils.browser import get_new_page
body = []
weeks = []
@ -48,10 +46,10 @@ async def generate_day_schedule(server='cn'):
'online': f'{datetime.strftime(event["start"], "%m-%d")} ~ {datetime.strftime(event["end"], "%m-%d")}',
'color': event['color'], 'banner': event['banner']})
content = await template.render_async(body=body, css_path=template_path, week=weeks)
content = await template.render_async(body=body, week=weeks)
async with get_new_page(viewport={'width': 600, 'height': 10}) as page:
await page.goto(f'file://{getcwd()}')
await page.goto(f'file://{template_path}/calendar.html')
await page.set_content(content, wait_until='networkidle')
await page.wait_for_timeout(0.2)
return await page.screenshot(full_page=True)

View File

@ -4,9 +4,9 @@
<head>
<meta charset="UTF-8">
<title>原神日历</title>
<link rel="stylesheet" href="{{ css_path }}/iview.css" />
<link rel="stylesheet" href="{{ css_path }}/index.css" />
<link rel="stylesheet" href="{{ css_path }}/normalize.css">
<link rel="stylesheet" href="iview.css" />
<link rel="stylesheet" href="index.css" />
<link rel="stylesheet" href="normalize.css">
</head>
<body>

View File

@ -4,7 +4,7 @@ from nonebot.adapters.onebot.v11 import MessageEvent, MessageSegment
from nonebot.plugin import PluginMetadata
from LittlePaimon.utils import logger
from LittlePaimon.utils.brower import screenshot
from LittlePaimon.utils.browser import screenshot
__plugin_meta__ = PluginMetadata(
name='米游社',

View File

@ -6,7 +6,7 @@ from nonebot.rule import Rule
from LittlePaimon import SUPERUSERS
from LittlePaimon.config import config
from LittlePaimon.utils.brower import screenshot
from LittlePaimon.utils.browser import screenshot
async def permission_check(event: MessageEvent) -> bool:

View File

@ -6,9 +6,11 @@ from playwright.async_api import Page, Browser, Playwright, async_playwright, Er
from . import DRIVER
from .logger import logger
from LittlePaimon.config import config as bot_config
_playwright: Optional[Playwright] = None
_browser: Optional[Browser] = None
_browser_type = bot_config.browser_type
async def init(**kwargs) -> Browser:
@ -27,7 +29,13 @@ async def init(**kwargs) -> Browser:
async def launch_browser(**kwargs) -> Browser:
assert _playwright is not None, "Playwright is not initialized"
if _browser_type == 'firefox':
return await _playwright.firefox.launch(**kwargs)
elif _browser_type == 'chromium':
return await _playwright.chromium.launch(**kwargs)
elif _browser_type == 'webkit':
return await _playwright.webkit.launch(**kwargs)
async def get_browser(**kwargs) -> Browser:
@ -40,8 +48,8 @@ async def install_browser():
from playwright.__main__ import main
logger.info('Playwright', '正在安装 chromium')
sys.argv = ["", "install", "chromium"]
logger.info('Playwright', f'正在安装 {_browser_type}')
sys.argv = ["", "install", f"{_browser_type}"]
with suppress(SystemExit):
logger.info('Playwright', '正在安装依赖')
os.system("playwright install-deps")

View File

@ -6,7 +6,7 @@ from pathlib import Path
from ssl import SSLCertVerificationError
from typing import Union
from ruamel import yaml
from ruamel.yaml import YAML
from .requests import aiorequests
@ -71,8 +71,8 @@ def load_yaml(path: Union[Path, str], encoding: str = 'utf-8'):
"""
if isinstance(path, str):
path = Path(path)
return yaml.load(path.read_text(encoding=encoding),
Loader=yaml.Loader) if path.exists() else {}
yaml=YAML(typ='safe')
return yaml.load(path.read_text(encoding=encoding)) if path.exists() else {}
def save_yaml(data: dict, path: Union[Path, str] = None, encoding: str = 'utf-8'):
@ -87,9 +87,7 @@ def save_yaml(data: dict, path: Union[Path, str] = None, encoding: str = 'utf-8'
path = Path(path)
path.parent.mkdir(parents=True, exist_ok=True)
with path.open('w', encoding=encoding) as f:
yaml=YAML(typ='safe')
yaml.dump(
data,
f,
indent=2,
Dumper=yaml.RoundTripDumper,
allow_unicode=True)
f)

View File

@ -8,13 +8,13 @@ from .api import BaseApiRouter
from .pages import admin_app, login_page, bind_cookie_page, blank_page
requestAdaptor = '''
requestAdaptor = """
requestAdaptor(api) {
api.headers["token"] = localStorage.getItem("token");
return api;
},
'''
responseAdaptor = '''
"""
responseAdaptor = """
responseAdaptor(api, payload, query, request, response) {
if (response.data.detail == '登录验证失败或已失效,请重新登录') {
window.location.href = '/LittlePaimon/login'
@ -24,9 +24,10 @@ responseAdaptor(api, payload, query, request, response) {
}
return payload
},
'''
"""
icon_path = 'https://s1.ax1x.com/2023/02/05/pS62DJK.png'
icon_path = "https://s1.ax1x.com/2023/02/05/pS62DJK.png"
cdn = "https://npm.onmicrosoft.cn"
@DRIVER.on_startup
@ -34,41 +35,44 @@ def init_web():
app: FastAPI = nonebot.get_app()
app.include_router(BaseApiRouter)
logger.info(
'Web UI',
f'<g>启用成功</g>,默认地址为<m>http://127.0.0.1:{DRIVER.config.port}/LittlePaimon/login</m>',
"Web UI",
f"<g>启用成功</g>,默认地址为<m>http://127.0.0.1:{DRIVER.config.port}/LittlePaimon/login</m>",
)
@app.get('/LittlePaimon/admin', response_class=HTMLResponse)
@app.get("/LittlePaimon/admin", response_class=HTMLResponse)
async def admin():
if config.admin_enable:
return admin_app.render(
site_title='LittlePaimon 后台管理',
site_title="LittlePaimon 后台管理",
site_icon=icon_path,
theme=config.admin_theme,
cdn=cdn,
requestAdaptor=requestAdaptor,
responseAdaptor=responseAdaptor,
)
else:
return blank_page.render(site_title='LittlePaimon', site_icon=icon_path)
return blank_page.render(site_title="LittlePaimon", site_icon=icon_path)
@app.get('/LittlePaimon/login', response_class=HTMLResponse)
@app.get("/LittlePaimon/login", response_class=HTMLResponse)
async def login():
if config.admin_enable:
return login_page.render(
site_title='登录 | LittlePaimon 后台管理',
site_title="登录 | LittlePaimon 后台管理",
cdn=cdn,
site_icon=icon_path,
theme=config.admin_theme,
)
else:
return blank_page.render(site_title='LittlePaimon', site_icon=icon_path)
return blank_page.render(site_title="LittlePaimon", site_icon=icon_path)
@app.get('/LittlePaimon/cookie', response_class=HTMLResponse)
@app.get("/LittlePaimon/cookie", response_class=HTMLResponse)
async def bind_cookie():
if config.CookieWeb_enable:
return bind_cookie_page.render(
site_title='绑定Cookie | LittlePaimon',
site_title="绑定Cookie | LittlePaimon",
cdn=cdn,
site_icon=icon_path,
theme=config.admin_theme,
)
else:
return blank_page.render(site_title='LittlePaimon', site_icon=icon_path)
return blank_page.render(site_title="LittlePaimon", site_icon=icon_path)

View File

@ -39,6 +39,26 @@ cookie_web_form = Form(
value='${CookieWeb地址}',
labelRemark=Remark(shape='circle', content='只是设置对用户显示的CookieWeb地址要填写实际的地址')
),
Select(
label='浏览器内核',
name='浏览器内核',
value='${浏览器内核}',
labelRemark=Remark(shape='circle', content='用于生成原神日历的浏览器内核'),
options=[
{
'label': '火狐FireFox',
'value': 'firefox'
},
{
'label': '谷歌Chormium',
'value': 'chromium'
},
{
'label': 'WebKit',
'value': 'webkit'
}
]
),
Switch(
label='是否启用Web端',
name='启用Web端',

View File

@ -65,6 +65,10 @@
<img src="https://s1.ax1x.com/2023/02/05/pS6fAG6.jpg" alt="map">
</details>
## | Playwright相关问题
因部分系统不适用于chromium谷歌浏览器故将默认内核改为FireFox
如需切换,可更改 config/paimon_config_default.yml 的默认值
## | 常见问题&致谢
详见[常见问题](https://docs.paimon.cherishmoon.fun/question.html)和[致谢](https://docs.paimon.cherishmoon.fun/thanks.html)。

View File

@ -21,3 +21,8 @@ CookieWeb地址: http://127.0.0.1:13579/LittlePaimon/cookie
实时便签检查间隔: 16 # 实时便签检查间隔,单位分钟
实时便签停止检查开始时间: 0
实时便签停止检查结束时间: 6 # 处于这个时间段的时候停止检查
# 浏览器内核设置
# 可选 chromium, firefox, webkit
# 默认使用firefox
browser_type: ''

2183
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -2,88 +2,88 @@
aiosqlite==0.17.0 ; python_version >= "3.8" and python_version < "4.0"
amis-python==1.0.8.post2 ; python_version >= "3.8" and python_version < "4.0"
anyio==3.7.1 ; python_version >= "3.8" and python_version < "4.0"
anyio==4.2.0 ; python_version >= "3.8" and python_version < "4.0"
apscheduler==3.10.4 ; python_version >= "3.8" and python_version < "4.0"
backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0"
certifi==2023.7.22 ; python_version >= "3.8" and python_version < "4.0"
beautifulsoup4==4.12.3 ; python_version >= "3.8" and python_version < "4.0"
certifi==2023.11.17 ; python_version >= "3.8" and python_version < "4.0"
click==8.1.7 ; python_version >= "3.8" and python_version < "4.0"
colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and (platform_system == "Windows" or sys_platform == "win32")
contourpy==1.1.0 ; python_version >= "3.8" and python_version < "4.0"
cycler==0.11.0 ; python_version >= "3.8" and python_version < "4.0"
contourpy==1.1.1 ; python_version >= "3.8" and python_version < "4.0"
cycler==0.12.1 ; python_version >= "3.8" and python_version < "4.0"
ecdsa==0.18.0 ; python_version >= "3.8" and python_version < "4.0"
exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.11"
exceptiongroup==1.2.0 ; python_version >= "3.8" and python_version < "3.11"
expandvars==0.9.0 ; python_version >= "3.8" and python_version < "4.0"
fastapi==0.101.1 ; python_version >= "3.8" and python_version < "4.0"
fonttools==4.42.1 ; python_version >= "3.8" and python_version < "4.0"
gitdb==4.0.10 ; python_version >= "3.8" and python_version < "4.0"
gitpython==3.1.32 ; python_version >= "3.8" and python_version < "4.0"
greenlet==2.0.2 ; python_version >= "3.8" and python_version < "4.0"
fastapi==0.109.0 ; python_version >= "3.8" and python_version < "4.0"
fonttools==4.47.2 ; python_version >= "3.8" and python_version < "4.0"
gitdb==4.0.11 ; python_version >= "3.8" and python_version < "4.0"
gitpython==3.1.41 ; python_version >= "3.8" and python_version < "4.0"
greenlet==3.0.3 ; python_version >= "3.8" and python_version < "4.0"
h11==0.14.0 ; python_version >= "3.8" and python_version < "4.0"
httpcore==0.16.3 ; python_version >= "3.8" and python_version < "4.0"
httptools==0.6.0 ; python_version >= "3.8" and python_version < "4.0"
httptools==0.6.1 ; python_version >= "3.8" and python_version < "4.0"
httpx==0.23.3 ; python_version >= "3.8" and python_version < "4.0"
idna==3.4 ; python_version >= "3.8" and python_version < "4.0"
importlib-resources==6.0.1 ; python_version >= "3.8" and python_version < "3.10"
idna==3.6 ; python_version >= "3.8" and python_version < "4.0"
importlib-resources==6.1.1 ; python_version >= "3.8" and python_version < "3.10"
iso8601==1.1.0 ; python_version >= "3.8" and python_version < "4.0"
jieba==0.42.1 ; python_version >= "3.8" and python_version < "4.0"
jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0"
jinja2==3.1.3 ; python_version >= "3.8" and python_version < "4.0"
joblib==1.3.2 ; python_version >= "3.8" and python_version < "4.0"
kiwisolver==1.4.4 ; python_version >= "3.8" and python_version < "4.0"
loguru==0.7.0 ; python_version >= "3.8" and python_version < "4.0"
lxml==4.9.3 ; python_version >= "3.8" and python_version < "4.0"
markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4.0"
matplotlib==3.7.2 ; python_version >= "3.8" and python_version < "4.0"
msgpack==1.0.5 ; python_version >= "3.8" and python_version < "4.0"
kiwisolver==1.4.5 ; python_version >= "3.8" and python_version < "4.0"
loguru==0.7.2 ; python_version >= "3.8" and python_version < "4.0"
lxml==4.9.4 ; python_version >= "3.8" and python_version < "4.0"
markupsafe==2.1.4 ; python_version >= "3.8" and python_version < "4.0"
matplotlib==3.7.4 ; python_version >= "3.8" and python_version < "4.0"
msgpack==1.0.7 ; python_version >= "3.8" and python_version < "4.0"
multidict==6.0.4 ; python_version >= "3.8" and python_version < "4.0"
nonebot-adapter-onebot==2.2.4 ; python_version >= "3.8" and python_version < "4.0"
nonebot-adapter-onebot==2.3.1 ; python_version >= "3.8" and python_version < "4.0"
nonebot-plugin-apscheduler==0.2.0 ; python_version >= "3.8" and python_version < "4.0"
nonebot2==2.0.1 ; python_version >= "3.8" and python_version < "4.0"
nonebot2[fastapi]==2.0.1 ; python_version >= "3.8" and python_version < "4.0"
nonebot2==2.1.3 ; python_version >= "3.8" and python_version < "4.0"
nonebot2[fastapi]==2.1.3 ; python_version >= "3.8" and python_version < "4.0"
numpy==1.24.4 ; python_version >= "3.8" and python_version < "4.0"
packaging==23.1 ; python_version >= "3.8" and python_version < "4.0"
packaging==23.2 ; python_version >= "3.8" and python_version < "4.0"
pillow==9.5.0 ; python_version >= "3.8" and python_version < "4.0"
playwright==1.37.0 ; python_version >= "3.8" and python_version < "4.0"
psutil==5.9.5 ; python_version >= "3.8" and python_version < "4.0"
pyasn1==0.5.0 ; python_version >= "3.8" and python_version < "4.0"
pydantic==1.10.12 ; python_version >= "3.8" and python_version < "4.0"
pydantic[dotenv]==1.10.12 ; python_version >= "3.8" and python_version < "4.0"
pyee==9.0.4 ; python_version >= "3.8" and python_version < "4.0"
playwright==1.41.0 ; python_version >= "3.8" and python_version < "4.0"
psutil==5.9.8 ; python_version >= "3.8" and python_version < "4.0"
pyasn1==0.5.1 ; python_version >= "3.8" and python_version < "4.0"
pydantic==1.10.14 ; python_version >= "3.8" and python_version < "4.0"
pydantic[dotenv]==1.10.14 ; python_version >= "3.8" and python_version < "4.0"
pyee==11.0.1 ; python_version >= "3.8" and python_version < "4.0"
pygtrie==2.5.0 ; python_version >= "3.8" and python_version < "4.0"
pyparsing==3.0.9 ; python_version >= "3.8" and python_version < "4.0"
pyparsing==3.1.1 ; python_version >= "3.8" and python_version < "4.0"
pypika-tortoise==0.1.6 ; python_version >= "3.8" and python_version < "4.0"
pypinyin==0.47.1 ; python_version >= "3.8" and python_version < "4"
pypng==0.20220715.0 ; python_version >= "3.8" and python_version < "4.0"
python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0"
python-dotenv==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
python-jose==3.3.0 ; python_version >= "3.8" and python_version < "4.0"
pytz==2023.3 ; python_version >= "3.8" and python_version < "4.0"
pytz==2023.3.post1 ; python_version >= "3.8" and python_version < "4.0"
pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0"
qrcode==7.4.2 ; python_version >= "3.8" and python_version < "4.0"
rfc3986[idna2008]==1.5.0 ; python_version >= "3.8" and python_version < "4.0"
rsa==4.9 ; python_version >= "3.8" and python_version < "4"
ruamel-yaml-clib==0.2.7 ; platform_python_implementation == "CPython" and python_version < "3.12" and python_version >= "3.8"
ruamel-yaml==0.17.32 ; python_version >= "3.8" and python_version < "4.0"
scikit-learn==1.3.0 ; python_version >= "3.8" and python_version < "4.0"
ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8"
ruamel-yaml==0.17.40 ; python_version >= "3.8" and python_version < "4.0"
scikit-learn==1.3.2 ; python_version >= "3.8" and python_version < "4.0"
scipy==1.9.3 ; python_version >= "3.8" and python_version < "4.0"
shapely==1.8.5.post1 ; python_version >= "3.8" and python_version < "4.0"
six==1.16.0 ; python_version >= "3.8" and python_version < "4.0"
smmap==5.0.0 ; python_version >= "3.8" and python_version < "4.0"
smmap==5.0.1 ; python_version >= "3.8" and python_version < "4.0"
sniffio==1.3.0 ; python_version >= "3.8" and python_version < "4.0"
soupsieve==2.4.1 ; python_version >= "3.8" and python_version < "4.0"
starlette==0.27.0 ; python_version >= "3.8" and python_version < "4.0"
soupsieve==2.5 ; python_version >= "3.8" and python_version < "4.0"
starlette==0.35.1 ; python_version >= "3.8" and python_version < "4.0"
threadpoolctl==3.2.0 ; python_version >= "3.8" and python_version < "4.0"
tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.11"
tortoise-orm==0.19.3 ; python_version >= "3.8" and python_version < "4.0"
tqdm==4.66.1 ; python_version >= "3.8" and python_version < "4.0"
typing-extensions==4.7.1 ; python_version >= "3.8" and python_version < "4.0"
tzdata==2023.3 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
tzlocal==5.0.1 ; python_version >= "3.8" and python_version < "4.0"
ujson==5.8.0 ; python_version >= "3.8" and python_version < "4.0"
uvicorn[standard]==0.23.2 ; python_version >= "3.8" and python_version < "4.0"
uvloop==0.17.0 ; (sys_platform != "win32" and sys_platform != "cygwin") and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0"
watchfiles==0.19.0 ; python_version >= "3.8" and python_version < "4.0"
websockets==11.0.3 ; python_version >= "3.8" and python_version < "4.0"
typing-extensions==4.9.0 ; python_version >= "3.8" and python_version < "4.0"
tzdata==2023.4 ; python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows"
tzlocal==5.2 ; python_version >= "3.8" and python_version < "4.0"
ujson==5.9.0 ; python_version >= "3.8" and python_version < "4.0"
uvicorn[standard]==0.26.0 ; python_version >= "3.8" and python_version < "4.0"
uvloop==0.19.0 ; (sys_platform != "win32" and sys_platform != "cygwin") and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0"
watchfiles==0.21.0 ; python_version >= "3.8" and python_version < "4.0"
websockets==12.0 ; python_version >= "3.8" and python_version < "4.0"
win32-setctime==1.1.0 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
yarl==1.9.2 ; python_version >= "3.8" and python_version < "4.0"
zipp==3.16.2 ; python_version >= "3.8" and python_version < "3.10"
yarl==1.9.4 ; python_version >= "3.8" and python_version < "4.0"
zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.10"