diff --git a/internal/leetcode/base.go b/internal/leetcode/base.go index fdf89396b..05886ed10 100644 --- a/internal/leetcode/base.go +++ b/internal/leetcode/base.go @@ -1,9 +1,12 @@ package leetcode import ( + "bytes" "encoding/json" "io/ioutil" "net/http" + "net/http/cookiejar" + "net/url" "os" "os/user" "path" @@ -15,6 +18,15 @@ func checkErr(err error) { } } +func client() *http.Client { + jar, err := cookiejar.New(nil) + // jar.SetCookies() + checkErr(err) + return &http.Client{ + Jar: jar, + } +} + func getCsrfToken(cookies []*http.Cookie) string { for _, cookie := range cookies { if cookie.Name == "csrftoken" { @@ -38,7 +50,10 @@ func getPath(f string) string { func saveCookies(cookies []*http.Cookie) { data, err := json.Marshal(cookies) checkErr(err) - err = ioutil.WriteFile(getPath(cookiesFile), data, 0755) + dst := bytes.Buffer{} + err = json.Indent(&dst, data, "", "\t") + checkErr(err) + err = ioutil.WriteFile(getPath(cookiesFile), dst.Bytes(), 0755) checkErr(err) } @@ -49,3 +64,9 @@ func getCookies() (cookies []*http.Cookie) { checkErr(err) return } + +func saveCredential(data url.Values) { + u := url.UserPassword(data.Get("login"), data.Get("password")) + err := ioutil.WriteFile(getPath(credentialsFile), []byte(u.String()), 0755) + checkErr(err) +} diff --git a/internal/leetcode/login.go b/internal/leetcode/login.go index ef9c2a34a..f1286407e 100644 --- a/internal/leetcode/login.go +++ b/internal/leetcode/login.go @@ -6,15 +6,16 @@ import ( "strings" ) -func AccountsLogin(user string, pwd string) (*http.Response, error) { +func AccountsLogin(username, password string) (*http.Response, error) { resp, err := http.Head(AccountsLoginUrl) checkErr(err) + defer resp.Body.Close() cookies := resp.Cookies() saveCookies(cookies) csrftoken := getCsrfToken(cookies) data := url.Values{ - "login": {user}, - "password": {pwd}, + "login": {username}, + "password": {password}, "csrfmiddlewaretoken": {csrftoken}, } req, err := http.NewRequest("POST", AccountsLoginUrl, strings.NewReader(data.Encode())) @@ -26,6 +27,10 @@ func AccountsLogin(user string, pwd string) (*http.Response, error) { } resp, err = http.DefaultClient.Do(req) checkErr(err) + defer resp.Body.Close() saveCookies(resp.Cookies()) + if resp.StatusCode == 200 { + saveCredential(data) + } return resp, err }