From bf8bed01d2e0a480fa49860d3504a46facaeaff4 Mon Sep 17 00:00:00 2001 From: eatmoreapple Date: Sun, 13 Nov 2022 00:17:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B6=88=E6=81=AF=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base_response.go | 9 ++- caller.go | 177 +++++++++++++++++++++++++++++------------------ client.go | 7 +- parser.go | 9 +-- 4 files changed, 128 insertions(+), 74 deletions(-) diff --git a/base_response.go b/base_response.go index e6ff32b..5c6590d 100644 --- a/base_response.go +++ b/base_response.go @@ -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) } diff --git a/caller.go b/caller.go index 25fd59a..135e19a 100644 --- a/caller.go +++ b/caller.go @@ -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 } diff --git a/client.go b/client.go index 54ebb18..0c32024 100644 --- a/client.go +++ b/client.go @@ -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 } } diff --git a/parser.go b/parser.go index 9462a84..fe86f92 100644 --- a/parser.go +++ b/parser.go @@ -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 {