Merge pull request #125 from eatmoreapple/process-message-response

优化消息结果处理
This commit is contained in:
多吃点苹果 2022-11-13 00:18:44 +08:00 committed by GitHub
commit 28e1fded99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 128 additions and 74 deletions

View File

@ -1,5 +1,7 @@
package openwechat
import "errors"
type Ret int
const (
@ -22,6 +24,9 @@ func (b BaseResponse) Ok() bool {
return b.Ret == 0
}
func (b BaseResponse) Error() string {
return b.Ret.String()
func (b BaseResponse) Err() error {
if b.Ok() || len(b.ErrMsg) == 0 {
return nil
}
return errors.New(b.ErrMsg)
}

177
caller.go
View File

@ -4,7 +4,7 @@ import (
"bytes"
"encoding/json"
"errors"
"net/http"
"io"
"net/url"
"os"
)
@ -33,7 +33,7 @@ func (c *Caller) GetLoginUUID() (string, error) {
return "", err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var buffer bytes.Buffer
if _, err := buffer.ReadFrom(resp.Body); err != nil {
@ -54,7 +54,7 @@ func (c *Caller) CheckLogin(uuid string) (*CheckLoginResponse, error) {
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var buffer bytes.Buffer
if _, err := buffer.ReadFrom(resp.Body); err != nil {
@ -86,11 +86,11 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) {
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var loginInfo LoginInfo
// xml结构体序列化储存
if err := scanXml(resp, &loginInfo); err != nil {
if err := scanXml(resp.Body, &loginInfo); err != nil {
return nil, err
}
if !loginInfo.Ok() {
@ -106,8 +106,8 @@ func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) {
return nil, err
}
var webInitResponse WebInitResponse
defer resp.Body.Close()
if err := scanJson(resp, &webInitResponse); err != nil {
defer func() { _ = resp.Body.Close() }()
if err := scanJson(resp.Body, &webInitResponse); err != nil {
return nil, err
}
return &webInitResponse, nil
@ -120,12 +120,12 @@ func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon
return err
}
var item struct{ BaseResponse BaseResponse }
defer resp.Body.Close()
if err := scanJson(resp, &item); err != nil {
defer func() { _ = resp.Body.Close() }()
if err := scanJson(resp.Body, &item); err != nil {
return err
}
if !item.BaseResponse.Ok() {
return item.BaseResponse
return item.BaseResponse.Err()
}
return nil
}
@ -136,7 +136,7 @@ func (c *Caller) SyncCheck(request *BaseRequest, info *LoginInfo, response *WebI
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var buffer bytes.Buffer
if _, err := buffer.ReadFrom(resp.Body); err != nil {
return nil, err
@ -156,13 +156,13 @@ func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) {
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var item WebWxContactResponse
if err := scanJson(resp, &item); err != nil {
if err := scanJson(resp.Body, &item); err != nil {
return nil, err
}
if !item.BaseResponse.Ok() {
return nil, item.BaseResponse
return nil, item.BaseResponse.Err()
}
return item.MemberList, nil
}
@ -174,13 +174,13 @@ func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Me
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var item WebWxBatchContactResponse
if err := scanJson(resp, &item); err != nil {
if err := scanJson(resp.Body, &item); err != nil {
return nil, err
}
if !item.BaseResponse.Ok() {
return nil, item.BaseResponse
return nil, item.BaseResponse.Err()
}
return item.ContactList, nil
}
@ -191,9 +191,9 @@ func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var webWxSyncResponse WebWxSyncResponse
if err := scanJson(resp, &webWxSyncResponse); err != nil {
if err := scanJson(resp.Body, &webWxSyncResponse); err != nil {
return nil, err
}
return &webWxSyncResponse, nil
@ -202,7 +202,12 @@ func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info
// WebWxSendMsg 发送消息接口
func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRequest) (*SentMessage, error) {
resp, err := c.Client.WebWxSendMsg(msg, info, request)
return getSuccessSentMessage(msg, resp, err)
if err != nil {
return nil, err
}
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.SentMessage(msg)
}
// WebWxOplog 修改用户备注接口
@ -211,7 +216,9 @@ func (c *Caller) WebWxOplog(request *BaseRequest, remarkName, toUserName string)
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*UploadResponse, error) {
@ -221,15 +228,15 @@ func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInf
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var item UploadResponse
if err := scanJson(resp, &item); err != nil {
if err := scanJson(resp.Body, &item); err != nil {
return &item, err
}
if !item.BaseResponse.Ok() {
return &item, item.BaseResponse
return &item, item.BaseResponse.Err()
}
if len(item.MediaId) == 0 {
return &item, errors.New("upload failed")
@ -240,15 +247,23 @@ func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInf
// WebWxSendImageMsg 发送图片消息接口
func (c *Caller) WebWxSendImageMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
// 首先尝试上传图片
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
var mediaId string
{
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
if err != nil {
return nil, err
}
mediaId = resp.MediaId
}
// 构造新的图片类型的信息
msg := NewMediaSendMessage(MsgTypeImage, fromUserName, toUserName, mediaId)
// 发送图片信息
resp, err := c.Client.WebWxSendMsgImg(msg, request, info)
if err != nil {
return nil, err
}
// 构造新的图片类型的信息
msg := NewMediaSendMessage(MsgTypeImage, fromUserName, toUserName, resp.MediaId)
// 发送图片信息
resp1, err := c.Client.WebWxSendMsgImg(msg, request, info)
return getSuccessSentMessage(msg, resp1, err)
parser := MessageResponseParser{resp.Body}
return parser.SentMessage(msg)
}
func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
@ -268,20 +283,33 @@ func (c *Caller) WebWxSendFile(file *os.File, req *BaseRequest, info *LoginInfo,
}
func (c *Caller) WebWxSendVideoMsg(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*SentMessage, error) {
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
var mediaId string
{
resp, err := c.UploadMedia(file, request, info, fromUserName, toUserName)
if err != nil {
return nil, err
}
mediaId = resp.MediaId
}
// 构造新的图片类型的信息
msg := NewMediaSendMessage(MsgTypeVideo, fromUserName, toUserName, mediaId)
resp, err := c.Client.WebWxSendVideoMsg(request, msg)
if err != nil {
return nil, err
}
// 构造新的图片类型的信息
msg := NewMediaSendMessage(MsgTypeVideo, fromUserName, toUserName, resp.MediaId)
resp2, err := c.Client.WebWxSendVideoMsg(request, msg)
return getSuccessSentMessage(msg, resp2, err)
parser := MessageResponseParser{resp.Body}
return parser.SentMessage(msg)
}
// WebWxSendAppMsg 发送媒体消息
func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest) (*SentMessage, error) {
resp, err := c.Client.WebWxSendAppMsg(msg, req)
return getSuccessSentMessage(msg, resp, err)
if err != nil {
return nil, err
}
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.SentMessage(msg)
}
// Logout 用户退出
@ -290,7 +318,9 @@ func (c *Caller) Logout(info *LoginInfo) error {
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// AddFriendIntoChatRoom 拉好友入群
@ -302,7 +332,9 @@ func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// RemoveFriendFromChatRoom 从群聊中移除用户
@ -314,7 +346,9 @@ func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, gro
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// WebWxVerifyUser 同意加好友请求
@ -323,7 +357,9 @@ func (c *Caller) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyCon
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// WebWxRevokeMsg 撤回消息操作
@ -332,7 +368,9 @@ func (c *Caller) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) error {
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// WebWxStatusAsRead 将消息设置为已读
@ -341,7 +379,9 @@ func (c *Caller) WebWxStatusAsRead(request *BaseRequest, info *LoginInfo, msg *M
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// WebWxRelationPin 将联系人是否置顶
@ -350,7 +390,9 @@ func (c *Caller) WebWxRelationPin(request *BaseRequest, user *User, op uint8) er
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// WebWxPushLogin 免扫码登陆接口
@ -359,7 +401,7 @@ func (c *Caller) WebWxPushLogin(uin int) (*PushLoginResponse, error) {
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var item PushLoginResponse
if err := json.NewDecoder(resp.Body).Decode(&item); err != nil {
return nil, err
@ -373,7 +415,7 @@ func (c *Caller) WebWxCreateChatRoom(request *BaseRequest, info *LoginInfo, topi
if err != nil {
return nil, err
}
defer resp.Body.Close()
defer func() { _ = resp.Body.Close() }()
var item struct {
BaseResponse BaseResponse
ChatRoomName string
@ -382,7 +424,7 @@ func (c *Caller) WebWxCreateChatRoom(request *BaseRequest, info *LoginInfo, topi
return nil, err
}
if !item.BaseResponse.Ok() {
return nil, item.BaseResponse
return nil, item.BaseResponse.Err()
}
group := Group{User: &User{UserName: item.ChatRoomName}}
return &group, nil
@ -394,7 +436,9 @@ func (c *Caller) WebWxRenameChatRoom(request *BaseRequest, info *LoginInfo, newT
if err != nil {
return err
}
return parseBaseResponseError(resp)
defer func() { _ = resp.Body.Close() }()
parser := MessageResponseParser{resp.Body}
return parser.Err()
}
// SetMode 设置Client的模式
@ -402,41 +446,40 @@ func (c *Client) SetMode(mode Mode) {
c.mode = mode
}
// 处理响应返回的结果是否正常
func parseBaseResponseError(resp *http.Response) error {
defer resp.Body.Close()
// MessageResponseParser 消息响应解析器
type MessageResponseParser struct {
Reader io.Reader
}
// Err 解析错误
func (p *MessageResponseParser) Err() error {
var item struct{ BaseResponse BaseResponse }
if err := scanJson(resp, &item); err != nil {
if err := scanJson(p.Reader, &item); err != nil {
return err
}
if !item.BaseResponse.Ok() {
return item.BaseResponse
return item.BaseResponse.Err()
}
return nil
}
func parseMessageResponseError(resp *http.Response, msg *SentMessage) error {
defer resp.Body.Close()
// MsgID 解析消息ID
func (p *MessageResponseParser) MsgID() (string, error) {
var messageResp MessageResponse
if err := scanJson(resp, &messageResp); err != nil {
return err
if err := scanJson(p.Reader, &messageResp); err != nil {
return "", err
}
if !messageResp.BaseResponse.Ok() {
return messageResp.BaseResponse
return "", messageResp.BaseResponse.Err()
}
// 发送成功之后将msgId赋值给SendMessage
msg.MsgId = messageResp.MsgID
return nil
return messageResp.MsgID, nil
}
func getSuccessSentMessage(msg *SendMessage, resp *http.Response, err error) (*SentMessage, error) {
// SentMessage 返回 SentMessage
func (p *MessageResponseParser) SentMessage(msg *SendMessage) (*SentMessage, error) {
msgID, err := p.MsgID()
if err != nil {
return nil, err
}
sendSuccessMsg := &SentMessage{SendMessage: msg}
err = parseMessageResponseError(resp, sendSuccessMsg)
return sendSuccessMsg, err
return &SentMessage{MsgId: msgID, SendMessage: msg}, nil
}

View File

@ -451,7 +451,12 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in
}
// 如果不是最后一次, 解析有没有错误
if !isLastTime {
if err := parseBaseResponseError(resp); err != nil {
parser := MessageResponseParser{Reader: resp.Body}
if err = parser.Err(); err != nil {
_ = resp.Body.Close()
return nil, err
}
if err = resp.Body.Close(); err != nil {
return nil, err
}
}

View File

@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"encoding/xml"
"io"
"math/rand"
"mime/multipart"
"net/http"
@ -88,12 +89,12 @@ func getMessageType(filename string) string {
return doc
}
func scanXml(resp *http.Response, v interface{}) error {
return xml.NewDecoder(resp.Body).Decode(v)
func scanXml(reader io.Reader, v interface{}) error {
return xml.NewDecoder(reader).Decode(v)
}
func scanJson(resp *http.Response, v interface{}) error {
return json.NewDecoder(resp.Body).Decode(v)
func scanJson(reader io.Reader, v interface{}) error {
return json.NewDecoder(reader).Decode(v)
}
func stringToByte(s string) []byte {