[TOC]
# Rboot 消息
rboot 的消息类似于邮件消息,它包含了`接收者` `消息来源` `发送者` `消息头信息` `消息主体`。
## 消息 Message
```go
// Message 表示一个消息的结构
type Message struct {
To string // 消息接收者
From string // 消息来源
Sender string // 发送者
Header Header // 头信息
Body io.Reader // 消息主体
}
```
> 其中 `消息接收者` `消息来源`和`发送者`传递的一般都是用户ID,如果需要用户其他信息可以在 `消息头信息` 中传递。
### 创建一条文本消息
框架提供了两种方法创建文本消息:
- `NewMessages`:创建一组消息,参数为消息内容和消息接收者,它返回的是 `[]*Message` ,当在脚本中返回一条文本消息时非常有用。
- `NewMessage`:创建一条消息,参数为消息内容和消息接收者,它返回的是 `*Message`,你可以使用返回的msg为消息添加需要的信息。
### 获取消息主体文本信息
假设消息体为 `msg`
- `String` 方法:读取消息内容方法,返回的是 `string`类型,使用:msg.String()
- `Bytes` 方法:读取消息内容方法,返回的是 `[]byte`类型,使用:msg.Bytes()
### 为消息设置抄送
当我们需要将消息发送给多个人的时候,我们可以为消息设置抄送。
设置抄送的方式有两种:
1. 使用框架提供的 `SetCc` 方法: msg.SetCc("uid1", "uid2" ...)
2. 使用 `Header` 的 `Set` 方法:msg.Header.Add("Cc", "uid1,uid2"),用户ID中间以`英文“,”`隔开
> 抄送人应该为用户ID
当脚本返回消息中带有抄送信息时,机器人会自动将消息发给抄送人。
### 头信息Header
`Header` 头信息是表示消息标头中的键-值对。
你可以使用它为消息附带关键信息和附加信息。比如可以附带消息验证信息或消息类型,方便脚本或消息转接器使用。
`Header` 提供了 `Add` `Set` `Get` `Del` 方法,具体方法见 [godoc](https://godoc.org/github.com/ghaoo/rboot#Header)
> Header 可能会用到的键:
> - `cc` 抄送人
> - `msgtype` 消息类型
> - `file` 发送的文件
## HTTP 消息监听
rboot 提供了一个监听入站消息的ResultFul API `incoming`,开发者可以使用此api给机器人推送消息。api接收一个json格式的请求,字段与消息`Message`相同。
### 配置
- `ROBOT_INCOMING_SECRET`:入站消息加密秘钥
### 入站消息认证
在此模式下推送消息需要签名认证,签名计算方法如下:
1. 获取系统当前时间,格式为`2006-01-02 15:04:05`
2. 将参数`系统时间` `入站消息加密秘钥` `消息内容` 按照 `时间\n加密秘钥\n消息内容` 排列,获取需要加密的字符串
3. 使用 sha256 将上面的字符串加密获取加密后的字符串
4. 将 sha256 加密后的字符串使用 base64 编码获取最终的签名值
### 发送消息
**请求表头**:
名称 | 必须 | 含义
- | :-: | :-:
sign|是|认证签名
datetime|是|系统时间
to|是|接收者ID
from|否|消息来源
sender|否|发送者
... ...||
机器人会自动将请求表头中的 `to` `from` `sender` 解析到消息体中,并将请求标头加入消息的标头中。
**请求内容**
请求内容只支持文本消息用于识别命令。