diff --git a/client.go b/client.go index bd50cd2..80e780d 100644 --- a/client.go +++ b/client.go @@ -360,7 +360,11 @@ func (c *Client) WebWxUploadMediaByChunk(file *os.File, request *BaseRequest, in path.RawQuery = params.Encode() cookies := c.Jar().Cookies(path) - webWxDataTicket := getWebWxDataTicket(cookies) + + webWxDataTicket, err := getWebWxDataTicket(cookies) + if err != nil { + return nil, err + } uploadMediaRequest := map[string]interface{}{ "UploadType": 2, @@ -593,13 +597,18 @@ func (c *Client) WebWxGetVideo(msg *Message, info *LoginInfo) (*http.Response, e // WebWxGetMedia 获取文件消息的文件响应 func (c *Client) WebWxGetMedia(msg *Message, info *LoginInfo) (*http.Response, error) { path, _ := url.Parse(c.Domain.FileHost() + webwxgetmedia) + cookies := c.Jar().Cookies(path) + webWxDataTicket, err := getWebWxDataTicket(cookies) + if err != nil { + return nil, err + } params := url.Values{} params.Add("sender", msg.FromUserName) params.Add("mediaid", msg.MediaId) params.Add("encryfilename", msg.EncryFileName) params.Add("fromuser", strconv.FormatInt(info.WxUin, 10)) params.Add("pass_ticket", info.PassTicket) - params.Add("webwx_data_ticket", getWebWxDataTicket(c.Jar().Cookies(path))) + params.Add("webwx_data_ticket", webWxDataTicket) path.RawQuery = params.Encode() req, _ := http.NewRequest(http.MethodGet, path.String(), nil) req.Header.Add("Referer", c.Domain.BaseHost()+"/") diff --git a/jar.go b/cookiejar.go similarity index 68% rename from jar.go rename to cookiejar.go index fd32cfb..434e1e7 100644 --- a/jar.go +++ b/cookiejar.go @@ -9,6 +9,7 @@ import ( ) // Jar is a struct which as same as cookiejar.Jar +// cookiejar.Jar's fields are private, so we can't use it directly type Jar struct { PsList cookiejar.PublicSuffixList @@ -57,3 +58,24 @@ type entry struct { // equal Creation time. This simplifies testing. seqNum uint64 } + +// CookieGroup is a group of cookies +type CookieGroup []*http.Cookie + +func (c CookieGroup) GetByName(cookieName string) (cookie *http.Cookie, exist bool) { + for _, cookie := range c { + if cookie.Name == cookieName { + return cookie, true + } + } + return nil, false +} + +func getWebWxDataTicket(cookies []*http.Cookie) (string, error) { + cookieGroup := CookieGroup(cookies) + cookie, exist := cookieGroup.GetByName("webwx_data_ticket") + if !exist { + return "", ErrWebWxDataTicketNotFound + } + return cookie.Value, nil +} diff --git a/errors.go b/errors.go index 4c2b378..036516a 100644 --- a/errors.go +++ b/errors.go @@ -32,6 +32,9 @@ var ( // ErrLoginTimeout define login timeout error ErrLoginTimeout = errors.New("login timeout") + + // ErrWebWxDataTicketNotFound define webwx_data_ticket not found error + ErrWebWxDataTicketNotFound = errors.New("webwx_data_ticket not found") ) // Error impl error interface diff --git a/parser.go b/parser.go index 80ed563..d3f4480 100644 --- a/parser.go +++ b/parser.go @@ -38,15 +38,6 @@ func GetRandomDeviceId() string { return builder.String() } -func getWebWxDataTicket(cookies []*http.Cookie) string { - for _, cookie := range cookies { - if cookie.Name == "webwx_data_ticket" { - return cookie.Value - } - } - return "" -} - // GetFileContentType 获取文件上传的类型 func GetFileContentType(file multipart.File) (string, error) { data := make([]byte, 512)