From db96eadaab3b4aeaa01aaf4b5ae2b0a5958c2ed9 Mon Sep 17 00:00:00 2001 From: Openset Date: 2018年12月18日 15:39:24 +0800 Subject: [PATCH 1/2] Add: AccountsLogin --- internal/leetcode/base.go | 49 +++++++++++++++++++ internal/leetcode/config.go | 14 ++++++ internal/leetcode/login.go | 32 ++++++++++++ internal/login/login.go | 1 - solution/roman-to-integer/roman_to_integer.go | 2 +- 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 internal/leetcode/base.go create mode 100644 internal/leetcode/config.go create mode 100644 internal/leetcode/login.go delete mode 100644 internal/login/login.go diff --git a/internal/leetcode/base.go b/internal/leetcode/base.go new file mode 100644 index 000000000..5f8c50d46 --- /dev/null +++ b/internal/leetcode/base.go @@ -0,0 +1,49 @@ +package leetcode + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "os" + "os/user" + "path" +) + +func checkErr(err error) { + if err != nil { + panic(err) + } +} + +func getCsrfToken(cookies []*http.Cookie) string { + for _, cookie := range cookies { + if cookie.Name == "csrftoken" { + return cookie.Value + } + } + return "" +} + +func getPath(f string) string { + dir := os.TempDir() + u, err := user.Current() + if err == nil && u.HomeDir != "" { + dir = path.Join(u.HomeDir, ".leetcode") + } + os.MkdirAll(dir, 0755) + return path.Join(dir, f) +} + +func saveCookies(cookies []*http.Cookie) { + data, _ := json.Marshal(cookies) + err := ioutil.WriteFile(getPath(cookiesFile), data, 0755) + checkErr(err) +} + +func getCookies() (cookies []*http.Cookie) { + b, err := ioutil.ReadFile(getPath(cookiesFile)) + checkErr(err) + err = json.Unmarshal(b, &cookies) + checkErr(err) + return +} diff --git a/internal/leetcode/config.go b/internal/leetcode/config.go new file mode 100644 index 000000000..111cef646 --- /dev/null +++ b/internal/leetcode/config.go @@ -0,0 +1,14 @@ +package leetcode + +const ( + AccountsLoginUrl = "https://leetcode.com/accounts/login/" + ProblemsetAllUrl = "https://leetcode.com/problemset/all/" + ApiProblemsAllUrl = "https://leetcode.com/api/problems/all/" + GraphqlUrl = "https://leetcode.com/graphql" + ApiProgressAllUrl = "https://leetcode.com/api/progress/all/" + SubmissionsLatestUrl = "https://leetcode.com/submissions/latest/" +) + +const cookiesFile = "cookies" + +const credentialsFile = "credentials" diff --git a/internal/leetcode/login.go b/internal/leetcode/login.go new file mode 100644 index 000000000..0eee6db82 --- /dev/null +++ b/internal/leetcode/login.go @@ -0,0 +1,32 @@ +package leetcode + +import ( + "net/http" + "net/url" + "strings" +) + +func AccountsLogin(user string, pwd string) (*http.Response, error) { + resp, _ := http.Head(AccountsLoginUrl) + cookies := resp.Cookies() + saveCookies(cookies) + csrftoken := getCsrfToken(cookies) + data := url.Values{ + "login": {user}, + "password": {pwd}, + "csrfmiddlewaretoken": {csrftoken}, + } + req, err := http.NewRequest("POST", AccountsLoginUrl, strings.NewReader(data.Encode())) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Referer", AccountsLoginUrl) + for _, cookie := range cookies { + req.AddCookie(cookie) + } + resp, err = http.DefaultClient.Do(req) + checkErr(err) + saveCookies(resp.Cookies()) + return resp, err +} diff --git a/internal/login/login.go b/internal/login/login.go deleted file mode 100644 index 43003eea9..000000000 --- a/internal/login/login.go +++ /dev/null @@ -1 +0,0 @@ -package login diff --git a/solution/roman-to-integer/roman_to_integer.go b/solution/roman-to-integer/roman_to_integer.go index 0d9409b3b..4c2d89044 100644 --- a/solution/roman-to-integer/roman_to_integer.go +++ b/solution/roman-to-integer/roman_to_integer.go @@ -15,7 +15,7 @@ func romanToInt(s string) int { p := 0 l := len(s) for i := 0; i < l; i++ { - k := s[i:i+1] + k := s[i : i+1] if v, ok := m[k]; ok { if v> p { r -= p * 2 From cd6f1f503a111b2f146860b2c41973c8bb98418b Mon Sep 17 00:00:00 2001 From: Openset Date: 2018年12月18日 15:42:45 +0800 Subject: [PATCH 2/2] Add: checkErr --- internal/leetcode/base.go | 8 +++++--- internal/leetcode/login.go | 7 +++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/internal/leetcode/base.go b/internal/leetcode/base.go index 5f8c50d46..fdf89396b 100644 --- a/internal/leetcode/base.go +++ b/internal/leetcode/base.go @@ -30,13 +30,15 @@ func getPath(f string) string { if err == nil && u.HomeDir != "" { dir = path.Join(u.HomeDir, ".leetcode") } - os.MkdirAll(dir, 0755) + err = os.MkdirAll(dir, 0755) + checkErr(err) return path.Join(dir, f) } func saveCookies(cookies []*http.Cookie) { - data, _ := json.Marshal(cookies) - err := ioutil.WriteFile(getPath(cookiesFile), data, 0755) + data, err := json.Marshal(cookies) + checkErr(err) + err = ioutil.WriteFile(getPath(cookiesFile), data, 0755) checkErr(err) } diff --git a/internal/leetcode/login.go b/internal/leetcode/login.go index 0eee6db82..ef9c2a34a 100644 --- a/internal/leetcode/login.go +++ b/internal/leetcode/login.go @@ -7,7 +7,8 @@ import ( ) func AccountsLogin(user string, pwd string) (*http.Response, error) { - resp, _ := http.Head(AccountsLoginUrl) + resp, err := http.Head(AccountsLoginUrl) + checkErr(err) cookies := resp.Cookies() saveCookies(cookies) csrftoken := getCsrfToken(cookies) @@ -17,9 +18,7 @@ func AccountsLogin(user string, pwd string) (*http.Response, error) { "csrfmiddlewaretoken": {csrftoken}, } req, err := http.NewRequest("POST", AccountsLoginUrl, strings.NewReader(data.Encode())) - if err != nil { - return nil, err - } + checkErr(err) req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Referer", AccountsLoginUrl) for _, cookie := range cookies {

AltStyle によって変換されたページ (->オリジナル) /