import os import re from dotenv import load_dotenv # 加载 .env 环境变量(针对本地运行) load_dotenv() import nonebot from nonebot.adapters.qq import Adapter as QQAdapter from nonebot.adapters.qq.message import Message, MessageSegment # 预编译匹配 URL 的正则,用来删除URL URL_REGEX = re.compile( r"(http|https)://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~]*)?" ) # 初始化 NoneBot # 显式配置驱动器并开启沙盒模式 # 同时在这里直接通过代码填入 Intent,防止环境变量解析出问题 nonebot.init( driver="~fastapi+~httpx+~websockets", qq_is_sandbox=True, orm_upgrade_on_start=True, # 开启启动时自动升级数据库迁移 qq_bots=[ { "id": os.getenv("QQ_APP_ID"), "token": os.getenv("QQ_TOKEN"), "secret": os.getenv("QQ_SECRET"), # 开启所有核心消息意图 "intent": { "c2c_group_at_messages": True, # 群聊@机器人消息 "direct_message": True, # 私聊消息 "at_messages": True, # 频道@机器人消息 "guild_messages": True, # 频道消息 }, } ], ) # 注册适配器 driver = nonebot.get_driver() driver.register_adapter(QQAdapter) from nonebot.adapters import Bot # 注册全局 API 调用钩子,拦截并清理消息中的 URL @Bot.on_calling_api async def handle_api_call(bot, api, data): # 针对发送消息的接口进行处理 if api in ["post_group_messages", "post_c2c_messages", "post_messages"]: if "content" in data and isinstance(data["content"], str): # 直接删除所有 URL data["content"] = URL_REGEX.sub("", data["content"]) # 如果消息是 Message 对象,也需要处理其中的文本段 if "message" in data: msg = data["message"] if isinstance(msg, str): data["message"] = URL_REGEX.sub("", msg) # 加载内置插件 nonebot.load_builtin_plugins("echo") # 加载第三方插件 nonebot.load_plugin("nonebot_plugin_skland") nonebot.load_plugin("haruka_bot") # 如果你有自定义插件目录,可以这样加载 nonebot.load_plugin("src.plugins.order_notifier") if __name__ == "__main__": # Hugging Face 必须监听 7860 端口 nonebot.run(host="0.0.0.0", port=7860)