diff --git a/user.go b/user.go index f36b56e..88aff53 100644 --- a/user.go +++ b/user.go @@ -58,8 +58,18 @@ func (u *User) String() string { } // GetAvatarResponse 获取用户头像 -func (u *User) GetAvatarResponse() (*http.Response, error) { - return u.Self.Bot.Caller.Client.WebWxGetHeadImg(u) +func (u *User) GetAvatarResponse() (resp *http.Response, err error) { + for i := 0; i < 3; i++ { + resp, err = u.Self.Bot.Caller.Client.WebWxGetHeadImg(u) + if err != nil { + return nil, err + } + // 这里存在 ContentLength 为0的情况,需要重试 + if resp.ContentLength > 0 { + break + } + } + return resp, err } // SaveAvatar 下载用户头像 @@ -68,7 +78,7 @@ func (u *User) SaveAvatar(filename string) error { if err != nil { return err } - defer file.Close() + defer func() { _ = file.Close() }() return u.SaveAvatarWithWriter(file) } @@ -77,21 +87,12 @@ func (u *User) SaveAvatarWithWriter(writer io.Writer) error { if err != nil { return err } - // 这里获取头像的响应有时可能会异常 - // 一般为网路原因 - // 再去请求一次即可解决 - if resp.ContentLength == 0 && resp.Header.Get("Content-Type") == "image/jpeg" { - resp, err = u.GetAvatarResponse() - if err != nil { - return err - } - } // 写文件前判断下 content length 是否是 0,不然保存的头像会出现 // image not loaded try to open it externally to fix format problem 问题 if resp.ContentLength == 0 { - return fmt.Errorf("get avatar response content length is 0") + return errors.New("get avatar response content length is 0") } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, err = io.Copy(writer, resp.Body) return err }