diff --git a/caller.go b/caller.go index 565f59e..9131da1 100644 --- a/caller.go +++ b/caller.go @@ -1,6 +1,7 @@ package openwechat import ( + "bytes" "errors" "net/http" "net/url" @@ -26,17 +27,19 @@ func DefaultCaller() *Caller { // 获取登录的uuid func (c *Caller) GetLoginUUID() (string, error) { - resp := NewReturnResponse(c.Client.GetLoginUUID()) - if resp.Err() != nil { - return "", resp.Err() - } - defer resp.Body.Close() - data, err := resp.ReadAll() + resp, err := c.Client.GetLoginUUID() if err != nil { return "", err } + + defer resp.Body.Close() + + var buffer bytes.Buffer + if _, err := buffer.ReadFrom(resp.Body); err != nil { + return "", err + } // 正则匹配uuid字符串 - results := uuidRegexp.FindSubmatch(data) + results := uuidRegexp.FindSubmatch(buffer.Bytes()) if len(results) != 2 { // 如果没有匹配到,可能微信的接口做了修改,或者当前机器的ip被加入了黑名单 return "", errors.New("uuid does not match") @@ -46,23 +49,24 @@ func (c *Caller) GetLoginUUID() (string, error) { // 检查是否登录成功 func (c *Caller) CheckLogin(uuid string) (*CheckLoginResponse, error) { - resp := NewReturnResponse(c.Client.CheckLogin(uuid)) - if resp.Err() != nil { - return nil, resp.Err() + resp, err := c.Client.CheckLogin(uuid) + if err != nil { + return nil, err } defer resp.Body.Close() - data, err := resp.ReadAll() - if err != nil { + + var buffer bytes.Buffer + if _, err := buffer.ReadFrom(resp.Body); err != nil { return nil, err } // 正则匹配检测的code // 具体code参考global.go - results := statusCodeRegexp.FindSubmatch(data) + results := statusCodeRegexp.FindSubmatch(buffer.Bytes()) if len(results) != 2 { return nil, errors.New("error status code match") } code := string(results[1]) - return &CheckLoginResponse{Code: code, Raw: data}, nil + return &CheckLoginResponse{Code: code, Raw: buffer.Bytes()}, nil } // 获取登录信息 @@ -83,19 +87,19 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) { } c.Client.domain = domain - - resp := NewReturnResponse(c.Client.GetLoginInfo(path.String())) - if resp.Err() != nil { - uErr, ok := resp.Err().(*url.Error) + resp, err := c.Client.GetLoginInfo(path.String()) + if err != nil { + uErr, ok := err.(*url.Error) if ok && (uErr.Err.Error() == missLocationHeader.Error()) { return nil, loginForbiddenError } - return nil, resp.Err() + return nil, err } defer resp.Body.Close() + var loginInfo LoginInfo // xml结构体序列化储存 - if err := resp.ScanXML(&loginInfo); err != nil { + if err := scanXml(resp, &loginInfo); err != nil { return nil, err } if !loginInfo.Ok() { @@ -106,13 +110,13 @@ func (c *Caller) GetLoginInfo(body []byte) (*LoginInfo, error) { // 获取初始化信息 func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) { - resp := NewReturnResponse(c.Client.WebInit(request)) - if resp.Err() != nil { - return nil, resp.Err() + resp, err := c.Client.WebInit(request) + if err != nil { + return nil, err } var webInitResponse WebInitResponse defer resp.Body.Close() - if err := resp.ScanJSON(&webInitResponse); err != nil { + if err := scanJson(resp, &webInitResponse); err != nil { return nil, err } return &webInitResponse, nil @@ -120,13 +124,13 @@ func (c *Caller) WebInit(request *BaseRequest) (*WebInitResponse, error) { // 通知手机已登录 func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitResponse, info *LoginInfo) error { - resp := NewReturnResponse(c.Client.WebWxStatusNotify(request, response, info)) - if resp.Err() != nil { - return resp.Err() + resp, err := c.Client.WebWxStatusNotify(request, response, info) + if err != nil { + return err } var item struct{ BaseResponse BaseResponse } defer resp.Body.Close() - if err := resp.ScanJSON(&item); err != nil { + if err := scanJson(resp, &item); err != nil { return err } if !item.BaseResponse.Ok() { @@ -137,16 +141,16 @@ func (c *Caller) WebWxStatusNotify(request *BaseRequest, response *WebInitRespon // 异步获取是否有新的消息 func (c *Caller) SyncCheck(info *LoginInfo, response *WebInitResponse) (*SyncCheckResponse, error) { - resp := NewReturnResponse(c.Client.SyncCheck(info, response)) - if resp.Err() != nil { - return nil, resp.Err() - } - defer resp.Body.Close() - data, err := resp.ReadAll() + resp, err := c.Client.SyncCheck(info, response) if err != nil { return nil, err } - results := syncCheckRegexp.FindSubmatch(data) + defer resp.Body.Close() + var buffer bytes.Buffer + if _, err := buffer.ReadFrom(resp.Body); err != nil { + return nil, err + } + results := syncCheckRegexp.FindSubmatch(buffer.Bytes()) if len(results) != 3 { return nil, errors.New("parse sync key failed") } @@ -157,13 +161,13 @@ func (c *Caller) SyncCheck(info *LoginInfo, response *WebInitResponse) (*SyncChe // 获取所有的联系人 func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) { - resp := NewReturnResponse(c.Client.WebWxGetContact(info)) - if resp.Err() != nil { - return nil, resp.Err() + resp, err := c.Client.WebWxGetContact(info) + if err != nil { + return nil, err } defer resp.Body.Close() var item WebWxContactResponse - if err := resp.ScanJSON(&item); err != nil { + if err := scanJson(resp, &item); err != nil { return nil, err } if !item.BaseResponse.Ok() { @@ -175,13 +179,13 @@ func (c *Caller) WebWxGetContact(info *LoginInfo) (Members, error) { // 获取联系人的详情 // 注: Members参数的长度不要大于50 func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Members, error) { - resp := NewReturnResponse(c.Client.WebWxBatchGetContact(members, request)) - if resp.Err() != nil { - return nil, resp.Err() + resp, err := c.Client.WebWxBatchGetContact(members, request) + if err != nil { + return nil, err } defer resp.Body.Close() var item WebWxBatchContactResponse - if err := resp.ScanJSON(&item); err != nil { + if err := scanJson(resp, &item); err != nil { return nil, err } if !item.BaseResponse.Ok() { @@ -192,13 +196,13 @@ func (c *Caller) WebWxBatchGetContact(members Members, request *BaseRequest) (Me // 获取新的消息接口 func (c *Caller) WebWxSync(request *BaseRequest, response *WebInitResponse, info *LoginInfo) (*WebWxSyncResponse, error) { - resp := NewReturnResponse(c.Client.WebWxSync(request, response, info)) - if resp.Err() != nil { - return nil, resp.Err() + resp, err := c.Client.WebWxSync(request, response, info) + if err != nil { + return nil, err } defer resp.Body.Close() var webWxSyncResponse WebWxSyncResponse - if err := resp.ScanJSON(&webWxSyncResponse); err != nil { + if err := scanJson(resp, &webWxSyncResponse); err != nil { return nil, err } return &webWxSyncResponse, nil @@ -212,22 +216,25 @@ func (c *Caller) WebWxSendMsg(msg *SendMessage, info *LoginInfo, request *BaseRe // 修改用户备注接口 func (c *Caller) WebWxOplog(request *BaseRequest, remarkName, toUserName string) error { - resp := NewReturnResponse(c.Client.WebWxOplog(request, remarkName, toUserName)) + resp, err := c.Client.WebWxOplog(request, remarkName, toUserName) + if err != nil { + return err + } return parseBaseResponseError(resp) } func (c *Caller) UploadMedia(file *os.File, request *BaseRequest, info *LoginInfo, fromUserName, toUserName string) (*UploadResponse, error) { // 首先尝试上传图片 - resp := NewReturnResponse(c.Client.WebWxUploadMediaByChunk(file, request, info, fromUserName, toUserName)) + resp, err := c.Client.WebWxUploadMediaByChunk(file, request, info, fromUserName, toUserName) // 无错误上传成功之后获取请求结果,判断结果是否正常 - if resp.Err() != nil { - return nil, resp.Err() + if err != nil { + return nil, err } defer resp.Body.Close() var item UploadResponse - if err := resp.ScanJSON(&item); err != nil { + if err := scanJson(resp, &item); err != nil { return &item, err } if !item.BaseResponse.Ok() { @@ -277,7 +284,10 @@ func (c *Caller) WebWxSendAppMsg(msg *SendMessage, req *BaseRequest) (*SentMessa // 用户退出 func (c *Caller) Logout(info *LoginInfo) error { - resp := NewReturnResponse(c.Client.Logout(info)) + resp, err := c.Client.Logout(info) + if err != nil { + return err + } return parseBaseResponseError(resp) } @@ -286,7 +296,10 @@ func (c *Caller) AddFriendIntoChatRoom(req *BaseRequest, info *LoginInfo, group if len(friends) == 0 { return errors.New("no friends found") } - resp := NewReturnResponse(c.Client.AddMemberIntoChatRoom(req, info, group, friends...)) + resp, err := c.Client.AddMemberIntoChatRoom(req, info, group, friends...) + if err != nil { + return err + } return parseBaseResponseError(resp) } @@ -295,30 +308,36 @@ func (c *Caller) RemoveFriendFromChatRoom(req *BaseRequest, info *LoginInfo, gro if len(users) == 0 { return errors.New("no users found") } - resp := NewReturnResponse(c.Client.RemoveMemberFromChatRoom(req, info, group, users...)) + resp, err := c.Client.RemoveMemberFromChatRoom(req, info, group, users...) + if err != nil { + return err + } return parseBaseResponseError(resp) } // 同意加好友请求 func (c *Caller) WebWxVerifyUser(storage *Storage, info RecommendInfo, verifyContent string) error { - resp := NewReturnResponse(c.Client.WebWxVerifyUser(storage, info, verifyContent)) + resp, err := c.Client.WebWxVerifyUser(storage, info, verifyContent) + if err != nil { + return err + } return parseBaseResponseError(resp) } // 撤回消息操作 func (c *Caller) WebWxRevokeMsg(msg *SentMessage, request *BaseRequest) error { - resp := NewReturnResponse(c.Client.WebWxRevokeMsg(msg, request)) + resp, err := c.Client.WebWxRevokeMsg(msg, request) + if err != nil { + return err + } return parseBaseResponseError(resp) } // 处理响应返回的结果是否正常 -func parseBaseResponseError(resp *ReturnResponse) error { - if resp.Err() != nil { - return resp.Err() - } +func parseBaseResponseError(resp *http.Response) error { defer resp.Body.Close() var item struct{ BaseResponse BaseResponse } - if err := resp.ScanJSON(&item); err != nil { + if err := scanJson(resp, &item); err != nil { return err } if !item.BaseResponse.Ok() { @@ -327,16 +346,12 @@ func parseBaseResponseError(resp *ReturnResponse) error { return nil } -func parseMessageResponseError(resp *ReturnResponse, msg *SentMessage) error { - if resp.Err() != nil { - return resp.Err() - } - +func parseMessageResponseError(resp *http.Response, msg *SentMessage) error { defer resp.Body.Close() var messageResp MessageResponse - if err := resp.ScanJSON(&messageResp); err != nil { + if err := scanJson(resp, &messageResp); err != nil { return err } @@ -349,8 +364,10 @@ func parseMessageResponseError(resp *ReturnResponse, msg *SentMessage) error { } func getSuccessSentMessage(msg *SendMessage, resp *http.Response, err error) (*SentMessage, error) { - returnResp := NewReturnResponse(resp, err) + if err != nil { + return nil, err + } sendSuccessMsg := &SentMessage{SendMessage: msg} - err = parseMessageResponseError(returnResp, sendSuccessMsg) + err = parseMessageResponseError(resp, sendSuccessMsg) return sendSuccessMsg, err } diff --git a/client.go b/client.go index 302a4c2..83e9602 100644 --- a/client.go +++ b/client.go @@ -432,11 +432,12 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in req.Header.Set("Content-Type", ct) // 发送数据 resp, err = c.Do(req) - + if err != nil { + return nil, err + } // 如果不是最后一次, 解析有没有错误 if !isLastTime { - returnResp := NewReturnResponse(resp, err) - if err := parseBaseResponseError(returnResp); err != nil { + if err := parseBaseResponseError(resp); err != nil { return nil, err } } diff --git a/parser.go b/parser.go index 556097a..48dee91 100644 --- a/parser.go +++ b/parser.go @@ -3,6 +3,7 @@ package openwechat import ( "bytes" "encoding/json" + "encoding/xml" "math/rand" "mime/multipart" "net/http" @@ -90,3 +91,19 @@ func getMessageType(filename string) string { } return doc } + +func scanXml(resp *http.Response, v interface{}) error { + var buffer bytes.Buffer + if _, err := buffer.ReadFrom(resp.Body); err != nil { + return err + } + return xml.Unmarshal(buffer.Bytes(), v) +} + +func scanJson(resp *http.Response, v interface{}) error { + var buffer bytes.Buffer + if _, err := buffer.ReadFrom(resp.Body); err != nil { + return err + } + return json.Unmarshal(buffer.Bytes(), v) +} diff --git a/response.go b/response.go deleted file mode 100644 index 6077309..0000000 --- a/response.go +++ /dev/null @@ -1,54 +0,0 @@ -package openwechat - -import ( - "bytes" - "encoding/json" - "encoding/xml" - "net/http" -) - -// Http请求的响应结构体封装 -type ReturnResponse struct { - *http.Response - err error -} - -// Constructor for ReturnResponse -func NewReturnResponse(response *http.Response, err error) *ReturnResponse { - return &ReturnResponse{Response: response, err: err} -} - -// 获取当前请求的错误 -func (r *ReturnResponse) Err() error { - return r.err -} - -// json序列化 -func (r *ReturnResponse) ScanJSON(v interface{}) error { - if data, err := r.ReadAll(); err != nil { - return err - } else { - return json.Unmarshal(data, v) - } -} - -// xml序列化 -func (r *ReturnResponse) ScanXML(v interface{}) error { - if data, err := r.ReadAll(); err != nil { - return err - } else { - return xml.Unmarshal(data, v) - } -} - -// 读取请求体 -func (r *ReturnResponse) ReadAll() ([]byte, error) { - if r.Err() != nil { - return nil, r.Err() - } - buffer := bytes.Buffer{} - if _, err := buffer.ReadFrom(r.Body); err != nil { - return nil, err - } - return buffer.Bytes(), nil -}