360 lines
5.8 KiB
Markdown
360 lines
5.8 KiB
Markdown
# 消息
|
||
|
||
### 接受消息
|
||
|
||
被动接受的消息对象,由微信服务器发出
|
||
|
||
消息对象通过绑定在`bot`上的消息回调函数获取
|
||
|
||
```go
|
||
bot.MessageHandler = func (msg *openwechat.Message) {
|
||
if msg.IsText() && msg.Content == "ping" {
|
||
msg.ReplyText("pong")
|
||
}
|
||
}
|
||
```
|
||
|
||
以下简写为`msg`
|
||
|
||
#### 消息内容
|
||
|
||
```go
|
||
msg.Content // 获取消息内容
|
||
```
|
||
|
||
通过访问`Content`属性可直接获取消息内容
|
||
|
||
由于消息分为很多种类型,它们都共用`Content`属性。一般当消息类型为文本类型的时候,我们才会去访问`Content`属性。
|
||
|
||
#### 消息类型判断
|
||
|
||
下面的判断消息类型的方法均返回`bool`值
|
||
|
||
##### 文本消息
|
||
|
||
```go
|
||
msg.IsText()
|
||
```
|
||
|
||
##### 图片消息
|
||
|
||
```go
|
||
msg.IsPicture()
|
||
```
|
||
|
||
##### 位置消息
|
||
|
||
```go
|
||
msg.IsLocation()
|
||
```
|
||
|
||
##### 语音消息
|
||
|
||
```go
|
||
msg.IsVoice()
|
||
```
|
||
|
||
##### 是否为好友添加请求
|
||
|
||
```go
|
||
msg.IsFriendAdd()
|
||
```
|
||
|
||
##### 名片消息
|
||
|
||
```go
|
||
msg.IsCard()
|
||
```
|
||
|
||
##### 视频消息
|
||
|
||
```go
|
||
msg.IsVideo()
|
||
```
|
||
|
||
##### 是否被撤回
|
||
|
||
```go
|
||
msg.IsRecalled()
|
||
```
|
||
|
||
##### 系统消息
|
||
|
||
```go
|
||
msg.IsSystem()
|
||
```
|
||
|
||
##### 收到微信转账
|
||
|
||
```go
|
||
msg.IsTransferAccounts()
|
||
```
|
||
|
||
##### 发出红包(自己发出)
|
||
|
||
```go
|
||
msg.IsSendRedPacket()
|
||
```
|
||
|
||
##### 收到红包
|
||
|
||
```go
|
||
msg.IsReceiveRedPacket()
|
||
```
|
||
|
||
但是不能领取!
|
||
|
||
##### 判断是否为拍一拍
|
||
|
||
```go
|
||
msg.IsIsPaiYiPai() // 拍一拍消息
|
||
msg.IsTickled()
|
||
```
|
||
|
||
##### 判断是否拍了拍自己
|
||
```go
|
||
msg.IsTickledMe()
|
||
```
|
||
|
||
##### 判断是否有新人加入群聊
|
||
|
||
```go
|
||
msg.IsJoinGroup()
|
||
```
|
||
|
||
#### 获取消息的发送者
|
||
|
||
```go
|
||
sender, err := msg.Sender()
|
||
```
|
||
|
||
如果是群聊消息,该方法返回的是群聊对象(需要自己将`User`转换为`Group`对象)
|
||
|
||
#### 获取消息的接受者
|
||
|
||
```go
|
||
receiver, err := msg.Receiver()
|
||
```
|
||
|
||
#### 获取消息在群里面的发送者
|
||
|
||
```go
|
||
sender, err := msg.SenderInGroup()
|
||
```
|
||
|
||
获取群聊中具体发消息的用户,前提该消息必须来自群聊。
|
||
|
||
#### 是否由自己发送
|
||
|
||
```go
|
||
msg.IsSendBySelf()
|
||
```
|
||
|
||
#### 是否为拍一拍
|
||
|
||
```go
|
||
msg.IsTickled()
|
||
```
|
||
|
||
#### 消息是否由好友发出
|
||
|
||
```go
|
||
msg.IsSendByFriend()
|
||
```
|
||
|
||
#### 消息是否由群聊发出
|
||
|
||
```go
|
||
msg.IsSendByGroup()
|
||
```
|
||
|
||
#### 回复文本消息
|
||
|
||
```go
|
||
msg.ReplyText("hello")
|
||
```
|
||
|
||
#### 回复图片消息
|
||
|
||
```go
|
||
img, _ := os.Open("your file path")
|
||
defer img.Close()
|
||
msg.ReplyImage(img)
|
||
```
|
||
|
||
#### 回复文件消息
|
||
|
||
```go
|
||
file, _ := os.Open("your file path")
|
||
defer file.Close()
|
||
msg.ReplyFile(file)
|
||
```
|
||
|
||
#### 获取消息里的其他信息
|
||
|
||
##### 名片消息
|
||
|
||
```go
|
||
card, err := msg.Card()
|
||
```
|
||
|
||
该方法调用的前提为`msg.IsCard()`返回为`true`
|
||
|
||
名片消息可以获取该名片中的微信号
|
||
|
||
```go
|
||
alias := card.Alias
|
||
```
|
||
|
||
`card`结构
|
||
|
||
```go
|
||
// 名片消息内容
|
||
type Card struct {
|
||
XMLName xml.Name `xml:"msg"`
|
||
ImageStatus int `xml:"imagestatus,attr"`
|
||
Scene int `xml:"scene,attr"`
|
||
Sex int `xml:"sex,attr"`
|
||
Certflag int `xml:"certflag,attr"`
|
||
BigHeadImgUrl string `xml:"bigheadimgurl,attr"`
|
||
SmallHeadImgUrl string `xml:"smallheadimgurl,attr"`
|
||
UserName string `xml:"username,attr"`
|
||
NickName string `xml:"nickname,attr"`
|
||
ShortPy string `xml:"shortpy,attr"`
|
||
Alias string `xml:"alias,attr"` // Note: 这个是名片用户的微信号
|
||
Province string `xml:"province,attr"`
|
||
City string `xml:"city,attr"`
|
||
Sign string `xml:"sign,attr"`
|
||
Certinfo string `xml:"certinfo,attr"`
|
||
BrandIconUrl string `xml:"brandIconUrl,attr"`
|
||
BrandHomeUr string `xml:"brandHomeUr,attr"`
|
||
BrandSubscriptConfigUrl string `xml:"brandSubscriptConfigUrl,attr"`
|
||
BrandFlags string `xml:"brandFlags,attr"`
|
||
RegionCode string `xml:"regionCode,attr"`
|
||
}
|
||
```
|
||
|
||
##### 获取已撤回的消息
|
||
|
||
```go
|
||
revokeMsg, err := msg.RevokeMsg()
|
||
```
|
||
|
||
该方法调用成功的前提是`msg.IsRecalled()`返回为`true`
|
||
|
||
撤回消息的结构
|
||
|
||
```go
|
||
type RevokeMsg struct {
|
||
SysMsg xml.Name `xml:"sysmsg"`
|
||
Type string `xml:"type,attr"`
|
||
RevokeMsg struct {
|
||
OldMsgId int64 `xml:"oldmsgid"`
|
||
MsgId int64 `xml:"msgid"`
|
||
Session string `xml:"session"`
|
||
ReplaceMsg string `xml:"replacemsg"`
|
||
} `xml:"revokemsg"`
|
||
}
|
||
```
|
||
|
||
#### 同意好友请求
|
||
|
||
```go
|
||
friend, err := msg.Agree()
|
||
// msg.Agree("我同意了")
|
||
```
|
||
|
||
返回的friend即刚添加的好友对象
|
||
|
||
该方法调用成功的前提是`msg.IsFriendAdd()`返回为`true`
|
||
|
||
#### 设置为已读
|
||
|
||
```go
|
||
msg.AsRead()
|
||
```
|
||
|
||
该当前消息设置为已读
|
||
|
||
#### 设置消息的上下文
|
||
|
||
用于多个消息处理函数之间的通信,并且是协程安全的。
|
||
|
||
##### 设置值
|
||
|
||
```go
|
||
msg.Set("hello", "world")
|
||
```
|
||
|
||
##### 获取值
|
||
|
||
```go
|
||
value, exist := msg.Get("hello")
|
||
```
|
||
|
||
### 已发送消息
|
||
|
||
已发送消息指当前用户发送出去的消息
|
||
|
||
每次调用发送消息的函数都会返回一个`SentMessage`对象
|
||
|
||
如
|
||
|
||
```go
|
||
sentMsg, err := msg.ReplyText("hello") // 通过回复消息获取
|
||
// sentMsg, err := friend.SendText("hello") // 向好友对象发送消息获取
|
||
// and so on
|
||
```
|
||
|
||
#### 撤回消息
|
||
|
||
撤回刚刚发送的消息,撤回消息的有效时间为2分钟,超过了这个时间则无法撤回
|
||
|
||
```go
|
||
sentMsg.Revoke()
|
||
```
|
||
|
||
#### 判断是否可以撤回
|
||
|
||
```go
|
||
sentMsg.CanRevoke()
|
||
```
|
||
|
||
#### 转发给好友
|
||
|
||
```go
|
||
sentMsg.ForwardToFriends(friend1, friend2)
|
||
```
|
||
|
||
将刚发送的消息转发给好友
|
||
|
||
#### 转发给群聊
|
||
|
||
```go
|
||
sentMsg.ForwardToGroups(group1, group2)
|
||
```
|
||
|
||
将刚发送的消息转发给群聊
|
||
|
||
### Emoji表情
|
||
|
||
openwechat提供了微信全套`emoji`表情的支持
|
||
|
||
`emoji`表情全部维护在`openwechat.Emoji`结构体上
|
||
|
||
emoji表情可以通过发送`Text`类型的函数发送
|
||
|
||
如
|
||
|
||
```go
|
||
firend.SendText(openwechat.Emoji.Doge) // 发送狗头表情
|
||
msg.ReplyText(openwechat.Emoji.Awesome) // 发送666的表情
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|