参考

通信

要使用 go-cqhttp, 用户需要启动 go-cqhttp, 此时 go-cqhttp 模拟 QQ 的客户端与 QQ 服务器进行通讯, 用户可以使用多种方式与 go-cqhttp 进行通信, 然后间接实现 QQ 操作.

通信方式描述
正向 HTTP客户端通过 HTTP 的方式向 go-cqhttp 发送请求, 这种通信方式仅用来执行 "主动操作", 例如发送消息, 并不可以实现接收消息
反向 HTTP客户端作为 HTTP 服务端, go-cqhttp 会主动向客户端发送 HTTP 请求, 这种通信方式用来实现 "被动操作", 例如接收消息, 并不能够实现发送消息
正向 WebSocket服务端会作为 WebSocket 服务端, 客户端连接, 然后与之通信, 由于 WebSocket 是双工的, 所以该方式既可以进行发送消息, 也可以进行接收消息
反向 WebSocket客户端需作为 WebSocket 服务端, go-cqhttp 会连接客户端, 然后与之通信, 通信的数据内容与正向 WebSocket 是一致的
关于上述通信方式, 在 go-cqhttp 的配置文件中均能够配置, 例如指定正向 HTTP 方式中, go-cqhttp 监听的地址与端口, 或者指定访问令牌

正向 HTTP

使用正向 HTTP 调用 API 时, 只需要向 /API终结点 发送请求即可, 传参时, 可以使用 GET 请求, 也可以使用 POST 请求, 关于请求的具体方式, 在文档的 API 部分中详细讲解

链接: go-cqhttp 帮助中心: API

反向 HTTP

使用反向 HTTP 时, go-cqhttp 会将 "上报" 通过 POST 请求的方式主动发送给客户端, 关于请求体的详细内容, 在文档的 Event 部分中有详细讲解

链接: go-cqhttp 帮助中心: Event

WebSocket

正向 WebSocket 和反向 WebSocket 操作无异, 关于数据格式, 也同样在 API 和 Event 部分有详细讲解

上报

上报, 或者叫做 "Event", 是 go-cqhttp 向客户端主动提供数据的方式, 例如当接收到消息, 群聊消息, 或私聊消息, 亦或是其他时间, 例如消息被撤回, 管理员被设置, 群聊精华消息, 好友添加请求, 诸如此类.

需要注意的是, 上报时, 会根据 go-cqhttp 的配置文件, 使用两种上报格式, arraystring, 它们表示的实际上是 go-cqhttp 在上报数据时, 对于消息链, 使用的是数组格式, 还是字符串格式, 这个在后面的消息部分中会详细讲解

关于上报的具体说明以及各种上报类型的数据声明, 可以在文档的 Event 部分看到: go-cqhttp 帮助中心: Event

动作

动作, 英文 "Action" , 或者叫做 "API", 是客户端调用 go-cqhttp 实现一些操作的方式, 例如发送消息, 撤回消息, 同意好友请求等等.

向 go-cqhttp 发送动作的方式在上述的通信部分中已有讲解, 大概是支持这些格式: GET 请求中的 URL 参数, POST 请求中使用 JSON, POST 请求中使用表单, 以及 WebSocket 中使用 JSON.

关于具体如何使用 Action, 在文档的 API 部分可以看到: go-cqhttp 帮助中心: API

消息

QQ 的消息实际上由一个个的 "部分" 构成, 例如 @群主 在这良辰佳节, 要不群主女装给大家康康呗 中首先是 at 群主的一个部分, 然后是一串文本. 我们称这样的消息叫做消息串.

消息串有两种表达方式, 一种是数组格式, 是一个 JSON 数组, 然后消息的每一个部分都是数组的一个元素, 另一种是纯文本格式, 通过特殊的编码将一个消息串存放到一个字符串中, 这种编码叫做 CQ 码.

数组格式消息

数组消息的每一个元素, 是各样的格式

{
    "type": "消息类型",
    "data": {
        "数据参数名": "数据参数名"
    }
}
1
2
3
4
5
6

组装成数组, 就是这样:

[
    {
        "type": "at",
        "data": {
            "qq": 123456
        }
    },
    {
        "type": "text",
        "data": {
            "text": "早上好啊"
        }
    }
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14

在文本类型的消息串中, 普通消息是直接被表示出来的, 在 JSON 数组格式的消息串中, 表示一个文本消息内容, 格式如下:

{
    "type": "text",
    "data": {
        "text": "文本值"
    }
}
1
2
3
4
5
6

字符串格式消息

字符串格式消息也就是使用 CQ 码将每一个消息的特殊内容部分编码为 CQ 码格式, 然后嵌入到字符串中, 例如这样:

[CQ:face,id=178]看看我刚拍的照片[CQ:image,file=123.jpg]
1

上面的消息包含: 一个 QQ 表情, 一串文本, 一个图片.

关于 CQ 码的详细介绍, 参阅: go-cqhttp 帮助中心: CQ 码