# 加载插件

创建一个完整的项目 一章节中,我们已经创建了插件目录 awesome_bot/plugins,现在我们在机器人入口文件中加载它。当然,你也可以单独加载一个插件。

# 加载内置插件

bot.py 文件中添加以下行:








 






import nonebot
from nonebot.adapters.cqhttp import Bot

nonebot.init()

driver = nonebot.get_driver()
driver.register_adapter("cqhttp", Bot) # 注册 CQHTTP 的 Adapter
nonebot.load_builtin_plugins() # 加载 nonebot 内置插件

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()
1
2
3
4
5
6
7
8
9
10
11
12
13

WARNING

目前, 内建插件仅支持 CQHTTP 的 Adapter

如果您使用的是其他 Adapter, 请移步该 Adapter 相应的文档

这将会加载 nonebot 内置的插件,它包含:

  • 命令 say:可由superuser使用,可以将消息内容由特殊纯文本转为富文本
  • 命令 echo:可由任何人使用,将消息原样返回

以上命令均需要指定机器人,即私聊、群聊内@机器人、群聊内称呼机器人昵称。参考 Rule: to_me

# 加载插件目录

bot.py 文件中添加以下行:






 






import nonebot

nonebot.init()

# 加载插件目录,该目录下为各插件,以下划线开头的插件将不会被加载
nonebot.load_plugins("awesome_bot/plugins")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()
1
2
3
4
5
6
7
8
9
10
11

提示

加载插件目录时,目录下以 _ 下划线开头的插件将不会被加载!

提示

不能存在相同名称的插件!

警告

插件间不应该存在过多的耦合,如果确实需要导入某个插件内的数据,可以参考 进阶-跨插件访问

# 加载单个插件

bot.py 文件中添加以下行:






 

 






import nonebot

nonebot.init()

# 加载一个 pip 安装的插件
nonebot.load_plugin("nonebot_plugin_status")
# 加载本地的单独插件
nonebot.load_plugin("awesome_bot.plugins.xxx")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()
1
2
3
4
5
6
7
8
9
10
11
12
13

# 从 json 文件中加载插件

bot.py 文件中添加以下行:






 






import nonebot

nonebot.init()

# 从 plugin.json 加载插件
nonebot.load_from_json("plugin.json")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()
1
2
3
4
5
6
7
8
9
10
11

json 文件示例

{
  "plugins": ["nonebot_plugin_status", "awesome_bot.plugins.xxx"],
  "plugin_dirs": ["awesome_bot/plugins"]
}
1
2
3
4

# 从 toml 文件中加载插件

bot.py 文件中添加以下行:






 






import nonebot

nonebot.init()

# 从 pyproject.toml 加载插件
nonebot.load_from_toml("pyproject.toml")

app = nonebot.get_asgi()

if __name__ == "__main__":
    nonebot.run()
1
2
3
4
5
6
7
8
9
10
11

toml 文件示例:

[nonebot.plugins]
plugins = ["nonebot_plugin_status", "awesome_bot.plugins.xxx"]
plugin_dirs = ["awesome_bot/plugins"]
1
2
3

TIP

nb-cli 默认使用 pyproject.toml 加载插件。

# 子插件(嵌套插件)

在插件中同样可以加载子插件,例如如下插件目录结构:

foo_plugin ├── plugins │ ├── sub_plugin1 │ │ └── __init__.py │ └── sub_plugin2.py ├── __init__.py └── config.py

在插件目录下的 __init__.py 中添加如下代码:

from pathlib import Path

import nonebot

# store all subplugins
_sub_plugins = set()
# load sub plugins
_sub_plugins |= nonebot.load_plugins(
    str((Path(__file__).parent / "plugins").resolve()))
1
2
3
4
5
6
7
8
9

插件将会被加载并存储于 _sub_plugins 中。

# 运行结果

尝试运行 nb run 或者 python bot.py,可以看到日志输出了类似如下内容:

09-19 21:51:59 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
09-19 21:51:59 [INFO] nonebot | Succeeded to import "plugin_in_folder"
1
2