diff --git a/nonebot/__init__.py b/nonebot/__init__.py
index ae0401fa..7f19e26d 100644
--- a/nonebot/__init__.py
+++ b/nonebot/__init__.py
@@ -232,8 +232,8 @@ def init(*, _env_file: Optional[str] = None, **kwargs):
default_filter.level = (
"DEBUG" if config.debug else
"INFO") if config.log_level is None else config.log_level
- logger.opt(
- colors=True).info(f"Current Env: {env.environment}")
+ logger.opt(colors=True).info(
+ f"Current Env: {escape_tag(env.environment)}")
logger.opt(colors=True).debug(
f"Loaded Config: {escape_tag(str(config.dict()))}")
diff --git a/nonebot/drivers/__init__.py b/nonebot/drivers/__init__.py
index 7607e4b3..c3806ec8 100644
--- a/nonebot/drivers/__init__.py
+++ b/nonebot/drivers/__init__.py
@@ -11,6 +11,7 @@ from dataclasses import dataclass, field
from typing import Any, Set, Dict, Type, Union, Optional, Callable, Awaitable, TYPE_CHECKING
from nonebot.log import logger
+from nonebot.utils import escape_tag
from nonebot.config import Env, Config
from nonebot.typing import T_BotConnectionHook, T_BotDisconnectionHook
@@ -87,13 +88,13 @@ class Driver(abc.ABC):
* ``**kwargs``: 其他传递给适配器的参数
"""
if name in self._adapters:
- logger.opt(
- colors=True).debug(f'Adapter "{name}" already exists')
+ logger.opt(colors=True).debug(
+ f'Adapter "{escape_tag(name)}" already exists')
return
self._adapters[name] = adapter
adapter.register(self, self.config, **kwargs)
- logger.opt(
- colors=True).debug(f'Succeeded to load adapter "{name}"')
+ logger.opt(colors=True).debug(
+ f'Succeeded to load adapter "{escape_tag(name)}"')
@property
@abc.abstractmethod
@@ -119,7 +120,7 @@ class Driver(abc.ABC):
* ``**kwargs``
"""
logger.opt(colors=True).debug(
- f"Loaded adapters: {', '.join(self._adapters)}")
+ f"Loaded adapters: {escape_tag(', '.join(self._adapters))}")
@abc.abstractmethod
def on_startup(self, func: Callable) -> Callable:
diff --git a/nonebot/drivers/aiohttp.py b/nonebot/drivers/aiohttp.py
index 10d464c0..9d726da8 100644
--- a/nonebot/drivers/aiohttp.py
+++ b/nonebot/drivers/aiohttp.py
@@ -16,6 +16,7 @@ from yarl import URL
from nonebot.log import logger
from nonebot.adapters import Bot
+from nonebot.utils import escape_tag
from nonebot.typing import overrides
from nonebot.config import Env, Config
from nonebot.drivers import (ForwardDriver, HTTPPollingSetup, WebSocketSetup,
@@ -213,7 +214,8 @@ class Driver(ForwardDriver):
url = URL(setup.url)
if not url.is_absolute() or not url.host:
logger.opt(colors=True).error(
- f"Error parsing url {url}")
+ f"Error parsing url {escape_tag(str(url))}"
+ )
return
host = f"{url.host}:{url.port}" if url.port else url.host
return HTTPRequest(setup.http_version, url.scheme, url.path,
@@ -226,8 +228,8 @@ class Driver(ForwardDriver):
setup_: Optional[HTTPPollingSetup] = None
logger.opt(colors=True).info(
- f"Start http polling for {setup.adapter.upper()} "
- f"Bot {setup.self_id}")
+ f"Start http polling for {escape_tag(setup.adapter.upper())} "
+ f"Bot {escape_tag(setup.self_id)}")
try:
async with aiohttp.ClientSession() as session:
@@ -265,7 +267,8 @@ class Driver(ForwardDriver):
else:
logger.opt(colors=True).error(
"Unsupported HTTP Version "
- f"{request.http_version}")
+ f"{escape_tag(request.http_version)}"
+ )
return
logger.debug(
@@ -284,7 +287,7 @@ class Driver(ForwardDriver):
asyncio.create_task(bot.handle_message(data))
except aiohttp.ClientResponseError as e:
logger.opt(colors=True, exception=e).error(
- f"Error occurred while requesting {setup_.url}. "
+ f"Error occurred while requesting {escape_tag(setup_.url)}. "
"Try to reconnect...")
await asyncio.sleep(setup_.poll_interval)
@@ -313,7 +316,7 @@ class Driver(ForwardDriver):
url = URL(setup_.url)
if not url.is_absolute() or not url.host:
logger.opt(colors=True).error(
- f"Error parsing url {url}"
+ f"Error parsing url {escape_tag(str(url))}"
)
await asyncio.sleep(setup_.reconnect_interval)
continue
@@ -329,8 +332,9 @@ class Driver(ForwardDriver):
headers=headers,
timeout=30.) as ws:
logger.opt(colors=True).info(
- f"WebSocket Connection to {setup_.adapter.upper()} "
- f"Bot {setup_.self_id} succeeded!")
+ f"WebSocket Connection to {escape_tag(setup_.adapter.upper())} "
+ f"Bot {escape_tag(setup_.self_id)} succeeded!"
+ )
request = WebSocket(
"1.1", url.scheme, url.path,
url.raw_query_string.encode("latin-1"), headers,
@@ -360,7 +364,7 @@ class Driver(ForwardDriver):
except (aiohttp.ClientResponseError,
aiohttp.ClientConnectionError) as e:
logger.opt(colors=True, exception=e).error(
- f"Error while connecting to {url}. "
+ f"Error while connecting to {escape_tag(str(url))}. "
"Try to reconnect...")
finally:
if bot:
diff --git a/nonebot/drivers/fastapi.py b/nonebot/drivers/fastapi.py
index 3fda94f4..7682b089 100644
--- a/nonebot/drivers/fastapi.py
+++ b/nonebot/drivers/fastapi.py
@@ -27,6 +27,7 @@ from starlette.websockets import (WebSocketState, WebSocketDisconnect, WebSocket
from nonebot.log import logger
from nonebot.adapters import Bot
+from nonebot.utils import escape_tag
from nonebot.typing import overrides
from nonebot.config import Env, Config as NoneBotConfig
from nonebot.drivers import (ReverseDriver, ForwardDriver, HTTPPollingSetup,
@@ -283,25 +284,26 @@ class Driver(ReverseDriver, ForwardDriver):
# Create Bot Object
BotClass = self._adapters[adapter]
- x_self_id, _ = await BotClass.check_permission(self, ws)
+ self_id, _ = await BotClass.check_permission(self, ws)
- if not x_self_id:
+ if not self_id:
await ws.close(code=status.WS_1008_POLICY_VIOLATION)
return
- if x_self_id in self._clients:
+ if self_id in self._clients:
logger.opt(colors=True).warning(
- "There's already a reverse websocket connection, "
- f"{adapter.upper()} Bot {x_self_id} ignored.")
+ "There's already a websocket connection, "
+ f"{escape_tag(adapter.upper())} Bot {escape_tag(self_id)} ignored."
+ )
await ws.close(code=status.WS_1008_POLICY_VIOLATION)
return
- bot = BotClass(x_self_id, ws)
+ bot = BotClass(self_id, ws)
await ws.accept()
logger.opt(colors=True).info(
- f"WebSocket Connection from {adapter.upper()} "
- f"Bot {x_self_id} Accepted!")
+ f"WebSocket Connection from {escape_tag(adapter.upper())} "
+ f"Bot {escape_tag(self_id)} Accepted!")
self._bot_connect(bot)
@@ -328,7 +330,8 @@ class Driver(ReverseDriver, ForwardDriver):
url = httpx.URL(setup.url)
if not url.netloc:
logger.opt(colors=True).error(
- f"Error parsing url {url}")
+ f"Error parsing url {escape_tag(str(url))}"
+ )
return
return HTTPRequest(
setup.http_version, url.scheme, url.path, url.query, {
@@ -340,8 +343,8 @@ class Driver(ReverseDriver, ForwardDriver):
setup_: Optional[HTTPPollingSetup] = None
logger.opt(colors=True).info(
- f"Start http polling for {setup.adapter.upper()} "
- f"Bot {setup.self_id}")
+ f"Start http polling for {escape_tag(setup.adapter.upper())} "
+ f"Bot {escape_tag(setup.self_id)}")
try:
async with httpx.AsyncClient(http2=True) as session:
@@ -383,7 +386,7 @@ class Driver(ReverseDriver, ForwardDriver):
asyncio.create_task(bot.handle_message(data))
except httpx.HTTPError as e:
logger.opt(colors=True, exception=e).error(
- f"Error occurred while requesting {setup_.url}. "
+ f"Error occurred while requesting {escape_tag(setup_.url)}. "
"Try to reconnect...")
await asyncio.sleep(setup_.poll_interval)
@@ -411,7 +414,7 @@ class Driver(ReverseDriver, ForwardDriver):
url = httpx.URL(setup_.url)
if not url.netloc:
logger.opt(colors=True).error(
- f"Error parsing url {url}"
+ f"Error parsing url {escape_tag(str(url))}"
)
return
@@ -423,8 +426,8 @@ class Driver(ReverseDriver, ForwardDriver):
connection = Connect(setup_.url)
async with connection as ws:
logger.opt(colors=True).info(
- f"WebSocket Connection to {setup_.adapter.upper()} "
- f"Bot {setup_.self_id} succeeded!")
+ f"WebSocket Connection to {escape_tag(setup_.adapter.upper())} "
+ f"Bot {escape_tag(setup_.self_id)} succeeded!")
request = WebSocket("1.1", url.scheme, url.path,
url.query, headers, ws)
diff --git a/nonebot/drivers/quart.py b/nonebot/drivers/quart.py
index 75e3566d..d105122b 100644
--- a/nonebot/drivers/quart.py
+++ b/nonebot/drivers/quart.py
@@ -16,6 +16,7 @@ import uvicorn
from pydantic import BaseSettings
from nonebot.log import logger
+from nonebot.utils import escape_tag
from nonebot.typing import overrides
from nonebot.config import Env, Config as NoneBotConfig
from nonebot.drivers import ReverseDriver, HTTPRequest, WebSocket as BaseWebSocket
@@ -198,15 +199,16 @@ class Driver(ReverseDriver):
if self_id in self._clients:
logger.opt(colors=True).warning(
- "There's already a reverse websocket connection, "
- f"{adapter.upper()} Bot {self_id} ignored.")
+ "There's already a websocket connection, "
+ f"{escape_tag(adapter.upper())} Bot {escape_tag(self_id)} ignored."
+ )
raise exceptions.Forbidden(description='Client already exists.')
bot = BotClass(self_id, ws)
await ws.accept()
logger.opt(colors=True).info(
- f"WebSocket Connection from {adapter.upper()} "
- f"Bot {self_id} Accepted!")
+ f"WebSocket Connection from {escape_tag(adapter.upper())} "
+ f"Bot {escape_tag(self_id)} Accepted!")
self._bot_connect(bot)
try:
diff --git a/nonebot/message.py b/nonebot/message.py
index 4a3dc22c..a6044d2c 100644
--- a/nonebot/message.py
+++ b/nonebot/message.py
@@ -11,6 +11,7 @@ from typing import Set, Type, Optional, TYPE_CHECKING
from nonebot.log import logger
from nonebot.rule import TrieRule
+from nonebot.utils import escape_tag
from nonebot.matcher import matchers, Matcher
from nonebot.exception import IgnoredException, StopPropagation, NoLogException
from nonebot.typing import T_State, T_EventPreProcessor, T_RunPreProcessor, T_EventPostProcessor, T_RunPostProcessor
@@ -193,7 +194,7 @@ async def handle_event(bot: "Bot", event: "Event") -> Optional[Exception]:
asyncio.create_task(handle_event(bot, event))
"""
show_log = True
- log_msg = f"{bot.type.upper()} {bot.self_id} | "
+ log_msg = f"{escape_tag(bot.type.upper())} {escape_tag(bot.self_id)} | "
try:
log_msg += event.get_log_string()
except NoLogException:
@@ -210,7 +211,7 @@ async def handle_event(bot: "Bot", event: "Event") -> Optional[Exception]:
await asyncio.gather(*coros)
except IgnoredException as e:
logger.opt(colors=True).info(
- f"Event {event.get_event_name()} is ignored")
+ f"Event {escape_tag(event.get_event_name())} is ignored")
return e
except Exception as e:
logger.opt(colors=True, exception=e).error(
diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py
index f4457d5c..038db8fc 100644
--- a/nonebot/plugin/__init__.py
+++ b/nonebot/plugin/__init__.py
@@ -16,6 +16,7 @@ import tomlkit
from nonebot.log import logger
from nonebot.matcher import Matcher
from nonebot.handler import Handler
+from nonebot.utils import escape_tag
from nonebot.permission import Permission
from nonebot.typing import T_State, T_StateFactory, T_Handler, T_RuleChecker
from nonebot.rule import Rule, startswith, endswith, keyword, command, shell_command, ArgumentParser, regex
@@ -945,12 +946,13 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]:
plugin = Plugin(plugin_name, module)
plugins[plugin_name] = plugin
- logger.opt(
- colors=True).success(f'Succeeded to import "{plugin_name}"')
+ logger.opt(colors=True).success(
+ f'Succeeded to import "{escape_tag(plugin_name)}"')
return plugin
except Exception as e:
logger.opt(colors=True, exception=e).error(
- f'Failed to import "{plugin_name}"')
+ f'Failed to import "{escape_tag(plugin_name)}"'
+ )
return None
diff --git a/nonebot/utils.py b/nonebot/utils.py
index 8253d3c7..7891bdf2 100644
--- a/nonebot/utils.py
+++ b/nonebot/utils.py
@@ -80,6 +80,6 @@ def logger_wrapper(logger_name: str):
def log(level: str, message: str, exception: Optional[Exception] = None):
return logger.opt(colors=True, exception=exception).log(
- level, f"{logger_name} | " + message)
+ level, f"{escape_tag(logger_name)} | " + message)
return log
diff --git a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py
index 69bcd6e7..a927c7ab 100644
--- a/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py
+++ b/packages/nonebot-adapter-cqhttp/nonebot/adapters/cqhttp/bot.py
@@ -256,7 +256,7 @@ class Bot(BaseBot):
WebSocketSetup("cqhttp", self_id, url, headers=headers))
except Exception as e:
logger.opt(colors=True, exception=e).error(
- f"Bad url {url} for bot {self_id} "
+ f"Bad url {escape_tag(url)} for bot {escape_tag(self_id)} "
"in cqhttp forward websocket")
@classmethod
@@ -309,7 +309,7 @@ class Bot(BaseBot):
调用 `_check_reply <#async-check-reply-bot-event>`_, `_check_at_me <#check-at-me-bot-event>`_, `_check_nickname <#check-nickname-bot-event>`_ 处理事件并转换为 `Event <#class-event>`_
"""
- data = json.loads(message)
+ data: dict = json.loads(message)
if not data:
return
@@ -342,7 +342,7 @@ class Bot(BaseBot):
await handle_event(self, event)
except Exception as e:
logger.opt(colors=True, exception=e).error(
- f"Failed to handle event. Raw: {escape_tag(data)}"
+ f"Failed to handle event. Raw: {escape_tag(str(data))}"
)
@overrides(BaseBot)
diff --git a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py
index 4e13c970..57dac284 100644
--- a/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py
+++ b/packages/nonebot-adapter-ding/nonebot/adapters/ding/bot.py
@@ -8,6 +8,7 @@ from typing import Any, Tuple, Union, Optional, TYPE_CHECKING
import httpx
from nonebot.log import logger
+from nonebot.utils import escape_tag
from nonebot.typing import overrides
from nonebot.message import handle_event
from nonebot.adapters import Bot as BaseBot
@@ -82,7 +83,7 @@ class Bot(BaseBot):
@overrides(BaseBot)
async def handle_message(self, message: bytes):
- data = json.loads(message)
+ data: dict = json.loads(message)
if not data:
return
@@ -104,7 +105,7 @@ class Bot(BaseBot):
await handle_event(self, event)
except Exception as e:
logger.opt(colors=True, exception=e).error(
- f"Failed to handle event. Raw: {data}"
+ f"Failed to handle event. Raw: {escape_tag(str(data))}"
)
return
diff --git a/packages/nonebot-adapter-feishu/nonebot/adapters/feishu/bot.py b/packages/nonebot-adapter-feishu/nonebot/adapters/feishu/bot.py
index c5ae46e1..d513fb8c 100644
--- a/packages/nonebot-adapter-feishu/nonebot/adapters/feishu/bot.py
+++ b/packages/nonebot-adapter-feishu/nonebot/adapters/feishu/bot.py
@@ -6,15 +6,16 @@ import httpx
from aiocache import Cache, cached
from aiocache.serializers import PickleSerializer
+from nonebot.log import logger
+from nonebot.utils import escape_tag
+from nonebot.typing import overrides
+from nonebot.message import handle_event
from nonebot.adapters import Bot as BaseBot
from nonebot.drivers import Driver, HTTPRequest, HTTPResponse
-from nonebot.log import logger
-from nonebot.message import handle_event
-from nonebot.typing import overrides
from .config import Config as FeishuConfig
-from .event import (Event, GroupMessageEvent, MessageEvent,
- PrivateMessageEvent, get_event_model)
+from .event import (Event, GroupMessageEvent, MessageEvent, PrivateMessageEvent,
+ get_event_model)
from .exception import ActionFailed, ApiNotAvailable, NetworkError
from .message import Message, MessageSegment, MessageSerializer
from .utils import AESCipher, log
@@ -202,7 +203,7 @@ class Bot(BaseBot):
处理事件并转换为 `Event <#class-event>`_
"""
- data = json.loads(message)
+ data: dict = json.loads(message)
if data.get("type") == "url_verification":
return
@@ -229,7 +230,7 @@ class Bot(BaseBot):
await handle_event(self, event)
except Exception as e:
logger.opt(colors=True, exception=e).error(
- f"Failed to handle event. Raw: {message}"
+ f"Failed to handle event. Raw: {escape_tag(str(data))}"
)
def _construct_url(self, path: str) -> str: