mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-09-28 16:20:56 +08:00
* bugfix:修复内存泄露和信号量饥饿问题 * 修复图片渲染按高度截断问题 * 优化图片渲染速度 * 权限检查去掉无效引用代码 * 添加uv支持 * 🚨 auto fix by pre-commit hooks * bugfix:修改gitignore换行 * bugfix:修复测试没有新生成uv.lock * 修复导入错误 * bugfix:移除重复调用 * 🚨 auto fix by pre-commit hooks * 清理残余poetry引用 * 更新uv安装方式 * 修复阿里云获取问题 * 增加资源下载提示 * 🚨 auto fix by pre-commit hooks * 修改资源下载为流式 * 🚨 auto fix by pre-commit hooks * 提高启动速度 * 移除bot.py支持 * 🚨 auto fix by pre-commit hooks * 优化win脚本逻辑 * 🚨 auto fix by pre-commit hooks * 清理残余无效逻辑 * 代码改进 * 🚨 auto fix by pre-commit hooks * 增加数据库迁移存在性检查 * 🚨 auto fix by pre-commit hooks * chore(test): 添加pytest超时控制和优雅关闭机制 - 在GitHub Actions工作流中添加作业级和步骤级超时限制,防止测试无限期挂起 - 添加pytest-timeout依赖并配置全局超时为120秒 - 在send_queue服务添加关闭钩子,确保worker任务正确取消 - 在priority_manager添加on_shutdown钩子,支持优先级生命周期的关闭阶段 * chore(lint): 禁用超长行的lint警告 * Modify restart logic for Windows platform * 🚨 auto fix by pre-commit hooks * bugfix:修复sys导入问题 * 清理无效结构 * bugfix:修复路径问题 * bugfix:修复shell语法传递给git导致资源获取失败问题 * 优化关闭显示 * bugfix:修复路径问题 * bugfix:增加路径安全 * bugfix:修复orm绕过问题 * 放宽numpy版本限制 * 修改重启方案 * bugfix:修复循环导入 * 优化逻辑 * Enhance disconnect function with error handling Added error handling for disconnect function and imported ConfigurationError. * Implement emergency restart mechanism Added emergency restart mechanism using atexit to ensure process restart even on severe exceptions during shutdown. * 🚨 auto fix by pre-commit hooks * 重启行为归一化 * 修复测试检测问题 * bugfix:修复测试侧类型报错问题 * 引入launcher机制 * 移除重启测试 * 收紧缓存调用路径 * 类型注解收敛 * 优化浏览器回收行为 * 优化浏览器渲染 * bugfix:解决重复关闭浏览器问题 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: ManyManyTomato <93612024+ATTomatoo@users.noreply.github.com> Co-authored-by: AkashiCoin <l1040186796@gmail.com>
124 lines
4.0 KiB
Python
124 lines
4.0 KiB
Python
from collections import defaultdict
|
|
import time
|
|
|
|
from nonebot.adapters import Event
|
|
from nonebot.adapters.onebot.v11 import Bot
|
|
from nonebot.exception import IgnoredException
|
|
from nonebot.matcher import Matcher
|
|
from nonebot.message import run_preprocessor
|
|
from nonebot.typing import T_State
|
|
from nonebot_plugin_alconna import At
|
|
from nonebot_plugin_session import EventSession
|
|
|
|
from zhenxun.configs.config import Config
|
|
from zhenxun.models.ban_console import BanConsole
|
|
from zhenxun.services.log import logger
|
|
from zhenxun.utils.enum import PluginType
|
|
from zhenxun.utils.message import MessageUtils
|
|
|
|
malicious_check_time = Config.get_config("hook", "MALICIOUS_CHECK_TIME")
|
|
malicious_ban_count = Config.get_config("hook", "MALICIOUS_BAN_COUNT")
|
|
|
|
if not malicious_check_time:
|
|
raise ValueError("模块: [hook], 配置项: [MALICIOUS_CHECK_TIME] 为空或小于0")
|
|
if not malicious_ban_count:
|
|
raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_COUNT] 为空或小于0")
|
|
|
|
|
|
class BanCheckLimiter:
|
|
"""
|
|
恶意命令触发检测
|
|
"""
|
|
|
|
def __init__(self, default_check_time: float = 5, default_count: int = 4):
|
|
self.mint = defaultdict(int)
|
|
self.mtime = defaultdict(float)
|
|
self.default_check_time = default_check_time
|
|
self.default_count = default_count
|
|
|
|
def add(self, key: str | float):
|
|
if self.mint[key] == 1:
|
|
self.mtime[key] = time.time()
|
|
self.mint[key] += 1
|
|
|
|
def check(self, key: str | float) -> bool:
|
|
if time.time() - self.mtime[key] > self.default_check_time:
|
|
return self._extracted_from_check_3(key, False)
|
|
if (
|
|
self.mint[key] >= self.default_count
|
|
and time.time() - self.mtime[key] < self.default_check_time
|
|
):
|
|
return self._extracted_from_check_3(key, True)
|
|
return False
|
|
|
|
# TODO Rename this here and in `check`
|
|
def _extracted_from_check_3(self, key, arg1):
|
|
self.mtime[key] = time.time()
|
|
self.mint[key] = 0
|
|
return arg1
|
|
|
|
|
|
_blmt = BanCheckLimiter(
|
|
malicious_check_time,
|
|
malicious_ban_count,
|
|
)
|
|
|
|
|
|
# 恶意触发命令检测
|
|
@run_preprocessor
|
|
async def _(
|
|
matcher: Matcher, bot: Bot, session: EventSession, state: T_State, event: Event
|
|
):
|
|
# 提前判断 notice 类型,直接跳过
|
|
if matcher.type == "notice":
|
|
return
|
|
|
|
# 提前判断插件类型,跳过不需要检测的插件
|
|
if plugin := matcher.plugin:
|
|
if metadata := plugin.metadata:
|
|
extra = metadata.extra
|
|
if extra.get("plugin_type") in [
|
|
PluginType.HIDDEN,
|
|
PluginType.DEPENDANT,
|
|
PluginType.ADMIN,
|
|
PluginType.SUPERUSER,
|
|
]:
|
|
return
|
|
module = plugin.module_name
|
|
else:
|
|
return
|
|
|
|
user_id = session.id1
|
|
group_id = session.id3 or session.id2
|
|
malicious_ban_time = Config.get_config("hook", "MALICIOUS_BAN_TIME")
|
|
if not malicious_ban_time:
|
|
raise ValueError("模块: [hook], 配置项: [MALICIOUS_BAN_TIME] 为空或小于0")
|
|
if user_id and module:
|
|
if _blmt.check(f"{user_id}__{module}"):
|
|
await BanConsole.ban(
|
|
user_id,
|
|
group_id,
|
|
9,
|
|
"恶意触发命令检测",
|
|
malicious_ban_time * 60,
|
|
bot.self_id,
|
|
)
|
|
logger.info(
|
|
f"触发了恶意触发检测: {matcher.plugin_name}",
|
|
"HOOK",
|
|
session=session,
|
|
)
|
|
await MessageUtils.build_message(
|
|
[
|
|
At(flag="user", target=user_id),
|
|
"检测到恶意触发命令,您将被封禁 30 分钟",
|
|
]
|
|
).send()
|
|
logger.debug(
|
|
f"触发了恶意触发检测: {matcher.plugin_name}",
|
|
"HOOK",
|
|
session=session,
|
|
)
|
|
raise IgnoredException("检测到恶意触发命令")
|
|
_blmt.add(f"{user_id}__{module}")
|