亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Golang 登錄私有站點并拉取信息

使用 Golang 登錄私有站點并拉取信息

Go
30秒到達戰場 2022-01-10 10:47:07
我嘗試使用 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()

}


查看完整回答
反對 回復 2022-01-10
  • 1 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號