我嘗試使用 golang 登錄網站的私人區域并提取一些信息,但我似乎不太正確。我設法獲取登錄頁面以獲取 csrf 令牌,然后我將 csrf 令牌與登錄信息一起發布到登錄頁面,然后我就可以登錄了。如果我停在這一點上,我可以看到我被重定向的頁面。但是,從此時起的任何后續調用都會將我重定向回登錄。代碼package mainimport ( "github.com/PuerkitoBio/goquery" "io" _ "io/ioutil" "log" "net/http" "net/url" _ "strings" "sync")type Jar struct { sync.Mutex cookies map[string][]*http.Cookie}func NewJar() *Jar { jar := new(Jar) jar.cookies = make(map[string][]*http.Cookie) return jar}func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) { jar.Lock() jar.cookies[u.Host] = cookies jar.Unlock()}func (jar *Jar) Cookies(u *url.URL) []*http.Cookie { return jar.cookies[u.Host]}func NewJarClient() *http.Client { return &http.Client{ Jar: NewJar(), }}func fetch(w http.ResponseWriter, r *http.Request) { // create the client client := NewJarClient() // get the csrf token req, _ := http.NewRequest("GET", "http://www.domain.com/login", nil) resp, err := client.Do(req) if err != nil { log.Fatal(err) } doc, err := goquery.NewDocumentFromResponse(resp) if err != nil { log.Fatal(err) } csrfToken := "" if val, ok := doc.Find(`head meta[name="csrf-token-value"]`).Attr("content"); ok { csrfToken = val } // post on the login form. resp, _ = client.PostForm("http://www.domain.com/login", url.Values{ "UserLogin[email]": {"the email"}, "UserLogin[password]": {"the password"}, "csrf_token": {csrfToken}, }) doc, err = goquery.NewDocumentFromResponse(resp) if err != nil { log.Fatal(err) }知道我在這里缺少什么嗎?
1 回答
至尊寶的傳說
TA貢獻1789條經驗 獲得超10個贊
好的,問題是 cookie jar 實現,更具體地說是 SetCookies 函數,現在是:
func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
jar.Lock()
jar.cookies[u.Host] = cookies
jar.Unlock()
}
這是錯誤的,因為新的 cookie 不會被添加到現有的 cookie 中,它們只會作為新的 cookie 丟棄舊的而添加。
似乎正確的方法是:
func (jar *Jar) SetCookies(u *url.URL, cookies []*http.Cookie) {
jar.Lock()
if _, ok := jar.cookies[u.Host]; ok {
for _, c := range cookies {
jar.cookies[u.Host] = append(jar.cookies[u.Host], c)
}
} else {
jar.cookies[u.Host] = cookies
}
jar.Unlock()
}
- 1 回答
- 0 關注
- 195 瀏覽
添加回答
舉報
0/150
提交
取消
