Rename package to "nonebot"

This commit is contained in:
Richard Chien 2018-12-27 20:23:45 +08:00
parent b8cb8e440b
commit 663797219a
71 changed files with 221 additions and 220 deletions

View File

@ -1,3 +1,4 @@
{ {
"python.pythonPath": "${workspaceFolder}/venv/bin/python" "python.pythonPath": "${workspaceFolder}/venv/bin/python",
"search.usePCRE2": true
} }

View File

@ -1,7 +1,7 @@
# NoneBot # NoneBot
[![License](https://img.shields.io/github/license/richardchien/none-bot.svg)](LICENSE) [![License](https://img.shields.io/github/license/richardchien/nonebot.svg)](LICENSE)
[![PyPI](https://img.shields.io/pypi/v/none-bot.svg)](https://pypi.python.org/pypi/none-bot) [![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) ![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) [![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) [![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/),变量命名清晰,有适当的注释。 如果你要提交 pull request请确保你的代码风格和项目已有的代码保持一致遵循 [PEP 8](https://www.python.org/dev/peps/pep-0008/),变量命名清晰,有适当的注释。

View File

@ -1,22 +1,22 @@
from os import path from os import path
import none import nonebot
from demo import config 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(): async def cb():
bot_ = none.get_bot() bot_ = nonebot.get_bot()
try: try:
await bot_.send_private_msg(user_id=1002647525, message='') await bot_.send_private_msg(user_id=1002647525, message='')
except Exception as e: except Exception as e:
none.logger.exception(e) nonebot.logger.exception(e)
if __name__ == '__main__': if __name__ == '__main__':
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.load_plugins(path.join(path.dirname(__file__), 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'),
'demo.plugins') 'demo.plugins')
none.run(host=config.HOST, port=config.PORT) nonebot.run(host=config.HOST, port=config.PORT)

View File

@ -1,6 +1,6 @@
import re import re
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
SECRET = 'abc' SECRET = 'abc'

View File

@ -1,7 +1,7 @@
from aiocqhttp import Error as CQHttpError from aiocqhttp import Error as CQHttpError
from none import on_notice, NoticeSession, on_request, RequestSession from nonebot import on_notice, NoticeSession, on_request, RequestSession
from none.helpers import render_expression as __ from nonebot.helpers import render_expression as __
GROUP_GREETING = ( GROUP_GREETING = (
'欢迎新同学 {name}[][CQ:face,id=63][CQ:face,id=63][CQ:face,id=63]', '欢迎新同学 {name}[][CQ:face,id=63][CQ:face,id=63][CQ:face,id=63]',

View File

@ -1,4 +1,4 @@
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
_last_session = None _last_session = None

View File

@ -1,4 +1,4 @@
from none import ( from nonebot import (
on_command, CommandSession, on_command, CommandSession,
on_natural_language, NLPSession, NLPResult on_natural_language, NLPSession, NLPResult
) )

View File

@ -1,8 +1,8 @@
from none import ( from nonebot import (
CommandSession, CommandGroup, CommandSession, CommandGroup,
on_natural_language, NLPSession, NLPResult on_natural_language, NLPSession, NLPResult
) )
from none.helpers import render_expression as __ from nonebot.helpers import render_expression as __
from . import expressions as e from . import expressions as e

View File

@ -18,7 +18,7 @@ module.exports = {
], ],
ga: 'UA-115509121-2', ga: 'UA-115509121-2',
themeConfig: { themeConfig: {
repo: 'richardchien/none-bot', repo: 'richardchien/nonebot',
docsDir: 'docs', docsDir: 'docs',
editLinks: true, editLinks: true,
editLinkText: '在 GitHub 上编辑此页', editLinkText: '在 GitHub 上编辑此页',

View File

@ -1,6 +1,6 @@
# 类 Shell 的参数解析 # 类 Shell 的参数解析
`none.argparse` 模块主要继承自 Python 内置的同名模块(`argparse`),用于解析命令的参数。在需要编写类 shell 语法的命令的时候,使用此模块可以大大提高开发效率。 `nonebot.argparse` 模块主要继承自 Python 内置的同名模块(`argparse`),用于解析命令的参数。在需要编写类 shell 语法的命令的时候,使用此模块可以大大提高开发效率。
「类 shell 语法」指的是形如 `some-command --verbose -n 3 --name=some-name argument1 argument2` 的类似于 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` 属性来快速获得。 `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` 参数,分别用于发送消息和使用帮助的内容。 特别地,`parse_args()` 方法如果遇到需要打印帮助或报错并退出程序的情况(具体可以通过使用 Python 内置的 `argparse.ArgumentParser` 来体验),行为会更改为发送消息给当前 session 对应的上下文。注意到,`ArgumentParser` 类初始化时传入了 `session``usage` 参数,分别用于发送消息和使用帮助的内容。

View File

@ -2,7 +2,7 @@
NoneBot 所基于的 python-aiocqhttp 库使用的 web 框架是 Quart因此 NoneBot 的部署方法和 Quart 一致([Deploying Quart](https://pgjones.gitlab.io/quart/deployment.html))。 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` 文件如下: 具体地,通常在项目根目录下创建一个 `run.py` 文件如下:
@ -10,12 +10,12 @@ Quart 官方建议使用 Hypercorn 来部署,这需要一个 ASGI app 对象
import os import os
import sys import sys
import none import nonebot
import config import config
none.init(config) nonebot.init(config)
bot = none.get_bot() bot = nonebot.get_bot()
app = bot.asgi app = bot.asgi
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -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 ```python
import logging import logging
import none import nonebot
from none.log import logger from nonebot.log import logger
import config import config
none.init(config) nonebot.init(config)
# logger.setLevel(logging.WARNING) # logger.setLevel(logging.WARNING)
logger.info('Starting') logger.info('Starting')
none.run() nonebot.run()
``` ```

View File

@ -10,7 +10,7 @@ sidebar: auto
除了 Python 内置的类型,下面还出现了如下 NoneBot 自定类型,实际上它们是 Python 内置类型的别名。 除了 Python 内置的类型,下面还出现了如下 NoneBot 自定类型,实际上它们是 Python 内置类型的别名。
以下类型均可从 `none.typing` 模块导入。 以下类型均可从 `nonebot.typing` 模块导入。
### `Context_T` ### `Context_T`
@ -26,7 +26,7 @@ sidebar: auto
- **说明:** - **说明:**
消息对象的类型,通常表示 NoneBot 提供的消息相关接口所支持的类型,`none.message.Message` 也是一个合法的 `Message_T` 消息对象的类型,通常表示 NoneBot 提供的消息相关接口所支持的类型,`nonebot.message.Message` 也是一个合法的 `Message_T`
### `Expression_T` ### `Expression_T`
@ -302,26 +302,26 @@ sidebar: auto
APScheduler 的配置对象,见 [Configuring the scheduler](https://apscheduler.readthedocs.io/en/latest/userguide.html#configuring-the-scheduler)。 APScheduler 的配置对象,见 [Configuring the scheduler](https://apscheduler.readthedocs.io/en/latest/userguide.html#configuring-the-scheduler)。
## `none` 模块 ## `nonebot` 模块
### 快捷导入 ### 快捷导入
为方便使用,`none` 模块从子模块导入了部分内容: 为方便使用,`nonebot` 模块从子模块导入了部分内容:
- `CQHttpError` -> `none.exceptions.CQHttpError` - `CQHttpError` -> `nonebot.exceptions.CQHttpError`
- `message_preprocessor` -> `none.message.message_preprocessor` - `message_preprocessor` -> `nonebot.message.message_preprocessor`
- `Message` -> `none.message.Message` - `Message` -> `nonebot.message.Message`
- `MessageSegment` -> `none.message.MessageSegment` - `MessageSegment` -> `nonebot.message.MessageSegment`
- `on_command` -> `none.command.on_command` - `on_command` -> `nonebot.command.on_command`
- `CommandSession` -> `none.command.CommandSession` - `CommandSession` -> `nonebot.command.CommandSession`
- `CommandGroup` -> `none.command.CommandGroup` - `CommandGroup` -> `nonebot.command.CommandGroup`
- `on_natural_language` -> `none.natural_language.on_natural_language` - `on_natural_language` -> `nonebot.natural_language.on_natural_language`
- `NLPSession` -> `none.natural_language.NLPSession` - `NLPSession` -> `nonebot.natural_language.NLPSession`
- `NLPResult` -> `none.natural_language.NLPResult` - `NLPResult` -> `nonebot.natural_language.NLPResult`
- `on_notice` -> `none.notice_request.on_notice` - `on_notice` -> `nonebot.notice_request.on_notice`
- `NoticeSession` -> `none.notice_request.NoticeSession` - `NoticeSession` -> `nonebot.notice_request.NoticeSession`
- `on_request` -> `none.notice_request.on_request` - `on_request` -> `nonebot.notice_request.on_request`
- `RequestSession` -> `none.notice_request.RequestSession` - `RequestSession` -> `nonebot.notice_request.RequestSession`
### `scheduler` ### `scheduler`
@ -401,7 +401,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
bot = none.get_bot() bot = nonebot.get_bot()
@bot.on_message('group') @bot.on_message('group')
async def handle_group_message(ctx: Context_T) async def handle_group_message(ctx: Context_T)
@ -425,7 +425,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
bot = none.get_bot() bot = nonebot.get_bot()
@bot.on_notice('group_increase') @bot.on_notice('group_increase')
async def handle_group_increase(ctx: Context_T) async def handle_group_increase(ctx: Context_T)
@ -449,7 +449,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
bot = none.get_bot() bot = nonebot.get_bot()
@bot.on_request('friend', 'group.invite') @bot.on_request('friend', 'group.invite')
async def handle_request(ctx: Context_T) async def handle_request(ctx: Context_T)
@ -473,7 +473,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
bot = none.get_bot() bot = nonebot.get_bot()
@bot.on_meta_event('heartbeat') @bot.on_meta_event('heartbeat')
async def handle_heartbeat(ctx: Context_T) async def handle_heartbeat(ctx: Context_T)
@ -500,7 +500,7 @@ sidebar: auto
```python ```python
import config import config
none.init(config) nonebot.init(config)
``` ```
导入 `config` 模块并初始化全局 NoneBot 对象。 导入 `config` 模块并初始化全局 NoneBot 对象。
@ -522,7 +522,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
bot = none.get_bot() bot = nonebot.get_bot()
``` ```
### `run(host=None, port=None, *args, **kwargs)` ### `run(host=None, port=None, *args, **kwargs)`
@ -545,7 +545,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```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 对象。 `127.0.0.1:8080` 运行全局 NoneBot 对象。
@ -567,10 +567,10 @@ sidebar: auto
- **用法:** - **用法:**
```python ```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)` ### `load_plugins(plugin_dir, module_prefix)`
@ -590,7 +590,7 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
none.load_plugins(path.join(path.dirname(__file__), 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'),
'maruko.plugins') 'maruko.plugins')
``` ```
@ -609,16 +609,16 @@ sidebar: auto
- **用法:** - **用法:**
```python ```python
none.load_builtin_plugins() nonebot.load_builtin_plugins()
``` ```
## `none.exceptions` 模块 ## `nonebot.exceptions` 模块
### _class_ `CQHttpError` ### _class_ `CQHttpError`
等价于 `aiocqhttp.Error` 等价于 `aiocqhttp.Error`
## `none.message` 模块 ## `nonebot.message` 模块
### _decorator_ `message_preprocessor` ### _decorator_ `message_preprocessor`
@ -1115,7 +1115,7 @@ sidebar: auto
- `str`: 去转义后的字符串 - `str`: 去转义后的字符串
## `none.command` 模块 ## `nonebot.command` 模块
### _decorator_ `on_command(name, *, aliases=(), permission=perm.EVERYBODY, only_to_me=True, privileged=False, shell_like=False)` ### _decorator_ `on_command(name, *, aliases=(), permission=perm.EVERYBODY, only_to_me=True, privileged=False, shell_like=False)`
@ -1503,7 +1503,7 @@ sidebar: auto
在特权命令 `kill` 中强行移除当前正在运行的会话。 在特权命令 `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)` ### _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` 对象,参数即为上面的三个属性。 初始化 `NLPResult` 对象,参数即为上面的三个属性。
## `none.notice_request` 模块 ## `nonebot.notice_request` 模块
### _decorator_ `on_notice(*events)` ### _decorator_ `on_notice(*events)`
@ -1724,7 +1724,7 @@ sidebar: auto
await session.reject() await session.reject()
``` ```
## `none.session` 模块 ## `nonebot.session` 模块
### _class_ `BaseSession` ### _class_ `BaseSession`
@ -1791,7 +1791,7 @@ sidebar: auto
在当前 Session 对应的上下文中发送 `hello` 在当前 Session 对应的上下文中发送 `hello`
## `none.permission` 模块 ## `nonebot.permission` 模块
### 权限声明常量 ### 权限声明常量
@ -1813,7 +1813,7 @@ sidebar: auto
例如下面的代码中,只有私聊和群管理员可以访问 `hello` 命令: 例如下面的代码中,只有私聊和群管理员可以访问 `hello` 命令:
```python ```python
@none.on_command('hello', permission=PRIVATE | GROUP_ADMIN) @nonebot.on_command('hello', permission=PRIVATE | GROUP_ADMIN)
async def _(session): async def _(session):
pass pass
``` ```
@ -1842,7 +1842,7 @@ async def _(session):
has_perm = await check_permission(bot, ctx, cmd.permission) has_perm = await check_permission(bot, ctx, cmd.permission)
``` ```
## `none.log` 模块 ## `nonebot.log` 模块
### `logger` ### `logger`
@ -1858,7 +1858,7 @@ async def _(session):
logger.debug('Some log message here') logger.debug('Some log message here')
``` ```
## `none.helpers` 模块 ## `nonebot.helpers` 模块
### `context_id(ctx, *, mode='default', use_hash=False)` ### `context_id(ctx, *, mode='default', use_hash=False)`
@ -1941,7 +1941,7 @@ async def _(session):
) )
``` ```
## `none.argparse` 模块 ## `nonebot.argparse` 模块
### _class_ `ArgumentParser` ### _class_ `ArgumentParser`
@ -2006,7 +2006,7 @@ async def _(session):
无。 无。
## `none.sched` 模块 ## `nonebot.sched` 模块
### _class_ `Scheduler` ### _class_ `Scheduler`

View File

@ -64,4 +64,4 @@ sidebar: auto
## v0.2.2 ## v0.2.2
- 修复快速的连续消息导致报错问题 [#5](https://github.com/richardchien/none-bot/issues/5) - 修复快速的连续消息导致报错问题 [#5](https://github.com/richardchien/nonebot/issues/5)

View File

@ -66,10 +66,10 @@ docker run hello-world
或称为「命令处理函数」,有时也简称为「命令」,是 NoneBot 插件中实际用于实现某个命令功能的函数。 或称为「命令处理函数」,有时也简称为「命令」,是 NoneBot 插件中实际用于实现某个命令功能的函数。
通过 `none.on_command` 装饰器可以将一个函数注册为命令处理器,例如: 通过 `nonebot.on_command` 装饰器可以将一个函数注册为命令处理器,例如:
```python ```python
from none import on_command from nonebot import on_command
@on_command('echo') @on_command('echo')
async def echo(session): async def echo(session):
@ -80,10 +80,10 @@ async def echo(session):
或称为「自然语言处理函数」,是 NoneBot 插件中用于将用户的自然语言消息解析为命令和参数的函数。 或称为「自然语言处理函数」,是 NoneBot 插件中用于将用户的自然语言消息解析为命令和参数的函数。
通过 `none.on_natural_language` 装饰器可以将一个函数注册为自然语言处理器,例如: 通过 `nonebot.on_natural_language` 装饰器可以将一个函数注册为自然语言处理器,例如:
```python ```python
from none import on_natural_language from nonebot import on_natural_language
@on_natural_language @on_natural_language
async def _(session): async def _(session):

View File

@ -3,7 +3,7 @@
到目前为止我们还在使用 NoneBot 的默认行为,在开始编写自己的插件之前,我们先尝试在配置文件上动动手脚,让 NoneBot 表现出不同的行为。 到目前为止我们还在使用 NoneBot 的默认行为,在开始编写自己的插件之前,我们先尝试在配置文件上动动手脚,让 NoneBot 表现出不同的行为。
::: tip 提示 ::: 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` 中填充如下内容: 因此下面我们往 `config.py` 中填充如下内容:
```python ```python
from none.default_config import * from nonebot.default_config import *
SUPERUSERS = {12345678} SUPERUSERS = {12345678}
``` ```
@ -45,17 +45,17 @@ SUPERUSERS = {12345678}
`config.py` 写好之后,修改 `bot.py` 如下: `config.py` 写好之后,修改 `bot.py` 如下:
```python {3,6} ```python {3,6}
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.run(host='127.0.0.1', port=8080) 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 后再次尝试发送: 重启 NoneBot 后再次尝试发送:
@ -70,7 +70,7 @@ if __name__ == '__main__':
目前我们发送的命令都必须以一个特殊符号 `/` 开头实际上NoneBot 默认支持以 `/`、``、`!`、`` 其中之一作为开头,现在我们希望能够不需要特殊符号开头就可以调用命令,要做到这一点非常简单,在 `config.py` 添加一行即可: 目前我们发送的命令都必须以一个特殊符号 `/` 开头实际上NoneBot 默认支持以 `/`、``、`!`、`` 其中之一作为开头,现在我们希望能够不需要特殊符号开头就可以调用命令,要做到这一点非常简单,在 `config.py` 添加一行即可:
```python {4} ```python {4}
from none.default_config import * from nonebot.default_config import *
SUPERUSERS = {12345678} SUPERUSERS = {12345678}
COMMAND_START.add('') COMMAND_START.add('')
@ -88,7 +88,7 @@ COMMAND_START = {'/', '!', '', ''}
```python ```python
import re import re
from none.default_config import * from nonebot.default_config import *
COMMAND_START = ['', re.compile(r'[/!]+')] COMMAND_START = ['', re.compile(r'[/!]+')]
``` ```
@ -103,10 +103,10 @@ COMMAND_START = ['', re.compile(r'[/!]+')]
## 配置监听的 IP 和端口 ## 配置监听的 IP 和端口
当有了配置文件之后,我们可能会希望将 `none.run()` 参数中的 `host``port` 移动到配置文件中,毕竟这两项是有可能随着运行场景的变化而有不同的需求的,把它们放到配置文件中有利于配置和代码的解耦。这同样很容易做到,只需进行如下配置: 当有了配置文件之后,我们可能会希望将 `nonebot.run()` 参数中的 `host``port` 移动到配置文件中,毕竟这两项是有可能随着运行场景的变化而有不同的需求的,把它们放到配置文件中有利于配置和代码的解耦。这同样很容易做到,只需进行如下配置:
```python {3-4} ```python {3-4}
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080
@ -115,17 +115,17 @@ PORT = 8080
然后在 `bot.py` 中就不再需要传入 `host``port`,如下: 然后在 `bot.py` 中就不再需要传入 `host``port`,如下:
```python {8} ```python {8}
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.run() nonebot.run()
``` ```
实际上,不需要配置这两项也可以直接使用 `none.run()`NoneBot 会使用如下默认配置: 实际上,不需要配置这两项也可以直接使用 `nonebot.run()`NoneBot 会使用如下默认配置:
```python ```python
HOST = '127.0.0.1' HOST = '127.0.0.1'

View File

@ -16,7 +16,7 @@ await bot.send_private_msg(user_id=12345678, message='你好~')
1. **所有参数必须为命名参数keyword argument**,否则无法正确调用 1. **所有参数必须为命名参数keyword argument**,否则无法正确调用
2. 这种调用全都是异步调用,因此需要适当 `await` 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': '你好~'}` 另外,在需要动态性的场合,除了使用 `getattr()` 方法外,还可以直接调用 `bot.call_action()` 方法,传入 `action``params` 即可,例如上例中,`action` 为 `'send_private_msg'``params` 为 `{'user_id': 12345678, 'message': '你好~'}`

View File

@ -1,8 +1,8 @@
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1 +1 @@
none-bot>=0.2.1 nonebot>=1.0.0

View File

@ -1,4 +1,4 @@
from none import on_command, CommandSession from nonebot import on_command, CommandSession
# on_command 装饰器将函数声明为一个命令处理器 # on_command 装饰器将函数声明为一个命令处理器

View File

@ -1,11 +1,11 @@
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'awesome.plugins') 'awesome.plugins')
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1 +1 @@
none-bot>=0.2.1 nonebot>=1.0.0

View File

@ -1,5 +1,5 @@
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from jieba import posseg from jieba import posseg
from .data_source import get_weather_of_city from .data_source import get_weather_of_city

View File

@ -1,11 +1,11 @@
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'awesome.plugins') 'awesome.plugins')
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1,2 +1,2 @@
none-bot>=0.2.1 nonebot>=1.0.0
jieba jieba

View File

@ -3,9 +3,9 @@ from typing import Optional
import aiohttp import aiohttp
from aiocqhttp.message import escape from aiocqhttp.message import escape
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from none.helpers import context_id, render_expression from nonebot.helpers import context_id, render_expression
# 定义无法获取图灵回复时的「表达Expression # 定义无法获取图灵回复时的「表达Expression
EXPR_DONT_UNDERSTAND = ( EXPR_DONT_UNDERSTAND = (

View File

@ -1,5 +1,5 @@
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from jieba import posseg from jieba import posseg
from .data_source import get_weather_of_city from .data_source import get_weather_of_city

View File

@ -1,11 +1,11 @@
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'awesome.plugins') 'awesome.plugins')
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1,3 +1,3 @@
none-bot>=0.2.1 nonebot>=1.0.0
jieba jieba
aiohttp aiohttp

View File

@ -1,5 +1,5 @@
from none import on_request, RequestSession from nonebot import on_request, RequestSession
from none import on_notice, NoticeSession from nonebot import on_notice, NoticeSession
# 将函数注册为群请求处理器 # 将函数注册为群请求处理器

View File

@ -3,9 +3,9 @@ from typing import Optional
import aiohttp import aiohttp
from aiocqhttp.message import escape from aiocqhttp.message import escape
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from none.helpers import context_id, render_expression from nonebot.helpers import context_id, render_expression
# 定义无法获取图灵回复时的「表达Expression # 定义无法获取图灵回复时的「表达Expression
EXPR_DONT_UNDERSTAND = ( EXPR_DONT_UNDERSTAND = (

View File

@ -1,5 +1,5 @@
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from jieba import posseg from jieba import posseg
from .data_source import get_weather_of_city from .data_source import get_weather_of_city

View File

@ -1,11 +1,11 @@
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'awesome.plugins') 'awesome.plugins')
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1,3 +1,3 @@
none-bot>=0.2.1 nonebot>=1.0.0
jieba jieba
aiohttp aiohttp

View File

@ -1,5 +1,5 @@
from none import on_request, RequestSession from nonebot import on_request, RequestSession
from none import on_notice, NoticeSession from nonebot import on_notice, NoticeSession
# 将函数注册为群请求处理器 # 将函数注册为群请求处理器

View File

@ -1,13 +1,13 @@
from datetime import datetime from datetime import datetime
import none import nonebot
import pytz import pytz
from aiocqhttp.exceptions import Error as CQHttpError from aiocqhttp.exceptions import Error as CQHttpError
@none.scheduler.scheduled_job('cron', hour='*') @nonebot.scheduler.scheduled_job('cron', hour='*')
async def _(): async def _():
bot = none.get_bot() bot = nonebot.get_bot()
now = datetime.now(pytz.timezone('Asia/Shanghai')) now = datetime.now(pytz.timezone('Asia/Shanghai'))
try: try:
await bot.send_group_msg(group_id=672076603, await bot.send_group_msg(group_id=672076603,

View File

@ -3,9 +3,9 @@ from typing import Optional
import aiohttp import aiohttp
from aiocqhttp.message import escape from aiocqhttp.message import escape
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from none.helpers import context_id, render_expression from nonebot.helpers import context_id, render_expression
# 定义无法获取图灵回复时的「表达Expression # 定义无法获取图灵回复时的「表达Expression
EXPR_DONT_UNDERSTAND = ( EXPR_DONT_UNDERSTAND = (

View File

@ -1,5 +1,5 @@
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from jieba import posseg from jieba import posseg
from .data_source import get_weather_of_city from .data_source import get_weather_of_city

View File

@ -1,11 +1,11 @@
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'awesome.plugins') 'awesome.plugins')
none.run() nonebot.run()

View File

@ -1,4 +1,4 @@
from none.default_config import * from nonebot.default_config import *
HOST = '0.0.0.0' HOST = '0.0.0.0'
PORT = 8080 PORT = 8080

View File

@ -1,4 +1,4 @@
none-bot>=0.2.1 nonebot>=1.0.0
jieba jieba
aiohttp aiohttp
pytz pytz

View File

@ -3,7 +3,7 @@
本章将以一个天气查询插件为例,教你如何编写自己的命令。 本章将以一个天气查询插件为例,教你如何编写自己的命令。
::: tip 提示 ::: 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} ```python {1,9-10}
from os import path from os import path
import none import nonebot
import config import config
if __name__ == '__main__': if __name__ == '__main__':
none.init(config) nonebot.init(config)
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'), nonebot.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
'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`,可以看到日志输出了类似如下内容: 尝试运行 `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` 插件。 这表示 NoneBot 已经成功加载到了 `weather` 插件。
@ -73,7 +73,7 @@ set PYTHONPATH=. # Windows
好了,现在已经确保插件可以正确加载,我们可以开始编写命令的实际代码了。在 `weather.py` 中添加如下代码: 好了,现在已经确保插件可以正确加载,我们可以开始编写命令的实际代码了。在 `weather.py` 中添加如下代码:
```python ```python
from none import on_command, CommandSession from nonebot import on_command, CommandSession
# on_command 装饰器将函数声明为一个命令处理器 # on_command 装饰器将函数声明为一个命令处理器

View File

@ -7,12 +7,12 @@
使用你最熟悉的编辑器或 IDE创建一个名为 `bot.py` 的文件,内容如下: 使用你最熟悉的编辑器或 IDE创建一个名为 `bot.py` 的文件,内容如下:
```python ```python
import none import nonebot
if __name__ == '__main__': if __name__ == '__main__':
none.init() nonebot.init()
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.run(host='127.0.0.1', port=8080) nonebot.run(host='127.0.0.1', port=8080)
``` ```
`if __name__ == '__main__'` 语句块的这几行代码将依次: `if __name__ == '__main__'` 语句块的这几行代码将依次:
@ -22,7 +22,7 @@ if __name__ == '__main__':
3. 在地址 `127.0.0.1:8080` 运行 NoneBot 3. 在地址 `127.0.0.1:8080` 运行 NoneBot
::: tip 提示 ::: 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 实例: 在命令行使用如下命令即可运行这个 NoneBot 实例:
@ -47,7 +47,7 @@ python bot.py
``` ```
::: tip 提示 ::: 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以使新的配置文件生效。 修改之后,在酷 Q 的应用菜单中重启 CoolQ HTTP API 插件,或直接重启酷 Q以使新的配置文件生效。

View File

@ -9,14 +9,14 @@
可以使用 pip 安装已发布的最新版本: 可以使用 pip 安装已发布的最新版本:
```bash ```bash
pip install none-bot pip install nonebot
``` ```
如果你需要使用最新的(可能尚未发布的)特性,可以克隆 Git 仓库后手动安装: 如果你需要使用最新的(可能尚未发布的)特性,可以克隆 Git 仓库后手动安装:
```bash ```bash
git clone https://github.com/richardchien/none-bot.git git clone https://github.com/richardchien/nonebot.git
cd none-bot cd nonebot
python setup.py install python setup.py install
``` ```

View File

@ -9,7 +9,7 @@
``` ```
::: tip 提示 ::: 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` 内容如下: `weather/__init__.py` 内容如下:
```python ```python
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from .data_source import get_weather_of_city from .data_source import get_weather_of_city
@ -71,8 +71,8 @@ async def get_weather_of_city(city: str) -> str:
`weather/__init__.py` 文件添加内容如下: `weather/__init__.py` 文件添加内容如下:
```python {2,23-29} ```python {2,23-29}
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from .data_source import get_weather_of_city from .data_source import get_weather_of_city
@ -143,8 +143,8 @@ pip install jieba
有了结巴分词之后,扩充 `weather/__init__.py` 如下: 有了结巴分词之后,扩充 `weather/__init__.py` 如下:
```python {3,29-43} ```python {3,29-43}
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from jieba import posseg from jieba import posseg
from .data_source import get_weather_of_city from .data_source import get_weather_of_city

View File

@ -5,7 +5,7 @@
本章将介绍如何在插件中处理通知和请求。 本章将介绍如何在插件中处理通知和请求。
::: tip 提示 ::: 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`,编写代码如下: 新建 `awesome/plugins/group_admin.py`,编写代码如下:
```python ```python
from none import on_request, RequestSession from nonebot import on_request, RequestSession
# 将函数注册为群请求处理器 # 将函数注册为群请求处理器
@ -41,7 +41,7 @@ async def _(session: RequestSession):
新成员入群之后,为了活跃气氛,我们可能希望机器人发一段欢迎消息。只需下面的代码即可实现: 新成员入群之后,为了活跃气氛,我们可能希望机器人发一段欢迎消息。只需下面的代码即可实现:
```python ```python
from none import on_notice, NoticeSession from nonebot import on_notice, NoticeSession
# 将函数注册为群成员增加通知处理器 # 将函数注册为群成员增加通知处理器

View File

@ -3,7 +3,7 @@
实际应用中还经常会有定时执行任务的需求为了方便这类需求的开发NoneBot 可选地包含了计划任务功能。 实际应用中还经常会有定时执行任务的需求为了方便这类需求的开发NoneBot 可选地包含了计划任务功能。
::: tip 提示 ::: 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` 可选功能 ## 安装 `scheduler` 可选功能
@ -13,10 +13,10 @@
使用下面命令安装可选功能(会自动安装 APScheduler 使用下面命令安装可选功能(会自动安装 APScheduler
```bash ```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} ```python {8}
from datetime import datetime from datetime import datetime
import none import nonebot
import pytz import pytz
from aiocqhttp.exceptions import Error as CQHttpError from aiocqhttp.exceptions import Error as CQHttpError
@none.scheduler.scheduled_job('cron', hour='*') @nonebot.scheduler.scheduled_job('cron', hour='*')
async def _(): async def _():
bot = none.get_bot() bot = nonebot.get_bot()
now = datetime.now(pytz.timezone('Asia/Shanghai')) now = datetime.now(pytz.timezone('Asia/Shanghai'))
try: try:
await bot.send_group_msg(group_id=672076603, await bot.send_group_msg(group_id=672076603,
@ -43,8 +43,8 @@ async def _():
pass 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)。

View File

@ -7,7 +7,7 @@
不过还是有解决方案的,市面上有一些提供智能聊天机器人接口的厂商,本章我们以 [图灵机器人](http://www.tuling123.com/) 为例,因为它的使用比较广泛,接入也比较简单,不过缺点是免费调用次数比较少。 不过还是有解决方案的,市面上有一些提供智能聊天机器人接口的厂商,本章我们以 [图灵机器人](http://www.tuling123.com/) 为例,因为它的使用比较广泛,接入也比较简单,不过缺点是免费调用次数比较少。
::: tip 提示 ::: 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 import aiohttp
from aiocqhttp.message import escape from aiocqhttp.message import escape
from none import on_command, CommandSession from nonebot import on_command, CommandSession
from none import on_natural_language, NLPSession, NLPResult from nonebot import on_natural_language, NLPSession, NLPResult
from none.helpers import context_id, render_expression from nonebot.helpers import context_id, render_expression
# 定义无法获取图灵回复时的「表达Expression # 定义无法获取图灵回复时的「表达Expression
EXPR_DONT_UNDERSTAND = ( EXPR_DONT_UNDERSTAND = (
@ -184,9 +184,9 @@ async def call_tuling_api(session: CommandSession, text: str) -> Optional[str]:
第一段高亮部分是根据图灵机器人的文档构造请求数据,其中有几个需要注意的地方:第 16、17 和 21 行。 第一段高亮部分是根据图灵机器人的文档构造请求数据,其中有几个需要注意的地方:第 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`,它们的效果如下表:
| 模式 | 效果 | | 模式 | 效果 |
| ------------ | --- | | ------------ | --- |

View File

@ -43,17 +43,17 @@ CoolQ HTTP API 插件通过反向 WebSocket 将消息事件发送到 NoneBot 后
到这里,我们先暂停一下对消息事件的行踪的描述,回头来说一下最小实例的代码: 到这里,我们先暂停一下对消息事件的行踪的描述,回头来说一下最小实例的代码:
```python ```python
import none import nonebot
if __name__ == '__main__': if __name__ == '__main__':
none.init() nonebot.init()
none.load_builtin_plugins() nonebot.load_builtin_plugins()
none.run(host='127.0.0.1', port=8080) 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 码,如下图: 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" /> <img alt="Echo and Say" src="./assets/echo_and_say.png" />
</p> </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 配置中,插件利用了后两个入口。
### 命令处理器 ### 命令处理器

View File

@ -155,10 +155,10 @@ def load_plugins(plugin_dir: str, module_prefix: str) -> int:
def load_builtin_plugins() -> 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') 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 * from .exceptions import *

View File

@ -7,7 +7,7 @@ to override the default one.
For example: For example:
>>> from none.default_config import * >>> from nonebot.default_config import *
>>> PORT = 9090 >>> PORT = 9090
>>> DEBUG = False >>> DEBUG = False
>>> SUPERUSERS.add(123456) >>> SUPERUSERS.add(123456)

View File

@ -1,14 +1,14 @@
""" """
Provide logger object. 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. to log messages.
""" """
import logging import logging
import sys import sys
logger = logging.getLogger('none') logger = logging.getLogger('nonebot')
default_handler = logging.StreamHandler(sys.stdout) default_handler = logging.StreamHandler(sys.stdout)
default_handler.setFormatter(logging.Formatter( default_handler.setFormatter(logging.Formatter(
'[%(asctime)s %(name)s] %(levelname)s: %(message)s' '[%(asctime)s %(name)s] %(levelname)s: %(message)s'

View File

@ -1,5 +1,5 @@
from none import on_command, CommandSession, permission as perm from nonebot import on_command, CommandSession, permission as perm
from none.message import unescape from nonebot.message import unescape
@on_command('echo') @on_command('echo')

View File

@ -4,24 +4,24 @@ with open('README.md', 'r', encoding='utf-8') as f:
long_description = f.read() long_description = f.read()
setup( setup(
name='none-bot', name='nonebot',
version='0.5.3', version='1.0.0',
packages=find_packages(include=('none', 'none.*')), packages=find_packages(include=('nonebot', 'nonebot.*')),
url='https://github.com/richardchien/none-bot', url='https://github.com/richardchien/nonebot',
license='MIT License', license='MIT License',
author='Richard Chien', author='Richard Chien',
author_email='richardchienthebest@gmail.com', author_email='richardchienthebest@gmail.com',
description='An asynchronous QQ bot framework based on CoolQ.', description='An asynchronous QQ bot framework based on CoolQ.',
long_description=long_description, long_description=long_description,
long_description_content_type='text/markdown', 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={ extras_require={
'scheduler': ['apscheduler>=1.2'], 'scheduler': ['apscheduler>=1.2'],
}, },
python_requires='>=3.6', python_requires='>=3.6.1',
platforms='any', platforms='any',
classifiers=( classifiers=(
'Development Status :: 4 - Beta', 'Development Status :: 5 - Production/Stable',
'Framework :: Robot Framework', 'Framework :: Robot Framework',
'Framework :: Robot Framework :: Library', 'Framework :: Robot Framework :: Library',
'License :: OSI Approved :: MIT License', 'License :: OSI Approved :: MIT License',