mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
🎨 代码格式化
This commit is contained in:
parent
bd865c5e07
commit
10009f6827
@ -1,102 +1,14 @@
|
|||||||
from collections.abc import AsyncGenerator
|
from collections.abc import AsyncGenerator
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
import os
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import sys
|
|
||||||
from typing import Any, Literal
|
from typing import Any, Literal
|
||||||
|
|
||||||
from nonebot import get_driver
|
|
||||||
from nonebot_plugin_alconna import UniMessage
|
from nonebot_plugin_alconna import UniMessage
|
||||||
from nonebot_plugin_htmlrender import get_browser
|
from nonebot_plugin_htmlrender import get_browser
|
||||||
from playwright.__main__ import main
|
from playwright.async_api import Page
|
||||||
from playwright.async_api import Browser, Page, Playwright, async_playwright
|
|
||||||
|
|
||||||
from zhenxun.configs.config import BotConfig
|
|
||||||
from zhenxun.services.log import logger
|
|
||||||
from zhenxun.utils.message import MessageUtils
|
from zhenxun.utils.message import MessageUtils
|
||||||
|
|
||||||
driver = get_driver()
|
|
||||||
|
|
||||||
_playwright: Playwright | None = None
|
|
||||||
_browser: Browser | None = None
|
|
||||||
|
|
||||||
|
|
||||||
# @driver.on_startup
|
|
||||||
# async def start_browser():
|
|
||||||
# global _playwright
|
|
||||||
# global _browser
|
|
||||||
# install()
|
|
||||||
# await check_playwright_env()
|
|
||||||
# _playwright = await async_playwright().start()
|
|
||||||
# _browser = await _playwright.chromium.launch()
|
|
||||||
|
|
||||||
|
|
||||||
# @driver.on_shutdown
|
|
||||||
# async def shutdown_browser():
|
|
||||||
# if _browser:
|
|
||||||
# await _browser.close()
|
|
||||||
# if _playwright:
|
|
||||||
# await _playwright.stop() # type: ignore
|
|
||||||
|
|
||||||
|
|
||||||
# def get_browser() -> Browser:
|
|
||||||
# if not _browser:
|
|
||||||
# raise RuntimeError("playwright is not initalized")
|
|
||||||
# return _browser
|
|
||||||
|
|
||||||
|
|
||||||
def install():
|
|
||||||
"""自动安装、更新 Chromium"""
|
|
||||||
|
|
||||||
def set_env_variables():
|
|
||||||
os.environ["PLAYWRIGHT_DOWNLOAD_HOST"] = (
|
|
||||||
"https://npmmirror.com/mirrors/playwright/"
|
|
||||||
)
|
|
||||||
if BotConfig.system_proxy:
|
|
||||||
os.environ["HTTPS_PROXY"] = BotConfig.system_proxy
|
|
||||||
|
|
||||||
def restore_env_variables():
|
|
||||||
os.environ.pop("PLAYWRIGHT_DOWNLOAD_HOST", None)
|
|
||||||
if BotConfig.system_proxy:
|
|
||||||
os.environ.pop("HTTPS_PROXY", None)
|
|
||||||
if original_proxy is not None:
|
|
||||||
os.environ["HTTPS_PROXY"] = original_proxy
|
|
||||||
|
|
||||||
def try_install_chromium():
|
|
||||||
try:
|
|
||||||
sys.argv = ["", "install", "chromium"]
|
|
||||||
main()
|
|
||||||
except SystemExit as e:
|
|
||||||
return e.code == 0
|
|
||||||
return False
|
|
||||||
|
|
||||||
logger.info("检查 Chromium 更新")
|
|
||||||
|
|
||||||
original_proxy = os.environ.get("HTTPS_PROXY")
|
|
||||||
set_env_variables()
|
|
||||||
|
|
||||||
success = try_install_chromium()
|
|
||||||
|
|
||||||
if not success:
|
|
||||||
logger.info("Chromium 更新失败,尝试从原始仓库下载,速度较慢")
|
|
||||||
os.environ["PLAYWRIGHT_DOWNLOAD_HOST"] = ""
|
|
||||||
success = try_install_chromium()
|
|
||||||
|
|
||||||
restore_env_variables()
|
|
||||||
|
|
||||||
if not success:
|
|
||||||
raise RuntimeError("未知错误,Chromium 下载失败")
|
|
||||||
|
|
||||||
|
|
||||||
async def check_playwright_env():
|
|
||||||
"""检查 Playwright 依赖"""
|
|
||||||
logger.info("检查 Playwright 依赖")
|
|
||||||
try:
|
|
||||||
async with async_playwright() as p:
|
|
||||||
await p.chromium.launch()
|
|
||||||
except Exception as e:
|
|
||||||
raise ImportError("加载失败,Playwright 依赖不全,") from e
|
|
||||||
|
|
||||||
|
|
||||||
class BrowserIsNone(Exception):
|
class BrowserIsNone(Exception):
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from collections.abc import AsyncGenerator, Awaitable, Callable, Sequence
|
from collections.abc import AsyncGenerator, Awaitable, Callable, Sequence
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
import json
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import time
|
import time
|
||||||
from typing import Any, ClassVar, cast
|
from typing import Any, ClassVar, cast
|
||||||
@ -17,11 +16,13 @@ from rich.progress import (
|
|||||||
TextColumn,
|
TextColumn,
|
||||||
TransferSpeedColumn,
|
TransferSpeedColumn,
|
||||||
)
|
)
|
||||||
|
import ujson as json
|
||||||
|
|
||||||
from zhenxun.configs.config import BotConfig
|
from zhenxun.configs.config import BotConfig
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.decorator.retry import Retry
|
from zhenxun.utils.decorator.retry import Retry
|
||||||
from zhenxun.utils.exception import AllURIsFailedError
|
from zhenxun.utils.exception import AllURIsFailedError
|
||||||
|
from zhenxun.utils.manager.priority_manager import PriorityLifecycle
|
||||||
from zhenxun.utils.user_agent import get_user_agent
|
from zhenxun.utils.user_agent import get_user_agent
|
||||||
|
|
||||||
from .browser import AsyncPlaywright, BrowserIsNone # noqa: F401
|
from .browser import AsyncPlaywright, BrowserIsNone # noqa: F401
|
||||||
@ -32,16 +33,14 @@ driver = nonebot.get_driver()
|
|||||||
_client: AsyncClient | None = None
|
_client: AsyncClient | None = None
|
||||||
|
|
||||||
|
|
||||||
@driver.on_startup
|
@PriorityLifecycle.on_startup(priority=5)
|
||||||
async def _init_client():
|
async def _():
|
||||||
"""
|
"""
|
||||||
在Bot启动时初始化全局httpx客户端。
|
在Bot启动时初始化全局httpx客户端。
|
||||||
"""
|
"""
|
||||||
global _client
|
global _client
|
||||||
proxy_url = BotConfig.system_proxy if BotConfig.system_proxy else None
|
|
||||||
|
|
||||||
client_kwargs = {}
|
client_kwargs = {}
|
||||||
if proxy_url:
|
if proxy_url := BotConfig.system_proxy or None:
|
||||||
try:
|
try:
|
||||||
version_parts = httpx.__version__.split(".")
|
version_parts = httpx.__version__.split(".")
|
||||||
major = int("".join(c for c in version_parts[0] if c.isdigit()))
|
major = int("".join(c for c in version_parts[0] if c.isdigit()))
|
||||||
@ -71,7 +70,7 @@ async def _init_client():
|
|||||||
|
|
||||||
|
|
||||||
@driver.on_shutdown
|
@driver.on_shutdown
|
||||||
async def _close_client():
|
async def _():
|
||||||
"""
|
"""
|
||||||
在Bot关闭时关闭全局httpx客户端。
|
在Bot关闭时关闭全局httpx客户端。
|
||||||
"""
|
"""
|
||||||
@ -172,11 +171,7 @@ class AsyncHttpx:
|
|||||||
use_proxy = final_config.pop("use_proxy", True)
|
use_proxy = final_config.pop("use_proxy", True)
|
||||||
|
|
||||||
if "proxies" not in final_config and "proxy" not in final_config:
|
if "proxies" not in final_config and "proxy" not in final_config:
|
||||||
if use_proxy:
|
final_config["proxies"] = cls.default_proxy if use_proxy else None
|
||||||
final_config["proxies"] = cls.default_proxy
|
|
||||||
else:
|
|
||||||
final_config["proxies"] = None
|
|
||||||
|
|
||||||
return final_config
|
return final_config
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -212,8 +207,7 @@ class AsyncHttpx:
|
|||||||
"""
|
"""
|
||||||
[内部] 执行单次HTTP请求的私有核心方法,被重试装饰器包裹。
|
[内部] 执行单次HTTP请求的私有核心方法,被重试装饰器包裹。
|
||||||
"""
|
"""
|
||||||
response = await client.request(method, url, **kwargs)
|
return await client.request(method, url, **kwargs)
|
||||||
return response
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def _single_request(
|
async def _single_request(
|
||||||
@ -245,7 +239,7 @@ class AsyncHttpx:
|
|||||||
"""
|
"""
|
||||||
通用执行器,按顺序尝试多个URL,直到成功。
|
通用执行器,按顺序尝试多个URL,直到成功。
|
||||||
|
|
||||||
Args:
|
参数:
|
||||||
urls: 单个URL或URL列表。
|
urls: 单个URL或URL列表。
|
||||||
worker: 一个接受单个URL和其他kwargs并执行请求的协程函数。
|
worker: 一个接受单个URL和其他kwargs并执行请求的协程函数。
|
||||||
client: 可选的HTTP客户端。
|
client: 可选的HTTP客户端。
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user