优化消息结果处理
This commit is contained in:
parent
1cab9bf5a8
commit
bf8bed01d2
@ -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
177
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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user