(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{460:function(t,a,s){"use strict";s.r(a);var e=s(55),n=Object(e.a)({},function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"术语表"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#术语表","aria-hidden":"true"}},[t._v("#")]),t._v(" 术语表")]),t._v(" "),s("h2",{attrs:{id:"onebot"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#onebot","aria-hidden":"true"}},[t._v("#")]),t._v(" OneBot")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/botuniverse/onebot",target:"_blank",rel:"noopener noreferrer"}},[t._v("OneBot"),s("OutboundLink")],1),t._v(" 是一个聊天机器人应用接口标准,旨在统一不同聊天平台上的机器人应用开发接口,使开发者只需编写一次代码即可应用到多种机器人平台。")]),t._v(" "),s("h2",{attrs:{id:"aiocqhttp"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#aiocqhttp","aria-hidden":"true"}},[t._v("#")]),t._v(" aiocqhttp")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/nonebot/aiocqhttp",target:"_blank",rel:"noopener noreferrer"}},[t._v("aiocqhttp"),s("OutboundLink")],1),t._v(" 是 OneBot 的一个 Python 异步 SDK,基于 asyncio,在 Quart 的基础上封装了与 OneBot 的网络交互。")]),t._v(" "),s("h2",{attrs:{id:"asyncio"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#asyncio","aria-hidden":"true"}},[t._v("#")]),t._v(" asyncio")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://docs.python.org/3/library/asyncio.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("asyncio"),s("OutboundLink")],1),t._v(" 是 Python 3.4 引入的一个模块,实际上它是 Python 中整个基于事件循环(Event Loop)的异步 I/O 编程机制。")]),t._v(" "),s("h2",{attrs:{id:"quart"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#quart","aria-hidden":"true"}},[t._v("#")]),t._v(" Quart")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://pgjones.gitlab.io/quart/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quart"),s("OutboundLink")],1),t._v(" 是一个基于异步 I/O 的 web 框架,支持 HTTP 和 WebSocket,是 aiocqhttp 的基础。")]),t._v(" "),s("h2",{attrs:{id:"异步-i-o"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#异步-i-o","aria-hidden":"true"}},[t._v("#")]),t._v(" 异步 I/O")]),t._v(" "),s("p",[t._v("有时直接称为「异步」,是一种对 I/O 操作的处理方式,它可以在单个线程内实现非阻塞 I/O,即在 I/O 操作进行时,仍可以调度程序的其它部分。在 Python 3.4+ 中,asyncio 模块提供的异步 I/O 调度的基本单位是「协程(Coroutine)」,通过 "),s("code",[t._v("await")]),t._v(" 关键字即可在进行 I/O 操作时将程序的执行权转移给其它协程,直到 I/O 结束再次被唤起。")]),t._v(" "),s("h2",{attrs:{id:"通信方式"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#通信方式","aria-hidden":"true"}},[t._v("#")]),t._v(" 通信方式")]),t._v(" "),s("p",[t._v("OneBot 中的一个术语,表示其与通过 web 技术编写的 OneBot 实现之间通信的手段。")]),t._v(" "),s("p",[t._v("目前 OneBot 规定了 HTTP (POST)、WebSocket、反向 WebSocket 几种通信方式,见 "),s("a",{attrs:{href:"https://github.com/botuniverse/onebot-11/tree/master/communication",target:"_blank",rel:"noopener noreferrer"}},[t._v("通信方式"),s("OutboundLink")],1),t._v(",NoneBot 支持其中的 HTTP 和反向 WebSocket。")]),t._v(" "),s("h2",{attrs:{id:"负载均衡"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#负载均衡","aria-hidden":"true"}},[t._v("#")]),t._v(" 负载均衡")]),t._v(" "),s("p",[t._v("多个 QQ 连接到同一个后端,使用同一套逻辑分别服务不同的用户和群,以防止单个 QQ 无法承受过大的消息量或被腾讯封禁。")]),t._v(" "),s("h2",{attrs:{id:"命令"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#命令","aria-hidden":"true"}},[t._v("#")]),t._v(" 命令")]),t._v(" "),s("p",[t._v("NoneBot 主要支持的插件形式之一,主要用于处理符合特定格式的、意图明确的用户消息,例如:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("天气 南京 明天\n/echo 喵喵喵\nnote.add 这是一条笔记\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br")])]),s("p",[t._v("上面的每行都符合一种固定的格式,消息的第一个空格左边是命令的名字(可能包含命令的起始符和分隔符),右边是命令所需的参数,可能以空格分隔,或是完全作为单个参数。")]),t._v(" "),s("p",[t._v("你可以将命令理解为操作系统中的命令行程序,NoneBot 执行命令就像在 Shell 中运行程序一样:")]),t._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("docker run hello-world\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("h2",{attrs:{id:"可交互命令"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#可交互命令","aria-hidden":"true"}},[t._v("#")]),t._v(" 可交互命令")]),t._v(" "),s("p",[t._v("能够和用户「对话」的命令,称为可交互命令。")]),t._v(" "),s("h2",{attrs:{id:"命令处理器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#命令处理器","aria-hidden":"true"}},[t._v("#")]),t._v(" 命令处理器")]),t._v(" "),s("p",[t._v("或称为「命令处理函数」,有时也简称为「命令」,是 NoneBot 插件中实际用于实现某个命令功能的函数。")]),t._v(" "),s("p",[t._v("通过 "),s("code",[t._v("nonebot.on_command")]),t._v(" 装饰器可以将一个函数注册为命令处理器,例如:")]),t._v(" "),s("div",{staticClass:"language-python line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" nonebot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" on_command\n\n@on_command"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'echo'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("echo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pass")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br")])]),s("h2",{attrs:{id:"自然语言处理器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#自然语言处理器","aria-hidden":"true"}},[t._v("#")]),t._v(" 自然语言处理器")]),t._v(" "),s("p",[t._v("或称为「自然语言处理函数」,是 NoneBot 插件中用于将用户的自然语言消息解析为命令和参数的函数。")]),t._v(" "),s("p",[t._v("通过 "),s("code",[t._v("nonebot.on_natural_language")]),t._v(" 装饰器可以将一个函数注册为自然语言处理器,例如:")]),t._v(" "),s("div",{staticClass:"language-python line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" nonebot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" on_natural_language\n\n@on_natural_language\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("_")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pass")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br")])]),s("h2",{attrs:{id:"事件处理器"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#事件处理器","aria-hidden":"true"}},[t._v("#")]),t._v(" 事件处理器")]),t._v(" "),s("p",[t._v("或称为「事件处理函数」,是 NoneBot 插件中用于处理通知(notice)和请求(request)的函数。")]),t._v(" "),s("p",[t._v("通过 "),s("code",[t._v("nonebot.on_notice")]),t._v(" 和 "),s("code",[t._v("nonebot.on_request")]),t._v(" 装饰器可以将一个函数注册为事件处理器,例如:")]),t._v(" "),s("div",{staticClass:"language-python line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" nonebot "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" on_notice\n\n@on_notice"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'group_increase'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("_")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("session"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("pass")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br")])]),s("h2",{attrs:{id:"会话-session"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#会话-session","aria-hidden":"true"}},[t._v("#")]),t._v(" 会话(Session)")]),t._v(" "),s("p",[t._v("是命令处理器、自然语言处理器等插件形式被调用时传入的一个包含有当前消息上下文的对象,它根据当前的插件形式的不同而不同,例如命令处理器拿到的 Session 是 "),s("code",[t._v("CommandSession")]),t._v(" 类型,而自然语言处理器拿到的是 "),s("code",[t._v("NLPSession")]),t._v(" 类型,不同类型的 Session 包含的属性不太一样,能进行的操作也有所区别。")]),t._v(" "),s("p",[t._v("特别地,命令的 Session 在需要和用户交互的情况下,会一直保留到下一次调用,以保证命令的多次交互能够共享数据。")]),t._v(" "),s("h2",{attrs:{id:"表达-expression"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#表达-expression","aria-hidden":"true"}},[t._v("#")]),t._v(" 表达(Expression)")]),t._v(" "),s("p",[t._v("是 NoneBot 支持的一种消息渲染的机制,可以通过随机选择或函数生成+字符串格式化的方式根据参数生成出自然的、不固定的消息回复,提升用户体验。")]),t._v(" "),s("p",[t._v("Expression 可以是一个 "),s("code",[t._v("str")]),t._v("、元素类型是 "),s("code",[t._v("str")]),t._v(" 的序列(一般为 "),s("code",[t._v("list")]),t._v(" 或 "),s("code",[t._v("tuple")]),t._v(")或返回类型为 "),s("code",[t._v("str")]),t._v(" 的 "),s("code",[t._v("Callable")]),t._v("。")]),t._v(" "),s("h2",{attrs:{id:"cq-码"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cq-码","aria-hidden":"true"}},[t._v("#")]),t._v(" CQ 码")]),t._v(" "),s("p",[t._v("是 OneBot 用来表示非文本消息的一种表示方法,形如 "),s("code",[t._v("[CQ:image,file=ABC.jpg]")]),t._v("。具体的格式规则,请参考 OneBot 文档的 "),s("a",{attrs:{href:"https://github.com/botuniverse/onebot-11/blob/master/message/string.md#cq-%E7%A0%81%E6%A0%BC%E5%BC%8F",target:"_blank",rel:"noopener noreferrer"}},[t._v("CQ 码"),s("OutboundLink")],1),t._v("。")]),t._v(" "),s("h2",{attrs:{id:"消息段"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#消息段","aria-hidden":"true"}},[t._v("#")]),t._v(" 消息段")]),t._v(" "),s("p",[t._v("是 OneBot 定义的、和 CQ 码可以互相转换的一个消息表示格式,具体表示方式见 "),s("a",{attrs:{href:"https://github.com/botuniverse/onebot-11/tree/master/message",target:"_blank",rel:"noopener noreferrer"}},[t._v("消息格式"),s("OutboundLink")],1),t._v("。")]),t._v(" "),s("p",[t._v("除了纯文本消息段之外,每一个消息段都和一个 CQ 码对应,例如下面这个消息段:")]),t._v(" "),s("div",{staticClass:"language-json line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"face"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"data"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"14"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br"),s("span",{staticClass:"line-number"},[t._v("2")]),s("br"),s("span",{staticClass:"line-number"},[t._v("3")]),s("br"),s("span",{staticClass:"line-number"},[t._v("4")]),s("br"),s("span",{staticClass:"line-number"},[t._v("5")]),s("br"),s("span",{staticClass:"line-number"},[t._v("6")]),s("br")])]),s("p",[t._v("对应的 CQ 码表示形式就是:")]),t._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[CQ:face,id=14]\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("具体的,NoneBot 中使用 "),s("code",[t._v("MessageSegment")]),t._v(" 类来表示消息段(导入自 aiocqhttp),例如,要创建上面这个消息段,可以使用如下代码:")]),t._v(" "),s("div",{staticClass:"language-python line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("seg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" MessageSegment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"face"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" data"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"14"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("p",[t._v("或:")]),t._v(" "),s("div",{staticClass:"language-python line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("seg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" MessageSegment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("face"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])]),t._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[t._v("1")]),s("br")])]),s("h2",{attrs:{id:"酷q"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#酷q","aria-hidden":"true"}},[t._v("#")]),t._v(" 酷Q")]),t._v(" "),s("p",[s("del",[s("a",{attrs:{href:"https://cqp.cc",target:"_blank",rel:"noopener noreferrer"}},[t._v("酷Q"),s("OutboundLink")],1),t._v(" 是一个易语言编写的 QQ 机器人平台,其本身没有任何具体的功能,只是负责实现 QQ 协议,并以 DLL 导出函数的形式向插件提供 API 和事件上报。")])]),t._v(" "),s("h2",{attrs:{id:"cqhttp-插件"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cqhttp-插件","aria-hidden":"true"}},[t._v("#")]),t._v(" CQHTTP 插件")]),t._v(" "),s("p",[s("del",[s("a",{attrs:{href:"https://cqhttp.cc/",target:"_blank",rel:"noopener noreferrer"}},[t._v("CQHTTP 插件"),s("OutboundLink")],1),t._v("即 CoolQ HTTP API 插件,是 酷Q 的一个第三方插件,用于将 酷Q 所提供的所有 DLL 接口转换为 HTTP 或 WebSocket 的 web 形式,从而使利用任意语言编写 酷Q 插件成为可能。")])]),t._v(" "),s("p",[s("del",[t._v("有时被称为 cqhttp、CQHTTP、酷Q HTTP API 等。")])])])},[],!1,null,null,null);a.default=n.exports}}]);