From fbb287c3eb8ba7b64a1a4037b6bf8734a8d4e617 Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 20:21:30 +0800 Subject: [PATCH 1/9] refactor: unified cookie expiration error codes --- errno/default.go | 2 +- jwch.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/errno/default.go b/errno/default.go index 96fe8cc..2f7db97 100644 --- a/errno/default.go +++ b/errno/default.go @@ -23,7 +23,7 @@ var ( ServiceError = NewErrNo(ServiceErrorCode, "service is unable to start successfully") ServiceInternalError = NewErrNo(ServiceErrorCode, "service Internal Error") ParamError = NewErrNo(ParamErrorCode, "parameter error") - AuthorizationFailedError = NewErrNo(AuthorizationFailedErrCode, "suthorization failed") + AuthorizationFailedError = NewErrNo(AuthorizationFailedErrCode, "authorization failed") // User AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") diff --git a/jwch.go b/jwch.go index 86aaa71..550c272 100644 --- a/jwch.go +++ b/jwch.go @@ -79,7 +79,7 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.HTTPQueryError.WithErr(err) + return nil, errno.SessionExpiredError.WithErr(err) } // 会话过期 TODO: 判断条件有点简陋 @@ -97,7 +97,7 @@ func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*h s.NewRequest().EnableTrace() if err != nil { - return nil, errno.HTTPQueryError.WithErr(err) + return nil, errno.SessionExpiredError.WithErr(err) } // Identifier缺失 TODO: 判断条件有点简陋 From cf7f735c14b97c1f95bd87fc507146159103e6ff Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 20:34:39 +0800 Subject: [PATCH 2/9] refactor: change session to Identifier --- errno/default.go | 10 +++++----- jwch.go | 14 +++++++------- jwch_test.go | 4 ++-- user.go | 12 ++++++------ 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/errno/default.go b/errno/default.go index 2f7db97..e2b9ef6 100644 --- a/errno/default.go +++ b/errno/default.go @@ -26,11 +26,11 @@ var ( AuthorizationFailedError = NewErrNo(AuthorizationFailedErrCode, "authorization failed") // User - AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") - SessionExpiredError = NewErrNo(AuthorizationFailedErrCode, "session expired") - LoginCheckFailedError = NewErrNo(AuthorizationFailedErrCode, "login check failed") - SSOLoginFailedError = NewErrNo(AuthorizationFailedErrCode, "sso login failed") - GetSessionFailedError = NewErrNo(AuthorizationFailedErrCode, "get session failed") + AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") + IdentifierExpiredError = NewErrNo(AuthorizationFailedErrCode, "session expired") + LoginCheckFailedError = NewErrNo(AuthorizationFailedErrCode, "login check failed") + SSOLoginFailedError = NewErrNo(AuthorizationFailedErrCode, "sso login failed") + GetIdentifierFailedError = NewErrNo(AuthorizationFailedErrCode, "get session failed") // HTTP HTTPQueryError = NewErrNo(HTTPQueryErrorCode, "HTTP query failed") diff --git a/jwch.go b/jwch.go index 550c272..70ed3c3 100644 --- a/jwch.go +++ b/jwch.go @@ -51,7 +51,7 @@ func (s *Student) WithLoginData(identifier string, cookies []*http.Cookie) *Stud return s } -// 携带账号密码,这部分考虑整合到Login中,因为实际上我们不需要这个东西 +// WithUser 携带账号密码,这部分考虑整合到Login中,因为实际上我们不需要这个东西 func (s *Student) WithUser(id, password string) *Student { s.ID = id s.Password = password @@ -79,36 +79,36 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.SessionExpiredError.WithErr(err) + return nil, errno.IdentifierExpiredError.WithErr(err) } // 会话过期 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "重新登录") { - return nil, errno.SessionExpiredError + return nil, errno.IdentifierExpiredError } return htmlquery.Parse(bytes.NewReader(resp.Body())) } -// PostWithSession returns parse tree for the resp of the request. +// PostWithIdentifier returns parse tree for the resp of the request. func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).SetFormData(formData).Post(url) s.NewRequest().EnableTrace() if err != nil { - return nil, errno.SessionExpiredError.WithErr(err) + return nil, errno.IdentifierExpiredError.WithErr(err) } // Identifier缺失 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "处理URL失败") { - return nil, errno.SessionExpiredError + return nil, errno.IdentifierExpiredError } return htmlquery.Parse(strings.NewReader(strings.TrimSpace(string(resp.Body())))) } -// 获取验证码 +// GetValidateCode 获取验证码 func GetValidateCode(image string) (string, error) { // 请求西二服务器,自动识别验证码 code := verifyCodeResponse{} diff --git a/jwch_test.go b/jwch_test.go index b527d01..c73872a 100644 --- a/jwch_test.go +++ b/jwch_test.go @@ -32,8 +32,8 @@ var ( ) var ( - islogin bool = false - stu *Student = NewStudent().WithUser(username, password) + islogin = false + stu = NewStudent().WithUser(username, password) ) func login() error { diff --git a/user.go b/user.go index 4f27380..eff6382 100644 --- a/user.go +++ b/user.go @@ -39,7 +39,7 @@ type verifyCodeResponse struct { Message string `json:"message"` } -// 模拟教务处登录/刷新Session +// Login 模拟教务处登录/刷新Session func (s *Student) Login() error { // 清除cookie s.ClearLoginData() @@ -127,13 +127,13 @@ func (s *Student) Login() error { // 这里是err == nil 因为禁止了重定向,正常登录是会出现异常的 if err == nil { - return errno.GetSessionFailedError + return errno.GetIdentifierFailedError } data := regexp.MustCompile(`id=(.*?)&`).FindStringSubmatch(err.Error()) if len(data) < 1 { - return errno.GetSessionFailedError + return errno.GetIdentifierFailedError } s.SetIdentifier(data[1]) @@ -141,7 +141,7 @@ func (s *Student) Login() error { return nil } -// 方面服务端进行测试设置的接口 +// GetIdentifierAndCookies 方面服务端进行测试设置的接口 func (s *Student) GetIdentifierAndCookies() (string, []*http.Cookie, error) { err := s.CheckSession() if err != nil { @@ -167,7 +167,7 @@ func (s *Student) CheckSession() error { res := htmlquery.FindOne(resp, `//*[@id="ContentPlaceHolder1_LB_xh"]`) if res == nil { - return errno.SessionExpiredError.WithErr(err) + return errno.IdentifierExpiredError.WithErr(err) } if htmlquery.OutputHTML(res, false) != s.ID { @@ -177,7 +177,7 @@ func (s *Student) CheckSession() error { return nil } -// 获取学生个人信息 +// GetInfo 获取学生个人信息 func (s *Student) GetInfo() (resp *StudentDetail, err error) { res, err := s.GetWithIdentifier(constants.UserInfoURL) if err != nil { From 7634cfbdcbee9ee007bcfa2eeb2d02526cd15002 Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:02:05 +0800 Subject: [PATCH 3/9] refactor: unified cookie expiration error codes --- errno/default.go | 10 +++++----- user.go | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/errno/default.go b/errno/default.go index e2b9ef6..f0a1325 100644 --- a/errno/default.go +++ b/errno/default.go @@ -26,11 +26,11 @@ var ( AuthorizationFailedError = NewErrNo(AuthorizationFailedErrCode, "authorization failed") // User - AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") - IdentifierExpiredError = NewErrNo(AuthorizationFailedErrCode, "session expired") - LoginCheckFailedError = NewErrNo(AuthorizationFailedErrCode, "login check failed") - SSOLoginFailedError = NewErrNo(AuthorizationFailedErrCode, "sso login failed") - GetIdentifierFailedError = NewErrNo(AuthorizationFailedErrCode, "get session failed") + AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") + CookieExpiredError = NewErrNo(AuthorizationFailedErrCode, "cookie expired") + LoginCheckFailedError = NewErrNo(AuthorizationFailedErrCode, "login check failed") + SSOLoginFailedError = NewErrNo(AuthorizationFailedErrCode, "sso login failed") + GetCookieFailedError = NewErrNo(AuthorizationFailedErrCode, "get cookie failed") // HTTP HTTPQueryError = NewErrNo(HTTPQueryErrorCode, "HTTP query failed") diff --git a/user.go b/user.go index eff6382..3bd3a46 100644 --- a/user.go +++ b/user.go @@ -127,13 +127,13 @@ func (s *Student) Login() error { // 这里是err == nil 因为禁止了重定向,正常登录是会出现异常的 if err == nil { - return errno.GetIdentifierFailedError + return errno.GetCookieFailedError } data := regexp.MustCompile(`id=(.*?)&`).FindStringSubmatch(err.Error()) if len(data) < 1 { - return errno.GetIdentifierFailedError + return errno.GetCookieFailedError } s.SetIdentifier(data[1]) From f3cc35862a75953e7b49e04b545bd1a37eaf8f9f Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:06:29 +0800 Subject: [PATCH 4/9] fix: undefined error --- jwch.go | 8 ++++---- user.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jwch.go b/jwch.go index 70ed3c3..6bc7e18 100644 --- a/jwch.go +++ b/jwch.go @@ -79,12 +79,12 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.IdentifierExpiredError.WithErr(err) + return nil, errno.CookieExpiredError.WithErr(err) } // 会话过期 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "重新登录") { - return nil, errno.IdentifierExpiredError + return nil, errno.CookieExpiredError } return htmlquery.Parse(bytes.NewReader(resp.Body())) @@ -97,12 +97,12 @@ func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*h s.NewRequest().EnableTrace() if err != nil { - return nil, errno.IdentifierExpiredError.WithErr(err) + return nil, errno.CookieExpiredError.WithErr(err) } // Identifier缺失 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "处理URL失败") { - return nil, errno.IdentifierExpiredError + return nil, errno.CookieExpiredError } return htmlquery.Parse(strings.NewReader(strings.TrimSpace(string(resp.Body())))) diff --git a/user.go b/user.go index 5408f13..5756512 100644 --- a/user.go +++ b/user.go @@ -167,7 +167,7 @@ func (s *Student) CheckSession() error { res := htmlquery.FindOne(resp, `//*[@id="ContentPlaceHolder1_LB_xh"]`) if res == nil { - return errno.IdentifierExpiredError.WithErr(err) + return errno.CookieExpiredError.WithErr(err) } if htmlquery.OutputHTML(res, false) != s.ID { From 1dcbfb7103512bd4656dcfd57c15b4f54a7917eb Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:11:31 +0800 Subject: [PATCH 5/9] fix: test error --- user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user.go b/user.go index 5756512..befa058 100644 --- a/user.go +++ b/user.go @@ -133,7 +133,7 @@ func (s *Student) Login() error { data := regexp.MustCompile(`id=(.*?)&`).FindStringSubmatch(err.Error()) if len(data) < 1 { - return errno.GetIdentifierFailedError + return errno.CookieExpiredError } s.SetIdentifier(data[1]) From 86066dbed2e1234b9509f6649e50f5b8adec889d Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:22:17 +0800 Subject: [PATCH 6/9] refactor: unified cookie error --- errno/default.go | 4 +--- jwch.go | 8 ++++---- user.go | 6 +++--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/errno/default.go b/errno/default.go index 44d5f63..0dfeca5 100644 --- a/errno/default.go +++ b/errno/default.go @@ -27,11 +27,9 @@ var ( // User AccountConflictError = NewErrNo(AuthorizationFailedErrCode, "account conflict") - CookieExpiredError = NewErrNo(AuthorizationFailedErrCode, "cookie expired") + CookieError = NewErrNo(AuthorizationFailedErrCode, "id error or session expired") LoginCheckFailedError = NewErrNo(AuthorizationFailedErrCode, "login check failed") SSOLoginFailedError = NewErrNo(AuthorizationFailedErrCode, "sso login failed") - GetCookieFailedError = NewErrNo(AuthorizationFailedErrCode, "get cookie failed") - // HTTP HTTPQueryError = NewErrNo(HTTPQueryErrorCode, "HTTP query failed") diff --git a/jwch.go b/jwch.go index 6bc7e18..2eab5bd 100644 --- a/jwch.go +++ b/jwch.go @@ -79,12 +79,12 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.CookieExpiredError.WithErr(err) + return nil, errno.SSOLoginFailedError.WithErr(err) } // 会话过期 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "重新登录") { - return nil, errno.CookieExpiredError + return nil, errno.SSOLoginFailedError } return htmlquery.Parse(bytes.NewReader(resp.Body())) @@ -97,12 +97,12 @@ func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*h s.NewRequest().EnableTrace() if err != nil { - return nil, errno.CookieExpiredError.WithErr(err) + return nil, errno.SSOLoginFailedError.WithErr(err) } // Identifier缺失 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "处理URL失败") { - return nil, errno.CookieExpiredError + return nil, errno.SSOLoginFailedError } return htmlquery.Parse(strings.NewReader(strings.TrimSpace(string(resp.Body())))) diff --git a/user.go b/user.go index befa058..1fb8091 100644 --- a/user.go +++ b/user.go @@ -127,13 +127,13 @@ func (s *Student) Login() error { // 这里是err == nil 因为禁止了重定向,正常登录是会出现异常的 if err == nil { - return errno.GetCookieFailedError + return errno.SSOLoginFailedError } data := regexp.MustCompile(`id=(.*?)&`).FindStringSubmatch(err.Error()) if len(data) < 1 { - return errno.CookieExpiredError + return errno.SSOLoginFailedError } s.SetIdentifier(data[1]) @@ -167,7 +167,7 @@ func (s *Student) CheckSession() error { res := htmlquery.FindOne(resp, `//*[@id="ContentPlaceHolder1_LB_xh"]`) if res == nil { - return errno.CookieExpiredError.WithErr(err) + return errno.SSOLoginFailedError.WithErr(err) } if htmlquery.OutputHTML(res, false) != s.ID { From 0493ecd9ef8bfcfb7ee3020169bfc9a205f29607 Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:32:28 +0800 Subject: [PATCH 7/9] fix: errno type error --- jwch.go | 8 ++++---- user.go | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/jwch.go b/jwch.go index 2eab5bd..6c539ce 100644 --- a/jwch.go +++ b/jwch.go @@ -79,12 +79,12 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.SSOLoginFailedError.WithErr(err) + return nil, errno.CookieError.WithErr(err) } // 会话过期 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "重新登录") { - return nil, errno.SSOLoginFailedError + return nil, errno.CookieError } return htmlquery.Parse(bytes.NewReader(resp.Body())) @@ -97,12 +97,12 @@ func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*h s.NewRequest().EnableTrace() if err != nil { - return nil, errno.SSOLoginFailedError.WithErr(err) + return nil, errno.CookieError.WithErr(err) } // Identifier缺失 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "处理URL失败") { - return nil, errno.SSOLoginFailedError + return nil, errno.CookieError } return htmlquery.Parse(strings.NewReader(strings.TrimSpace(string(resp.Body())))) diff --git a/user.go b/user.go index 1fb8091..05038ed 100644 --- a/user.go +++ b/user.go @@ -127,13 +127,13 @@ func (s *Student) Login() error { // 这里是err == nil 因为禁止了重定向,正常登录是会出现异常的 if err == nil { - return errno.SSOLoginFailedError + return errno.CookieError } data := regexp.MustCompile(`id=(.*?)&`).FindStringSubmatch(err.Error()) if len(data) < 1 { - return errno.SSOLoginFailedError + return errno.CookieError } s.SetIdentifier(data[1]) @@ -167,7 +167,7 @@ func (s *Student) CheckSession() error { res := htmlquery.FindOne(resp, `//*[@id="ContentPlaceHolder1_LB_xh"]`) if res == nil { - return errno.SSOLoginFailedError.WithErr(err) + return errno.CookieError.WithErr(err) } if htmlquery.OutputHTML(res, false) != s.ID { From 03a6920b32a631e71f8235fd24c3d0f9db988739 Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:42:01 +0800 Subject: [PATCH 8/9] fix: optimize error messages --- jwch.go | 2 +- user.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jwch.go b/jwch.go index 6c539ce..6ab7326 100644 --- a/jwch.go +++ b/jwch.go @@ -79,7 +79,7 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) if err != nil { - return nil, errno.CookieError.WithErr(err) + return nil, errno.CookieError } // 会话过期 TODO: 判断条件有点简陋 diff --git a/user.go b/user.go index 05038ed..eb7f6f3 100644 --- a/user.go +++ b/user.go @@ -167,7 +167,7 @@ func (s *Student) CheckSession() error { res := htmlquery.FindOne(resp, `//*[@id="ContentPlaceHolder1_LB_xh"]`) if res == nil { - return errno.CookieError.WithErr(err) + return errno.CookieError } if htmlquery.OutputHTML(res, false) != s.ID { From 7f1e73528329e227209a2d6b53e088d4ddd4047b Mon Sep 17 00:00:00 2001 From: jiuxia211 <2064166368@qq.com> Date: Sat, 7 Dec 2024 21:50:19 +0800 Subject: [PATCH 9/9] fix: optimize code comments --- jwch.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jwch.go b/jwch.go index 6ab7326..f8ec58f 100644 --- a/jwch.go +++ b/jwch.go @@ -78,11 +78,12 @@ func (s *Student) NewRequest() *resty.Request { func (s *Student) GetWithIdentifier(url string) (*html.Node, error) { resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).Get(url) + // 会话过期:会直接重定向,但我们禁用了重定向,所以会有error if err != nil { return nil, errno.CookieError } - // 会话过期 TODO: 判断条件有点简陋 + // 还有一种情况是 id 或 cookie 缺失或者解析错误 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "重新登录") { return nil, errno.CookieError } @@ -95,12 +96,12 @@ func (s *Student) PostWithIdentifier(url string, formData map[string]string) (*h resp, err := s.NewRequest().SetHeader("Referer", constants.JwchReferer).SetQueryParam("id", s.Identifier).SetFormData(formData).Post(url) s.NewRequest().EnableTrace() - + // 会话过期:会直接重定向,但我们禁用了重定向,所以会有error if err != nil { return nil, errno.CookieError.WithErr(err) } - // Identifier缺失 TODO: 判断条件有点简陋 + // id 或 cookie 缺失或者解析错误 TODO: 判断条件有点简陋 if strings.Contains(string(resp.Body()), "处理URL失败") { return nil, errno.CookieError }