diff --git a/README.md b/README.md index 72c8b73e..6fa485c5 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ [![License](https://img.shields.io/pypi/l/none-bot.svg)](LICENSE) [![PyPI](https://img.shields.io/pypi/v/none-bot.svg)](https://pypi.python.org/pypi/none-bot) -NoneBot 是一个基于 [酷 Q](https://cqp.cc/) 的 Python 异步 QQ 机器人框架,框架与酷 Q 交互的部分使用 [aiocqhttp](https://github.com/richardchien/python-aiocqhttp),后者是 [CoolQ HTTP API 插件](https://github.com/richardchien/coolq-http-api) 的一个 Python 异步 SDK。NoneBot 仅支持 Python 3.6+ 及 CoolQ HTTP API 插件 v4.2+。 +NoneBot 是一个基于 [酷 Q](https://cqp.cc/) 的 Python 异步 QQ 机器人框架,底层与酷 Q 交互的部分使用 [python-aiocqhttp](https://github.com/richardchien/python-aiocqhttp),后者是 [CoolQ HTTP API 插件](https://github.com/richardchien/coolq-http-api) 的一个 Python 异步 SDK。NoneBot 仅支持 Python 3.6+ 及 CoolQ HTTP API 插件 v4.2+。 NoneBot 本身不包含任何实际功能,仅仅提供处理消息、解析命令等核心功能,框架的使用者需要使用框架提供的接口,以插件的形式来编写具体功能。 -文档暂时还没完成,请先参考 [none.plugins](none/plugins)、[demo](demo) 模块和 [richardchien/maruko](https://github.com/richardchien/maruko) 项目中的使用方式。 +文档暂时还没完成,可以在 [这里](https://none.rclab.tk/) 访问正在编写中的文档,对于文档中目前尚未写到的部分,请先参考 [none.plugins](none/plugins)、[demo](demo) 和 [richardchien/maruko](https://github.com/richardchien/maruko) 项目。 diff --git a/demo/__init__.py b/demo/__init__.py index 06e71871..3b5dd1bd 100644 --- a/demo/__init__.py +++ b/demo/__init__.py @@ -1,13 +1,20 @@ -from os import path +# from os import path +# +# import none +# from demo import config +# +# none.init(config) +# app = none.get_bot().asgi +# +# if __name__ == '__main__': +# none.load_builtin_plugins() +# none.load_plugins(path.join(path.dirname(__file__), 'plugins'), +# 'demo.plugins') +# none.run(host=config.HOST, port=config.PORT) import none -from demo import config - -none.init(config) -app = none.get_bot().asgi if __name__ == '__main__': + none.init() none.load_builtin_plugins() - none.load_plugins(path.join(path.dirname(__file__), 'plugins'), - 'demo.plugins') - none.run(host=config.HOST, port=config.PORT) + none.run(host='0.0.0.0', port=8080) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 89a334d3..74abeec4 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -13,8 +13,8 @@ module.exports = { lastUpdated: '上次更新', activeHeaderLinks: false, nav: [ - { text: '指南', link: '/guide/' }, - { text: '术语表', link: '/glossary' }, + { text: '入门指南', link: '/guide/' }, + { text: '术语表', link: '/glossary.md' }, ], sidebar: { '/guide/': [ @@ -25,6 +25,7 @@ module.exports = { '', 'installation', 'getting-started', + 'whats-happened', ] } ] diff --git a/docs/.vuepress/public/hero.png b/docs/.vuepress/public/hero.png new file mode 100644 index 00000000..d9c5b33c Binary files /dev/null and b/docs/.vuepress/public/hero.png differ diff --git a/docs/README.md b/docs/README.md index 91a75c41..be2862af 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,6 @@ --- home: true +heroImage: /hero.png actionText: 即刻开始 actionLink: /guide/ features: diff --git a/docs/guide/README.md b/docs/guide/README.md index 792c8839..0059696b 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -1,29 +1,37 @@ # 介绍 -NoneBot 是一个基于 [酷 Q](https://cqp.cc/) 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功能。 - -除了起到解析消息的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制,尤其对于命令处理器,它更是提供了完善且易用的用户会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。 - -NoneBot 在其底层与酷 Q 交互的部分使用 [python-aiocqhttp](https://github.com/richardchien/python-aiocqhttp) 库,后者是 [CoolQ HTTP API 插件](https://github.com/richardchien/coolq-http-api) 的一个 Python 异步 SDK,在 [Quart](https://pgjones.gitlab.io/quart/) 的基础上封装了与 CoolQ HTTP API 插件的网络交互。 - -得益于 Python 的 [asyncio](https://docs.python.org/3/library/asyncio.html) 机制,NoneBot 处理消息的吞吐量有了很大的保障,再配合 CoolQ HTTP API 插件可选的 WebSocket 通信方式(也是最建议的通信方式),NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,性能更是有质的飞跃。 - -需要注意的是,NoneBot 仅支持 Python 3.6+ 及 CoolQ HTTP API 插件 v4.2+。 - ::: tip 提示 如果在阅读本文档时遇到难以理解的词汇,请随时查阅 [术语表](/glossary.md) 或使用 [Google 搜索](https://www.google.com/ncr)。 ::: ::: tip 提示 -如果初次使用时觉得这里的介绍过于枯燥,可简单略读之后直接前往 [安装](/guide/installation.md) 查看安装方法,并进行后续的基础使用教程。 +初次使用时可能会觉得这里的介绍过于枯燥,可以先简单略读之后直接前往 [安装](/guide/installation.md) 查看安装方法,并进行后续的基础使用教程。 ::: -## NoneBot 如何工作? +NoneBot 是一个基于 [酷 Q](https://cqp.cc/) 的 Python 异步 QQ 机器人框架,它会对 QQ 机器人收到的消息进行解析和处理,并以插件化的形式,分发给消息所对应的命令处理器和自然语言处理器,来完成具体的功能。 + +除了起到解析消息的作用,NoneBot 还为插件提供了大量实用的预设操作和权限控制机制,尤其对于命令处理器,它更是提供了完善且易用的会话机制和内部调用机制,以分别适应命令的连续交互和插件内部功能复用等需求。 + +NoneBot 在其底层与酷 Q 交互的部分使用 [python-aiocqhttp](https://github.com/richardchien/python-aiocqhttp) 库,后者是 [CoolQ HTTP API 插件](https://github.com/richardchien/coolq-http-api) 的一个 Python 异步 SDK,在 [Quart](https://pgjones.gitlab.io/quart/) 的基础上封装了与 CoolQ HTTP API 插件的网络交互。 + +得益于 Python 的 [asyncio](https://docs.python.org/3/library/asyncio.html) 机制,NoneBot 处理消息的吞吐量有了很大的保障,再配合 CoolQ HTTP API 插件可选的 WebSocket 通信方式(也是最建议的通信方式),NoneBot 的性能可以达到 HTTP 通信方式的两倍以上,相较于传统同步 I/O 的 HTTP 通信,更是有质的飞跃。 + +需要注意的是,NoneBot 仅支持 Python 3.6+ 及 CoolQ HTTP API 插件 v4.2+。 + +## 它如何工作? NoneBot 的运行离不开酷 Q 和 CoolQ HTTP API 插件。酷 Q 扮演着「无头 QQ 客户端」的角色,它进行实际的消息、通知、请求的接收和发送,当酷 Q 收到消息时,它将这个消息包装为一个事件(通知和请求同理),并通过它自己的插件机制将事件传送给 CoolQ HTTP API 插件,后者再根据其配置中的 `post_url` 或 `ws_reverse_event_url` 等项来将事件发送至 NoneBot。 在 NoneBot 收到事件前,它底层的 aiocqhttp 实际已经先看到了事件,aiocqhttp 根据事件的类型信息,通知到 NoneBot 的相应函数。特别地,对于消息类型的事件,还将消息内容转换成了 `aiocqhttp.message.Message` 类型,以便处理。 -NoneBot 的事件处理函数收到通知后,对于不同类型的事件,再做相应的预处理和解析,然后调用对应的插件,并向其提供适合此类事件的 `Session` 对象。NoneBot 插件的编写者要做的,就是利用 `Session` 对象所提供的数据,在插件的处理函数中实现所需的功能。 +NoneBot 的事件处理函数收到通知后,对于不同类型的事件,再做相应的预处理和解析,然后调用对应的插件,并向其提供适合此类事件的会话(Session)对象。NoneBot 插件的编写者要做的,就是利用 Session 对象中提供的数据,在插件的处理函数中实现所需的功能。 -## 特点 +## 特色 + +- 基于异步 I/O +- 同时支持 HTTP 和反向 WebSocket 通信方式 +- 支持命令、自然语言处理器等多种插件形式 +- 提供直观的交互式会话接口 +- 命令和自然语言处理器提供权限控制机制 +- 支持在命令会话运行过程中切换到其它命令或自然语言处理器 +- 多种方式渲染要发送的消息内容,使对话足够自然 diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 50d4688f..c81855ea 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -1,3 +1,70 @@ # 开始使用 一切都安装成功后,你就已经做好了进行简单配置以运行一个最小的 NoneBot 实例的准备。 + +## 最小实例 + +使用你最熟悉的编辑器或 IDE,创建一个名为 `bot.py` 的文件,内容如下: + +```python +# bot.py + +import none + +if __name__ == '__main__': + none.init() + none.load_builtin_plugins() + none.run(host='127.0.0.1', port=8080) +``` + +`if __name__ == '__main__'` 语句块的这几行代码将依次: + +1. 使用默认配置初始化 NoneBot 包 +2. 加载 NoneBot 内置的插件 +3. 在地址 `127.0.0.1:8080` 运行 NoneBot + +在命令行使用如下命令即可运行这个 NoneBot 实例: + +```bash +python bot.py +``` + +## 配置 CoolQ HTTP API 插件 + +单纯运行 NoneBot 实例并不会产生任何效果,因为此刻酷 Q 这边还不知道 NoneBot 的存在,也就无法把消息发送给它,因此现在需要对 CoolQ HTTP API 插件做一个简单的配置来让它把消息等事件上报给 NoneBot。 + +如果你在之前已经按照 [安装](/guide/installation.md) 的建议使用默认配置运行了一次 CoolQ HTTP API 插件,此时酷 Q 的 `app\io.github.richardchien.coolqhttpapi\config\` 目录中应该已经有了一个名为 `.json` 的文件(`` 为你登录的 QQ 账号)。修改这个文件,**添加**如下配置项: + +```json +{ + "ws_reverse_api_url": "ws://127.0.0.1:8080/ws/api/", + "ws_reverse_event_url": "ws://127.0.0.1:8080/ws/event/", + "ws_reverse_reconnect_on_code_1000": true, + "use_ws_reverse": true +} +``` + +注意,这里的 `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/))。 + +修改之后,在酷 Q 的应用菜单中重启 CoolQ HTTP API 插件,或直接重启酷 Q,以使新的配置文件生效。 + +## 历史性的第一次对话 + +一旦新的配置文件正确生效之后,NoneBot 所在的控制台(如果正在运行的话)应该会输出类似下面的内容: + +``` +[2018-08-14 23:35:35,532] 127.0.0.1:8080 GET /ws/api/ ws 101 - 2736 +[2018-08-14 23:35:35,534] 127.0.0.1:8080 GET /ws/event/ ws 101 - 4682 +``` + +这表示 CoolQ HTTP API 插件已经成功地连接上了 NoneBot,与此同时,插件的日志文件中也会输出反向 WebSocket 连接成功的日志。 + +如果到这一步你没有看到上面这样的日志,请注意排查配置中的 IP 和端口是否确实可以访问。 + +现在,尝试向你的 QQ 机器人账号发送如下内容: + +``` +/echo 你好,世界 +``` + +到这里如果一切都没有问题,你应该会收到机器人给你回复了 `你好,世界`。这一历史性的对话标志着你已经成功地运行了一个 NoneBot 的最小实例,开始了编写更强大的 QQ 机器人的创意之旅! diff --git a/docs/guide/whats-happened.md b/docs/guide/whats-happened.md new file mode 100644 index 00000000..5bb62ad5 --- /dev/null +++ b/docs/guide/whats-happened.md @@ -0,0 +1,3 @@ +# 发生了什么? + +本节将带你理解上一节中的 NoneBot 最小实例是如何对你发送的消息做出反应的。