mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-28 02:55:18 +08:00
Rename package to "nonebot"
This commit is contained in:
parent
b8cb8e440b
commit
663797219a
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -1,3 +1,4 @@
|
||||
{
|
||||
"python.pythonPath": "${workspaceFolder}/venv/bin/python"
|
||||
"python.pythonPath": "${workspaceFolder}/venv/bin/python",
|
||||
"search.usePCRE2": true
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
# NoneBot
|
||||
|
||||
[![License](https://img.shields.io/github/license/richardchien/none-bot.svg)](LICENSE)
|
||||
[![PyPI](https://img.shields.io/pypi/v/none-bot.svg)](https://pypi.python.org/pypi/none-bot)
|
||||
[![License](https://img.shields.io/github/license/richardchien/nonebot.svg)](LICENSE)
|
||||
[![PyPI](https://img.shields.io/pypi/v/nonebot.svg)](https://pypi.python.org/pypi/nonebot)
|
||||
![Python](https://img.shields.io/badge/python-3.6%2B-blue.svg)
|
||||
[![QQ 群](https://img.shields.io/badge/qq%E7%BE%A4-201865589-orange.svg)](https://jq.qq.com/?_wv=1027&k=5Euplde)
|
||||
[![Telegram](https://img.shields.io/badge/telegram-chat-blue.svg)](https://t.me/cqhttp)
|
||||
@ -30,6 +30,6 @@ NoneBot 在其底层与酷 Q 交互的部分使用 [python-aiocqhttp](https://gi
|
||||
|
||||
## 贡献
|
||||
|
||||
如果你在使用过程中发现任何问题,可以 [提交 issue](https://github.com/richardchien/none-bot/issues/new) 或自行 fork 修改后提交 pull request。
|
||||
如果你在使用过程中发现任何问题,可以 [提交 issue](https://github.com/richardchien/nonebot/issues/new) 或自行 fork 修改后提交 pull request。
|
||||
|
||||
如果你要提交 pull request,请确保你的代码风格和项目已有的代码保持一致,遵循 [PEP 8](https://www.python.org/dev/peps/pep-0008/),变量命名清晰,有适当的注释。
|
||||
|
@ -1,22 +1,22 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
from demo import config
|
||||
|
||||
none.init(config)
|
||||
nonebot.init(config)
|
||||
|
||||
|
||||
@none.scheduler.scheduled_job('interval', seconds=20)
|
||||
@nonebot.scheduler.scheduled_job('interval', seconds=20)
|
||||
async def cb():
|
||||
bot_ = none.get_bot()
|
||||
bot_ = nonebot.get_bot()
|
||||
try:
|
||||
await bot_.send_private_msg(user_id=1002647525, message='哇')
|
||||
except Exception as e:
|
||||
none.logger.exception(e)
|
||||
nonebot.logger.exception(e)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.load_builtin_plugins()
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'plugins'),
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'),
|
||||
'demo.plugins')
|
||||
none.run(host=config.HOST, port=config.PORT)
|
||||
nonebot.run(host=config.HOST, port=config.PORT)
|
||||
|
@ -1,6 +1,6 @@
|
||||
import re
|
||||
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
SECRET = 'abc'
|
||||
|
@ -1,7 +1,7 @@
|
||||
from aiocqhttp import Error as CQHttpError
|
||||
|
||||
from none import on_notice, NoticeSession, on_request, RequestSession
|
||||
from none.helpers import render_expression as __
|
||||
from nonebot import on_notice, NoticeSession, on_request, RequestSession
|
||||
from nonebot.helpers import render_expression as __
|
||||
|
||||
GROUP_GREETING = (
|
||||
'欢迎新同学 {name}[]![CQ:face,id=63][CQ:face,id=63][CQ:face,id=63]',
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
|
||||
_last_session = None
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none import (
|
||||
from nonebot import (
|
||||
on_command, CommandSession,
|
||||
on_natural_language, NLPSession, NLPResult
|
||||
)
|
||||
|
@ -1,8 +1,8 @@
|
||||
from none import (
|
||||
from nonebot import (
|
||||
CommandSession, CommandGroup,
|
||||
on_natural_language, NLPSession, NLPResult
|
||||
)
|
||||
from none.helpers import render_expression as __
|
||||
from nonebot.helpers import render_expression as __
|
||||
|
||||
from . import expressions as e
|
||||
|
||||
|
@ -18,7 +18,7 @@ module.exports = {
|
||||
],
|
||||
ga: 'UA-115509121-2',
|
||||
themeConfig: {
|
||||
repo: 'richardchien/none-bot',
|
||||
repo: 'richardchien/nonebot',
|
||||
docsDir: 'docs',
|
||||
editLinks: true,
|
||||
editLinkText: '在 GitHub 上编辑此页',
|
||||
|
@ -1,6 +1,6 @@
|
||||
# 类 Shell 的参数解析
|
||||
|
||||
`none.argparse` 模块主要继承自 Python 内置的同名模块(`argparse`),用于解析命令的参数。在需要编写类 shell 语法的命令的时候,使用此模块可以大大提高开发效率。
|
||||
`nonebot.argparse` 模块主要继承自 Python 内置的同名模块(`argparse`),用于解析命令的参数。在需要编写类 shell 语法的命令的时候,使用此模块可以大大提高开发效率。
|
||||
|
||||
「类 shell 语法」指的是形如 `some-command --verbose -n 3 --name=some-name argument1 argument2` 的类似于 shell 命令的语法。
|
||||
|
||||
@ -101,6 +101,6 @@ COMMAND:
|
||||
|
||||
`on_command` 的 `shell_like=True` 参数告诉 NoneBot 这个命令需要使用类 shell 语法,NoneBot 会自动添加命令参数解析器来使用 Python 内置的 `shlex` 包分割参数。分割后的参数被放在 `session.args['argv']`,可通过 `session.argv` 属性来快速获得。
|
||||
|
||||
命令处理函数中,使用 `none.argparse` 模块包装后的 `ArgumentParser` 类来解析参数,具体 `ArgumentParser` 添加参数的方法,请参考 [`argparse`](https://docs.python.org/3/library/argparse.html)。在使用 `add_argument()` 方法添加需要解析的参数后,使用 `parse_args()` 方法最终将 `argv` 解析为 `argparse.Namespace` 对象。
|
||||
命令处理函数中,使用 `nonebot.argparse` 模块包装后的 `ArgumentParser` 类来解析参数,具体 `ArgumentParser` 添加参数的方法,请参考 [`argparse`](https://docs.python.org/3/library/argparse.html)。在使用 `add_argument()` 方法添加需要解析的参数后,使用 `parse_args()` 方法最终将 `argv` 解析为 `argparse.Namespace` 对象。
|
||||
|
||||
特别地,`parse_args()` 方法如果遇到需要打印帮助或报错并退出程序的情况(具体可以通过使用 Python 内置的 `argparse.ArgumentParser` 来体验),行为会更改为发送消息给当前 session 对应的上下文。注意到,`ArgumentParser` 类初始化时传入了 `session` 和 `usage` 参数,分别用于发送消息和使用帮助的内容。
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
NoneBot 所基于的 python-aiocqhttp 库使用的 web 框架是 Quart,因此 NoneBot 的部署方法和 Quart 一致([Deploying Quart](https://pgjones.gitlab.io/quart/deployment.html))。
|
||||
|
||||
Quart 官方建议使用 Hypercorn 来部署,这需要一个 ASGI app 对象,在 NoneBot 中,可使用 `none.get_bot().asgi` 获得 ASGI app 对象。
|
||||
Quart 官方建议使用 Hypercorn 来部署,这需要一个 ASGI app 对象,在 NoneBot 中,可使用 `nonebot.get_bot().asgi` 获得 ASGI app 对象。
|
||||
|
||||
具体地,通常在项目根目录下创建一个 `run.py` 文件如下:
|
||||
|
||||
@ -10,12 +10,12 @@ Quart 官方建议使用 Hypercorn 来部署,这需要一个 ASGI app 对象
|
||||
import os
|
||||
import sys
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
none.init(config)
|
||||
bot = none.get_bot()
|
||||
nonebot.init(config)
|
||||
bot = nonebot.get_bot()
|
||||
app = bot.asgi
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -1,23 +1,23 @@
|
||||
# 日志
|
||||
|
||||
`none.log` 模块提供了一个 `logger` 对象,可用于日志。
|
||||
`nonebot.log` 模块提供了一个 `logger` 对象,可用于日志。
|
||||
|
||||
使用 `none.init()` 配置 NoneBot 时,`logger` 对象的日志级别会随 `DEBUG` 配置项的不同而不同,如果 `DEBUG` 为 `True`,则日志级别为 `DEBUG`,否则为 `INFO`。你也可以在 `none.init()` 调用之后自行设置 `logger` 的日志级别。
|
||||
使用 `nonebot.init()` 配置 NoneBot 时,`logger` 对象的日志级别会随 `DEBUG` 配置项的不同而不同,如果 `DEBUG` 为 `True`,则日志级别为 `DEBUG`,否则为 `INFO`。你也可以在 `nonebot.init()` 调用之后自行设置 `logger` 的日志级别。
|
||||
|
||||
举例:
|
||||
|
||||
```python
|
||||
import logging
|
||||
|
||||
import none
|
||||
from none.log import logger
|
||||
import nonebot
|
||||
from nonebot.log import logger
|
||||
|
||||
import config
|
||||
|
||||
|
||||
none.init(config)
|
||||
nonebot.init(config)
|
||||
# logger.setLevel(logging.WARNING)
|
||||
|
||||
logger.info('Starting')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
```
|
||||
|
82
docs/api.md
82
docs/api.md
@ -10,7 +10,7 @@ sidebar: auto
|
||||
|
||||
除了 Python 内置的类型,下面还出现了如下 NoneBot 自定类型,实际上它们是 Python 内置类型的别名。
|
||||
|
||||
以下类型均可从 `none.typing` 模块导入。
|
||||
以下类型均可从 `nonebot.typing` 模块导入。
|
||||
|
||||
### `Context_T`
|
||||
|
||||
@ -26,7 +26,7 @@ sidebar: auto
|
||||
|
||||
- **说明:**
|
||||
|
||||
消息对象的类型,通常表示 NoneBot 提供的消息相关接口所支持的类型,`none.message.Message` 也是一个合法的 `Message_T`。
|
||||
消息对象的类型,通常表示 NoneBot 提供的消息相关接口所支持的类型,`nonebot.message.Message` 也是一个合法的 `Message_T`。
|
||||
|
||||
### `Expression_T`
|
||||
|
||||
@ -302,26 +302,26 @@ sidebar: auto
|
||||
|
||||
APScheduler 的配置对象,见 [Configuring the scheduler](https://apscheduler.readthedocs.io/en/latest/userguide.html#configuring-the-scheduler)。
|
||||
|
||||
## `none` 模块
|
||||
## `nonebot` 模块
|
||||
|
||||
### 快捷导入
|
||||
|
||||
为方便使用,`none` 模块从子模块导入了部分内容:
|
||||
为方便使用,`nonebot` 模块从子模块导入了部分内容:
|
||||
|
||||
- `CQHttpError` -> `none.exceptions.CQHttpError`
|
||||
- `message_preprocessor` -> `none.message.message_preprocessor`
|
||||
- `Message` -> `none.message.Message`
|
||||
- `MessageSegment` -> `none.message.MessageSegment`
|
||||
- `on_command` -> `none.command.on_command`
|
||||
- `CommandSession` -> `none.command.CommandSession`
|
||||
- `CommandGroup` -> `none.command.CommandGroup`
|
||||
- `on_natural_language` -> `none.natural_language.on_natural_language`
|
||||
- `NLPSession` -> `none.natural_language.NLPSession`
|
||||
- `NLPResult` -> `none.natural_language.NLPResult`
|
||||
- `on_notice` -> `none.notice_request.on_notice`
|
||||
- `NoticeSession` -> `none.notice_request.NoticeSession`
|
||||
- `on_request` -> `none.notice_request.on_request`
|
||||
- `RequestSession` -> `none.notice_request.RequestSession`
|
||||
- `CQHttpError` -> `nonebot.exceptions.CQHttpError`
|
||||
- `message_preprocessor` -> `nonebot.message.message_preprocessor`
|
||||
- `Message` -> `nonebot.message.Message`
|
||||
- `MessageSegment` -> `nonebot.message.MessageSegment`
|
||||
- `on_command` -> `nonebot.command.on_command`
|
||||
- `CommandSession` -> `nonebot.command.CommandSession`
|
||||
- `CommandGroup` -> `nonebot.command.CommandGroup`
|
||||
- `on_natural_language` -> `nonebot.natural_language.on_natural_language`
|
||||
- `NLPSession` -> `nonebot.natural_language.NLPSession`
|
||||
- `NLPResult` -> `nonebot.natural_language.NLPResult`
|
||||
- `on_notice` -> `nonebot.notice_request.on_notice`
|
||||
- `NoticeSession` -> `nonebot.notice_request.NoticeSession`
|
||||
- `on_request` -> `nonebot.notice_request.on_request`
|
||||
- `RequestSession` -> `nonebot.notice_request.RequestSession`
|
||||
|
||||
### `scheduler`
|
||||
|
||||
@ -401,7 +401,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
|
||||
@bot.on_message('group')
|
||||
async def handle_group_message(ctx: Context_T)
|
||||
@ -425,7 +425,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
|
||||
@bot.on_notice('group_increase')
|
||||
async def handle_group_increase(ctx: Context_T)
|
||||
@ -449,7 +449,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
|
||||
@bot.on_request('friend', 'group.invite')
|
||||
async def handle_request(ctx: Context_T)
|
||||
@ -473,7 +473,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
|
||||
@bot.on_meta_event('heartbeat')
|
||||
async def handle_heartbeat(ctx: Context_T)
|
||||
@ -500,7 +500,7 @@ sidebar: auto
|
||||
|
||||
```python
|
||||
import config
|
||||
none.init(config)
|
||||
nonebot.init(config)
|
||||
```
|
||||
|
||||
导入 `config` 模块并初始化全局 NoneBot 对象。
|
||||
@ -522,7 +522,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
```
|
||||
|
||||
### `run(host=None, port=None, *args, **kwargs)`
|
||||
@ -545,7 +545,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
none.run(host='127.0.0.1', port=8080)
|
||||
nonebot.run(host='127.0.0.1', port=8080)
|
||||
```
|
||||
|
||||
在 `127.0.0.1:8080` 运行全局 NoneBot 对象。
|
||||
@ -567,10 +567,10 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
none.load_plugin('none.plugins.base')
|
||||
nonebot.load_plugin('nonebot.plugins.base')
|
||||
```
|
||||
|
||||
加载 `none.plugins.base` 插件。
|
||||
加载 `nonebot.plugins.base` 插件。
|
||||
|
||||
### `load_plugins(plugin_dir, module_prefix)`
|
||||
|
||||
@ -590,7 +590,7 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'plugins'),
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'),
|
||||
'maruko.plugins')
|
||||
```
|
||||
|
||||
@ -609,16 +609,16 @@ sidebar: auto
|
||||
- **用法:**
|
||||
|
||||
```python
|
||||
none.load_builtin_plugins()
|
||||
nonebot.load_builtin_plugins()
|
||||
```
|
||||
|
||||
## `none.exceptions` 模块
|
||||
## `nonebot.exceptions` 模块
|
||||
|
||||
### _class_ `CQHttpError`
|
||||
|
||||
等价于 `aiocqhttp.Error`。
|
||||
|
||||
## `none.message` 模块
|
||||
## `nonebot.message` 模块
|
||||
|
||||
### _decorator_ `message_preprocessor`
|
||||
|
||||
@ -1115,7 +1115,7 @@ sidebar: auto
|
||||
|
||||
- `str`: 去转义后的字符串
|
||||
|
||||
## `none.command` 模块
|
||||
## `nonebot.command` 模块
|
||||
|
||||
### _decorator_ `on_command(name, *, aliases=(), permission=perm.EVERYBODY, only_to_me=True, privileged=False, shell_like=False)`
|
||||
|
||||
@ -1503,7 +1503,7 @@ sidebar: auto
|
||||
|
||||
在特权命令 `kill` 中强行移除当前正在运行的会话。
|
||||
|
||||
## `none.natural_language` 模块
|
||||
## `nonebot.natural_language` 模块
|
||||
|
||||
### _decorator_ `on_natural_language(keywords=None, *, permission=EVERYBODY, only_to_me=True, only_short_message=True, allow_empty_message=False)`
|
||||
|
||||
@ -1600,7 +1600,7 @@ sidebar: auto
|
||||
|
||||
初始化 `NLPResult` 对象,参数即为上面的三个属性。
|
||||
|
||||
## `none.notice_request` 模块
|
||||
## `nonebot.notice_request` 模块
|
||||
|
||||
### _decorator_ `on_notice(*events)`
|
||||
|
||||
@ -1724,7 +1724,7 @@ sidebar: auto
|
||||
await session.reject()
|
||||
```
|
||||
|
||||
## `none.session` 模块
|
||||
## `nonebot.session` 模块
|
||||
|
||||
### _class_ `BaseSession`
|
||||
|
||||
@ -1791,7 +1791,7 @@ sidebar: auto
|
||||
|
||||
在当前 Session 对应的上下文中发送 `hello`。
|
||||
|
||||
## `none.permission` 模块
|
||||
## `nonebot.permission` 模块
|
||||
|
||||
### 权限声明常量
|
||||
|
||||
@ -1813,7 +1813,7 @@ sidebar: auto
|
||||
例如下面的代码中,只有私聊和群管理员可以访问 `hello` 命令:
|
||||
|
||||
```python
|
||||
@none.on_command('hello', permission=PRIVATE | GROUP_ADMIN)
|
||||
@nonebot.on_command('hello', permission=PRIVATE | GROUP_ADMIN)
|
||||
async def _(session):
|
||||
pass
|
||||
```
|
||||
@ -1842,7 +1842,7 @@ async def _(session):
|
||||
has_perm = await check_permission(bot, ctx, cmd.permission)
|
||||
```
|
||||
|
||||
## `none.log` 模块
|
||||
## `nonebot.log` 模块
|
||||
|
||||
### `logger`
|
||||
|
||||
@ -1858,7 +1858,7 @@ async def _(session):
|
||||
logger.debug('Some log message here')
|
||||
```
|
||||
|
||||
## `none.helpers` 模块
|
||||
## `nonebot.helpers` 模块
|
||||
|
||||
### `context_id(ctx, *, mode='default', use_hash=False)`
|
||||
|
||||
@ -1941,7 +1941,7 @@ async def _(session):
|
||||
)
|
||||
```
|
||||
|
||||
## `none.argparse` 模块
|
||||
## `nonebot.argparse` 模块
|
||||
|
||||
### _class_ `ArgumentParser`
|
||||
|
||||
@ -2006,7 +2006,7 @@ async def _(session):
|
||||
|
||||
无。
|
||||
|
||||
## `none.sched` 模块
|
||||
## `nonebot.sched` 模块
|
||||
|
||||
### _class_ `Scheduler`
|
||||
|
||||
|
@ -64,4 +64,4 @@ sidebar: auto
|
||||
|
||||
## v0.2.2
|
||||
|
||||
- 修复快速的连续消息导致报错问题 [#5](https://github.com/richardchien/none-bot/issues/5)
|
||||
- 修复快速的连续消息导致报错问题 [#5](https://github.com/richardchien/nonebot/issues/5)
|
||||
|
@ -66,10 +66,10 @@ docker run hello-world
|
||||
|
||||
或称为「命令处理函数」,有时也简称为「命令」,是 NoneBot 插件中实际用于实现某个命令功能的函数。
|
||||
|
||||
通过 `none.on_command` 装饰器可以将一个函数注册为命令处理器,例如:
|
||||
通过 `nonebot.on_command` 装饰器可以将一个函数注册为命令处理器,例如:
|
||||
|
||||
```python
|
||||
from none import on_command
|
||||
from nonebot import on_command
|
||||
|
||||
@on_command('echo')
|
||||
async def echo(session):
|
||||
@ -80,10 +80,10 @@ async def echo(session):
|
||||
|
||||
或称为「自然语言处理函数」,是 NoneBot 插件中用于将用户的自然语言消息解析为命令和参数的函数。
|
||||
|
||||
通过 `none.on_natural_language` 装饰器可以将一个函数注册为自然语言处理器,例如:
|
||||
通过 `nonebot.on_natural_language` 装饰器可以将一个函数注册为自然语言处理器,例如:
|
||||
|
||||
```python
|
||||
from none import on_natural_language
|
||||
from nonebot import on_natural_language
|
||||
|
||||
@on_natural_language
|
||||
async def _(session):
|
||||
|
@ -3,7 +3,7 @@
|
||||
到目前为止我们还在使用 NoneBot 的默认行为,在开始编写自己的插件之前,我们先尝试在配置文件上动动手脚,让 NoneBot 表现出不同的行为。
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-1](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-1) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-1](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-1) 查看。
|
||||
:::
|
||||
|
||||
## 项目结构
|
||||
@ -33,7 +33,7 @@ awesome-bot
|
||||
因此下面我们往 `config.py` 中填充如下内容:
|
||||
|
||||
```python
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
SUPERUSERS = {12345678}
|
||||
```
|
||||
@ -45,17 +45,17 @@ SUPERUSERS = {12345678}
|
||||
`config.py` 写好之后,修改 `bot.py` 如下:
|
||||
|
||||
```python {3,6}
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_builtin_plugins()
|
||||
none.run(host='127.0.0.1', port=8080)
|
||||
nonebot.init(config)
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.run(host='127.0.0.1', port=8080)
|
||||
```
|
||||
|
||||
第 3 行导入 `config.py` 模块,第 6 行将 `config.py` 作为配置对象传给 `none.init()` 函数,这样 NoneBot 就知道了超级用户有哪些。
|
||||
第 3 行导入 `config.py` 模块,第 6 行将 `config.py` 作为配置对象传给 `nonebot.init()` 函数,这样 NoneBot 就知道了超级用户有哪些。
|
||||
|
||||
重启 NoneBot 后再次尝试发送:
|
||||
|
||||
@ -70,7 +70,7 @@ if __name__ == '__main__':
|
||||
目前我们发送的命令都必须以一个特殊符号 `/` 开头,实际上,NoneBot 默认支持以 `/`、`/`、`!`、`!` 其中之一作为开头,现在我们希望能够不需要特殊符号开头就可以调用命令,要做到这一点非常简单,在 `config.py` 添加一行即可:
|
||||
|
||||
```python {4}
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
SUPERUSERS = {12345678}
|
||||
COMMAND_START.add('')
|
||||
@ -88,7 +88,7 @@ COMMAND_START = {'/', '!', '/', '!'}
|
||||
|
||||
```python
|
||||
import re
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
COMMAND_START = ['', re.compile(r'[/!]+')]
|
||||
```
|
||||
@ -103,10 +103,10 @@ COMMAND_START = ['', re.compile(r'[/!]+')]
|
||||
|
||||
## 配置监听的 IP 和端口
|
||||
|
||||
当有了配置文件之后,我们可能会希望将 `none.run()` 参数中的 `host` 和 `port` 移动到配置文件中,毕竟这两项是有可能随着运行场景的变化而有不同的需求的,把它们放到配置文件中有利于配置和代码的解耦。这同样很容易做到,只需进行如下配置:
|
||||
当有了配置文件之后,我们可能会希望将 `nonebot.run()` 参数中的 `host` 和 `port` 移动到配置文件中,毕竟这两项是有可能随着运行场景的变化而有不同的需求的,把它们放到配置文件中有利于配置和代码的解耦。这同样很容易做到,只需进行如下配置:
|
||||
|
||||
```python {3-4}
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
@ -115,17 +115,17 @@ PORT = 8080
|
||||
然后在 `bot.py` 中就不再需要传入 `host` 和 `port`,如下:
|
||||
|
||||
```python {8}
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_builtin_plugins()
|
||||
none.run()
|
||||
nonebot.init(config)
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.run()
|
||||
```
|
||||
|
||||
实际上,不需要配置这两项也可以直接使用 `none.run()`,NoneBot 会使用如下默认配置:
|
||||
实际上,不需要配置这两项也可以直接使用 `nonebot.run()`,NoneBot 会使用如下默认配置:
|
||||
|
||||
```python
|
||||
HOST = '127.0.0.1'
|
||||
|
@ -16,7 +16,7 @@ await bot.send_private_msg(user_id=12345678, message='你好~')
|
||||
|
||||
1. **所有参数必须为命名参数(keyword argument)**,否则无法正确调用
|
||||
2. 这种调用全都是异步调用,因此需要适当 `await`
|
||||
2. **调用失败时(没有权限、对方不是好友、无 API 连接等)可能抛出 `none.CQHttpError` 异常**,注意捕获
|
||||
2. **调用失败时(没有权限、对方不是好友、无 API 连接等)可能抛出 `nonebot.CQHttpError` 异常**,注意捕获
|
||||
|
||||
另外,在需要动态性的场合,除了使用 `getattr()` 方法外,还可以直接调用 `bot.call_action()` 方法,传入 `action` 和 `params` 即可,例如上例中,`action` 为 `'send_private_msg'`,`params` 为 `{'user_id': 12345678, 'message': '你好~'}`。
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_builtin_plugins()
|
||||
none.run()
|
||||
nonebot.init(config)
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1 +1 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
@ -1,4 +1,4 @@
|
||||
from none import on_command, CommandSession
|
||||
from nonebot import on_command, CommandSession
|
||||
|
||||
|
||||
# on_command 装饰器将函数声明为一个命令处理器
|
||||
|
@ -1,11 +1,11 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1 +1 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
@ -1,5 +1,5 @@
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from jieba import posseg
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
@ -1,11 +1,11 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1,2 +1,2 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
||||
jieba
|
@ -3,9 +3,9 @@ from typing import Optional
|
||||
|
||||
import aiohttp
|
||||
from aiocqhttp.message import escape
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from none.helpers import context_id, render_expression
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot.helpers import context_id, render_expression
|
||||
|
||||
# 定义无法获取图灵回复时的「表达(Expression)」
|
||||
EXPR_DONT_UNDERSTAND = (
|
||||
|
@ -1,5 +1,5 @@
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from jieba import posseg
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
@ -1,11 +1,11 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1,3 +1,3 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
||||
jieba
|
||||
aiohttp
|
@ -1,5 +1,5 @@
|
||||
from none import on_request, RequestSession
|
||||
from none import on_notice, NoticeSession
|
||||
from nonebot import on_request, RequestSession
|
||||
from nonebot import on_notice, NoticeSession
|
||||
|
||||
|
||||
# 将函数注册为群请求处理器
|
||||
|
@ -3,9 +3,9 @@ from typing import Optional
|
||||
|
||||
import aiohttp
|
||||
from aiocqhttp.message import escape
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from none.helpers import context_id, render_expression
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot.helpers import context_id, render_expression
|
||||
|
||||
# 定义无法获取图灵回复时的「表达(Expression)」
|
||||
EXPR_DONT_UNDERSTAND = (
|
||||
|
@ -1,5 +1,5 @@
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from jieba import posseg
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
@ -1,11 +1,11 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1,3 +1,3 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
||||
jieba
|
||||
aiohttp
|
@ -1,5 +1,5 @@
|
||||
from none import on_request, RequestSession
|
||||
from none import on_notice, NoticeSession
|
||||
from nonebot import on_request, RequestSession
|
||||
from nonebot import on_notice, NoticeSession
|
||||
|
||||
|
||||
# 将函数注册为群请求处理器
|
||||
|
@ -1,13 +1,13 @@
|
||||
from datetime import datetime
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
import pytz
|
||||
from aiocqhttp.exceptions import Error as CQHttpError
|
||||
|
||||
|
||||
@none.scheduler.scheduled_job('cron', hour='*')
|
||||
@nonebot.scheduler.scheduled_job('cron', hour='*')
|
||||
async def _():
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
now = datetime.now(pytz.timezone('Asia/Shanghai'))
|
||||
try:
|
||||
await bot.send_group_msg(group_id=672076603,
|
||||
|
@ -3,9 +3,9 @@ from typing import Optional
|
||||
|
||||
import aiohttp
|
||||
from aiocqhttp.message import escape
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from none.helpers import context_id, render_expression
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot.helpers import context_id, render_expression
|
||||
|
||||
# 定义无法获取图灵回复时的「表达(Expression)」
|
||||
EXPR_DONT_UNDERSTAND = (
|
||||
|
@ -1,5 +1,5 @@
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from jieba import posseg
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
@ -1,11 +1,11 @@
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
|
@ -1,4 +1,4 @@
|
||||
from none.default_config import *
|
||||
from nonebot.default_config import *
|
||||
|
||||
HOST = '0.0.0.0'
|
||||
PORT = 8080
|
||||
|
@ -1,4 +1,4 @@
|
||||
none-bot>=0.2.1
|
||||
nonebot>=1.0.0
|
||||
jieba
|
||||
aiohttp
|
||||
pytz
|
@ -3,7 +3,7 @@
|
||||
本章将以一个天气查询插件为例,教你如何编写自己的命令。
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-2](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-2) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-2](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-2) 查看。
|
||||
:::
|
||||
|
||||
## 创建插件目录
|
||||
@ -36,23 +36,23 @@ awesome-bot
|
||||
```python {1,9-10}
|
||||
from os import path
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
import config
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init(config)
|
||||
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
nonebot.init(config)
|
||||
nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||
'awesome.plugins')
|
||||
none.run()
|
||||
nonebot.run()
|
||||
```
|
||||
|
||||
这里的重点在于 `none.load_plugins()` 函数的两个参数。第一个参数是插件目录的路径,这里根据 `bot.py` 的所在路径和相对路径拼接得到;第二个参数是导入插件模块时使用的模块名前缀,这个前缀要求必须是一个当前 Python 解释器可以导入的模块前缀,NoneBot 会在它后面加上插件的模块名共同组成完整的模块名来让解释器导入,因此这里我们传入 `awesome.plugins`,当运行 `bot.py` 的时候,Python 解释器就能够正确导入 `awesome.plugins.weather` 这个插件模块了。
|
||||
这里的重点在于 `nonebot.load_plugins()` 函数的两个参数。第一个参数是插件目录的路径,这里根据 `bot.py` 的所在路径和相对路径拼接得到;第二个参数是导入插件模块时使用的模块名前缀,这个前缀要求必须是一个当前 Python 解释器可以导入的模块前缀,NoneBot 会在它后面加上插件的模块名共同组成完整的模块名来让解释器导入,因此这里我们传入 `awesome.plugins`,当运行 `bot.py` 的时候,Python 解释器就能够正确导入 `awesome.plugins.weather` 这个插件模块了。
|
||||
|
||||
尝试运行 `python bot.py`,可以看到日志输出了类似如下内容:
|
||||
|
||||
```
|
||||
[2018-08-18 21:46:55,425 none] INFO: Succeeded to import "awesome.plugins.weather"
|
||||
[2018-08-18 21:46:55,425 nonebot] INFO: Succeeded to import "awesome.plugins.weather"
|
||||
```
|
||||
|
||||
这表示 NoneBot 已经成功加载到了 `weather` 插件。
|
||||
@ -73,7 +73,7 @@ set PYTHONPATH=. # Windows
|
||||
好了,现在已经确保插件可以正确加载,我们可以开始编写命令的实际代码了。在 `weather.py` 中添加如下代码:
|
||||
|
||||
```python
|
||||
from none import on_command, CommandSession
|
||||
from nonebot import on_command, CommandSession
|
||||
|
||||
|
||||
# on_command 装饰器将函数声明为一个命令处理器
|
||||
|
@ -7,12 +7,12 @@
|
||||
使用你最熟悉的编辑器或 IDE,创建一个名为 `bot.py` 的文件,内容如下:
|
||||
|
||||
```python
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init()
|
||||
none.load_builtin_plugins()
|
||||
none.run(host='127.0.0.1', port=8080)
|
||||
nonebot.init()
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.run(host='127.0.0.1', port=8080)
|
||||
```
|
||||
|
||||
`if __name__ == '__main__'` 语句块的这几行代码将依次:
|
||||
@ -22,7 +22,7 @@ if __name__ == '__main__':
|
||||
3. 在地址 `127.0.0.1:8080` 运行 NoneBot
|
||||
|
||||
::: tip 提示
|
||||
这里 `none.run()` 的参数 `host='127.0.0.1'` 表示让 NoneBot 监听本地环回地址,如果你的酷 Q 运行在非本机的其它位置,例如 Docker 容器内、局域网内的另一台机器上等,则这里需要修改 `host` 参数为希望让 CoolQ HTTP API 插件访问的 IP。如果不清楚该使用哪个 IP,或者希望本机的所有 IP 都被监听,可以使用 `0.0.0.0`。
|
||||
这里 `nonebot.run()` 的参数 `host='127.0.0.1'` 表示让 NoneBot 监听本地环回地址,如果你的酷 Q 运行在非本机的其它位置,例如 Docker 容器内、局域网内的另一台机器上等,则这里需要修改 `host` 参数为希望让 CoolQ HTTP API 插件访问的 IP。如果不清楚该使用哪个 IP,或者希望本机的所有 IP 都被监听,可以使用 `0.0.0.0`。
|
||||
:::
|
||||
|
||||
在命令行使用如下命令即可运行这个 NoneBot 实例:
|
||||
@ -47,7 +47,7 @@ python bot.py
|
||||
```
|
||||
|
||||
::: tip 提示
|
||||
这里的 `127.0.0.1:8080` 对应 `none.run()` 中传入的 `host` 和 `port`,如果在 `none.run()` 中传入的 `host` 是 `0.0.0.0`,则插件的配置中需使用任意一个能够访问到 NoneBot 所在环境的 IP。特别地,如果你的酷 Q 运行在 Docker 容器中,NoneBot 运行在宿主机中,则默认情况下这里需使用 `172.17.0.1`(不同机器有可能不同,需使用 `docker inspect bridge` 查看,具体见 Docker 文档的 [Configure networking](https://docs.docker.com/network/))。
|
||||
这里的 `127.0.0.1:8080` 对应 `nonebot.run()` 中传入的 `host` 和 `port`,如果在 `nonebot.run()` 中传入的 `host` 是 `0.0.0.0`,则插件的配置中需使用任意一个能够访问到 NoneBot 所在环境的 IP。特别地,如果你的酷 Q 运行在 Docker 容器中,NoneBot 运行在宿主机中,则默认情况下这里需使用 `172.17.0.1`(不同机器有可能不同,需使用 `docker inspect bridge` 查看,具体见 Docker 文档的 [Configure networking](https://docs.docker.com/network/))。
|
||||
:::
|
||||
|
||||
修改之后,在酷 Q 的应用菜单中重启 CoolQ HTTP API 插件,或直接重启酷 Q,以使新的配置文件生效。
|
||||
|
@ -9,14 +9,14 @@
|
||||
可以使用 pip 安装已发布的最新版本:
|
||||
|
||||
```bash
|
||||
pip install none-bot
|
||||
pip install nonebot
|
||||
```
|
||||
|
||||
如果你需要使用最新的(可能尚未发布的)特性,可以克隆 Git 仓库后手动安装:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/richardchien/none-bot.git
|
||||
cd none-bot
|
||||
git clone https://github.com/richardchien/nonebot.git
|
||||
cd nonebot
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
```
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-3](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-3) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-3](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-3) 查看。
|
||||
:::
|
||||
|
||||
## 调整项目结构
|
||||
@ -38,7 +38,7 @@ awesome-bot
|
||||
`weather/__init__.py` 内容如下:
|
||||
|
||||
```python
|
||||
from none import on_command, CommandSession
|
||||
from nonebot import on_command, CommandSession
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
||||
@ -71,8 +71,8 @@ async def get_weather_of_city(city: str) -> str:
|
||||
在 `weather/__init__.py` 文件添加内容如下:
|
||||
|
||||
```python {2,23-29}
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
||||
@ -143,8 +143,8 @@ pip install jieba
|
||||
有了结巴分词之后,扩充 `weather/__init__.py` 如下:
|
||||
|
||||
```python {3,29-43}
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from jieba import posseg
|
||||
|
||||
from .data_source import get_weather_of_city
|
||||
|
@ -5,7 +5,7 @@
|
||||
本章将介绍如何在插件中处理通知和请求。
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-5](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-5) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-5](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-5) 查看。
|
||||
:::
|
||||
|
||||
## 自动同意加群请求
|
||||
@ -15,7 +15,7 @@
|
||||
新建 `awesome/plugins/group_admin.py`,编写代码如下:
|
||||
|
||||
```python
|
||||
from none import on_request, RequestSession
|
||||
from nonebot import on_request, RequestSession
|
||||
|
||||
|
||||
# 将函数注册为群请求处理器
|
||||
@ -41,7 +41,7 @@ async def _(session: RequestSession):
|
||||
新成员入群之后,为了活跃气氛,我们可能希望机器人发一段欢迎消息。只需下面的代码即可实现:
|
||||
|
||||
```python
|
||||
from none import on_notice, NoticeSession
|
||||
from nonebot import on_notice, NoticeSession
|
||||
|
||||
|
||||
# 将函数注册为群成员增加通知处理器
|
||||
|
@ -3,7 +3,7 @@
|
||||
实际应用中还经常会有定时执行任务的需求,为了方便这类需求的开发,NoneBot 可选地包含了计划任务功能。
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-6](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-6) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-6](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-6) 查看。
|
||||
:::
|
||||
|
||||
## 安装 `scheduler` 可选功能
|
||||
@ -13,10 +13,10 @@
|
||||
使用下面命令安装可选功能(会自动安装 APScheduler):
|
||||
|
||||
```bash
|
||||
pip install none-bot[scheduler]
|
||||
pip install nonebot[scheduler]
|
||||
```
|
||||
|
||||
安装成功之后就可以通过 `none.scheduler` 访问 [`AsyncIOScheduler`](https://apscheduler.readthedocs.io/en/latest/modules/schedulers/asyncio.html#apscheduler.schedulers.asyncio.AsyncIOScheduler) 对象。
|
||||
安装成功之后就可以通过 `nonebot.scheduler` 访问 [`AsyncIOScheduler`](https://apscheduler.readthedocs.io/en/latest/modules/schedulers/asyncio.html#apscheduler.schedulers.asyncio.AsyncIOScheduler) 对象。
|
||||
|
||||
## 定时发送消息
|
||||
|
||||
@ -27,14 +27,14 @@ pip install none-bot[scheduler]
|
||||
```python {8}
|
||||
from datetime import datetime
|
||||
|
||||
import none
|
||||
import nonebot
|
||||
import pytz
|
||||
from aiocqhttp.exceptions import Error as CQHttpError
|
||||
|
||||
|
||||
@none.scheduler.scheduled_job('cron', hour='*')
|
||||
@nonebot.scheduler.scheduled_job('cron', hour='*')
|
||||
async def _():
|
||||
bot = none.get_bot()
|
||||
bot = nonebot.get_bot()
|
||||
now = datetime.now(pytz.timezone('Asia/Shanghai'))
|
||||
try:
|
||||
await bot.send_group_msg(group_id=672076603,
|
||||
@ -43,8 +43,8 @@ async def _():
|
||||
pass
|
||||
```
|
||||
|
||||
这里最主要的就是第 8 行,`none.scheduler.scheduled_job()` 是一个装饰器,第一个参数是触发器类型(这里是 `cron`,表示使用 [Cron](https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron) 类型的触发参数)。这里 `hour='*'` 表示每小时都执行,`minute` 和 `second` 不填时默认为 `0`,也就是说装饰器所装饰的这个函数会在每小时的第一秒被执行。
|
||||
这里最主要的就是第 8 行,`nonebot.scheduler.scheduled_job()` 是一个装饰器,第一个参数是触发器类型(这里是 `cron`,表示使用 [Cron](https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron) 类型的触发参数)。这里 `hour='*'` 表示每小时都执行,`minute` 和 `second` 不填时默认为 `0`,也就是说装饰器所装饰的这个函数会在每小时的第一秒被执行。
|
||||
|
||||
除了 `cron`,还有两种触发器类型 `interval` 和 `date`。例如,你可以使用 `none.scheduler.scheduled_job('interval', minutes=10)` 来每十分钟执行一次任务。
|
||||
除了 `cron`,还有两种触发器类型 `interval` 和 `date`。例如,你可以使用 `nonebot.scheduler.scheduled_job('interval', minutes=10)` 来每十分钟执行一次任务。
|
||||
|
||||
限于篇幅,这里无法给出太详细的接口介绍,`none.scheduler` 是一个 APScheduler 的 `AsyncIOScheduler` 对象,因此关于它的更多使用方法,可以参考 [APScheduler 的官方文档](https://apscheduler.readthedocs.io/en/latest/userguide.html)。
|
||||
限于篇幅,这里无法给出太详细的接口介绍,`nonebot.scheduler` 是一个 APScheduler 的 `AsyncIOScheduler` 对象,因此关于它的更多使用方法,可以参考 [APScheduler 的官方文档](https://apscheduler.readthedocs.io/en/latest/userguide.html)。
|
||||
|
@ -7,7 +7,7 @@
|
||||
不过还是有解决方案的,市面上有一些提供智能聊天机器人接口的厂商,本章我们以 [图灵机器人](http://www.tuling123.com/) 为例,因为它的使用比较广泛,接入也比较简单,不过缺点是免费调用次数比较少。
|
||||
|
||||
::: tip 提示
|
||||
本章的完整代码可以在 [awesome-bot-4](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-4) 查看。
|
||||
本章的完整代码可以在 [awesome-bot-4](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-4) 查看。
|
||||
:::
|
||||
|
||||
## 注册图灵机器人账号
|
||||
@ -26,9 +26,9 @@ from typing import Optional
|
||||
|
||||
import aiohttp
|
||||
from aiocqhttp.message import escape
|
||||
from none import on_command, CommandSession
|
||||
from none import on_natural_language, NLPSession, NLPResult
|
||||
from none.helpers import context_id, render_expression
|
||||
from nonebot import on_command, CommandSession
|
||||
from nonebot import on_natural_language, NLPSession, NLPResult
|
||||
from nonebot.helpers import context_id, render_expression
|
||||
|
||||
# 定义无法获取图灵回复时的「表达(Expression)」
|
||||
EXPR_DONT_UNDERSTAND = (
|
||||
@ -184,9 +184,9 @@ async def call_tuling_api(session: CommandSession, text: str) -> Optional[str]:
|
||||
|
||||
第一段高亮部分是根据图灵机器人的文档构造请求数据,其中有几个需要注意的地方:第 16、17 和 21 行。
|
||||
|
||||
第 16 行通过 `session.bot.config` 访问了 NoneBot 的配置对象,`session.bot` 就是当前正在运行的 NoneBot 对象,你在其它任何地方都可以这么用(前提是已经调用过 `none.init()`)。
|
||||
第 16 行通过 `session.bot.config` 访问了 NoneBot 的配置对象,`session.bot` 就是当前正在运行的 NoneBot 对象,你在其它任何地方都可以这么用(前提是已经调用过 `nonebot.init()`)。
|
||||
|
||||
第 17 和 21 行调用了 `context_id()` 函数,这是 `none.helpers` 模块中提供的一个函数,用于计算 Context 的独特 ID,有三种模式可以选择(通过 `mode` 参数传入):`default`、`group`、`user`,默认 `default`,它们的效果如下表:
|
||||
第 17 和 21 行调用了 `context_id()` 函数,这是 `nonebot.helpers` 模块中提供的一个函数,用于计算 Context 的独特 ID,有三种模式可以选择(通过 `mode` 参数传入):`default`、`group`、`user`,默认 `default`,它们的效果如下表:
|
||||
|
||||
| 模式 | 效果 |
|
||||
| ------------ | --- |
|
||||
|
@ -43,17 +43,17 @@ CoolQ HTTP API 插件通过反向 WebSocket 将消息事件发送到 NoneBot 后
|
||||
到这里,我们先暂停一下对消息事件的行踪的描述,回头来说一下最小实例的代码:
|
||||
|
||||
```python
|
||||
import none
|
||||
import nonebot
|
||||
|
||||
if __name__ == '__main__':
|
||||
none.init()
|
||||
none.load_builtin_plugins()
|
||||
none.run(host='127.0.0.1', port=8080)
|
||||
nonebot.init()
|
||||
nonebot.load_builtin_plugins()
|
||||
nonebot.run(host='127.0.0.1', port=8080)
|
||||
```
|
||||
|
||||
第 4 行的 `none.init()` 首先初始化 `none` 包,这是无论如何都需要写的一行代码,并且必须在使用 NoneBot 的任何功能之前调用。
|
||||
第 4 行的 `nonebot.init()` 首先初始化 `nonebot` 包,这是无论如何都需要写的一行代码,并且必须在使用 NoneBot 的任何功能之前调用。
|
||||
|
||||
随后,`none.load_builtin_plugins()` 加载了 NoneBot 的内置插件,这一步不是必须的,尤其在你编写了自己的插件之后,可能会不再需要内置插件。
|
||||
随后,`nonebot.load_builtin_plugins()` 加载了 NoneBot 的内置插件,这一步不是必须的,尤其在你编写了自己的插件之后,可能会不再需要内置插件。
|
||||
|
||||
NoneBot 的内置插件只包含了两个命令,`echo` 和 `say`,两者的功能都是重复发送者的话,区别在于,`echo` 命令任何人都可以调用(不限制权限),但只能原样重复消息,不能手动指定要发送的 CQ 码,`say` 命令只有超级用户(通常是你自己,需要在配置中指定,下一章会介绍)可以调用,可以在消息中指定要发送的 CQ 码,如下图:
|
||||
|
||||
@ -61,7 +61,7 @@ NoneBot 的内置插件只包含了两个命令,`echo` 和 `say`,两者的
|
||||
<img alt="Echo and Say" src="./assets/echo_and_say.png" />
|
||||
</p>
|
||||
|
||||
最后,`none.run(host='127.0.0.1', port=8080)` 让 NoneBot 跑在了地址 `127.0.0.1:8080` 上,向 CoolQ HTTP API 插件提供 `/`、`/ws/event/`、`/ws/api/` 三个入口,在我们的反向 WebSocket 配置中,插件利用了后两个入口。
|
||||
最后,`nonebot.run(host='127.0.0.1', port=8080)` 让 NoneBot 跑在了地址 `127.0.0.1:8080` 上,向 CoolQ HTTP API 插件提供 `/`、`/ws/event/`、`/ws/api/` 三个入口,在我们的反向 WebSocket 配置中,插件利用了后两个入口。
|
||||
|
||||
### 命令处理器
|
||||
|
||||
|
@ -155,10 +155,10 @@ def load_plugins(plugin_dir: str, module_prefix: str) -> int:
|
||||
|
||||
def load_builtin_plugins() -> int:
|
||||
"""
|
||||
Load built-in plugins distributed along with "none" package.
|
||||
Load built-in plugins distributed along with "nonebot" package.
|
||||
"""
|
||||
plugin_dir = os.path.join(os.path.dirname(__file__), 'plugins')
|
||||
return load_plugins(plugin_dir, 'none.plugins')
|
||||
return load_plugins(plugin_dir, 'nonebot.plugins')
|
||||
|
||||
|
||||
from .exceptions import *
|
@ -7,7 +7,7 @@ to override the default one.
|
||||
|
||||
For example:
|
||||
|
||||
>>> from none.default_config import *
|
||||
>>> from nonebot.default_config import *
|
||||
>>> PORT = 9090
|
||||
>>> DEBUG = False
|
||||
>>> SUPERUSERS.add(123456)
|
@ -1,14 +1,14 @@
|
||||
"""
|
||||
Provide logger object.
|
||||
|
||||
Any other modules in "none" should use "logger" from this module
|
||||
Any other modules in "nonebot" should use "logger" from this module
|
||||
to log messages.
|
||||
"""
|
||||
|
||||
import logging
|
||||
import sys
|
||||
|
||||
logger = logging.getLogger('none')
|
||||
logger = logging.getLogger('nonebot')
|
||||
default_handler = logging.StreamHandler(sys.stdout)
|
||||
default_handler.setFormatter(logging.Formatter(
|
||||
'[%(asctime)s %(name)s] %(levelname)s: %(message)s'
|
@ -1,5 +1,5 @@
|
||||
from none import on_command, CommandSession, permission as perm
|
||||
from none.message import unescape
|
||||
from nonebot import on_command, CommandSession, permission as perm
|
||||
from nonebot.message import unescape
|
||||
|
||||
|
||||
@on_command('echo')
|
14
setup.py
14
setup.py
@ -4,24 +4,24 @@ with open('README.md', 'r', encoding='utf-8') as f:
|
||||
long_description = f.read()
|
||||
|
||||
setup(
|
||||
name='none-bot',
|
||||
version='0.5.3',
|
||||
packages=find_packages(include=('none', 'none.*')),
|
||||
url='https://github.com/richardchien/none-bot',
|
||||
name='nonebot',
|
||||
version='1.0.0',
|
||||
packages=find_packages(include=('nonebot', 'nonebot.*')),
|
||||
url='https://github.com/richardchien/nonebot',
|
||||
license='MIT License',
|
||||
author='Richard Chien',
|
||||
author_email='richardchienthebest@gmail.com',
|
||||
description='An asynchronous QQ bot framework based on CoolQ.',
|
||||
long_description=long_description,
|
||||
long_description_content_type='text/markdown',
|
||||
install_requires=['aiocqhttp>=0.6.5', 'aiocache>=0.10'],
|
||||
install_requires=['aiocqhttp>=0.6.7', 'aiocache>=0.10'],
|
||||
extras_require={
|
||||
'scheduler': ['apscheduler>=1.2'],
|
||||
},
|
||||
python_requires='>=3.6',
|
||||
python_requires='>=3.6.1',
|
||||
platforms='any',
|
||||
classifiers=(
|
||||
'Development Status :: 4 - Beta',
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Framework :: Robot Framework',
|
||||
'Framework :: Robot Framework :: Library',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
|
Loading…
Reference in New Issue
Block a user