使用golang http库

时间:2016-04-01 14:57:48

标签: forms go

Oke,我正在尝试使用自己的Crawler登录我的学校网站。他们有一些防止登录的保护。首先,我向网站发出请求,以便从隐藏的输入字段中获取令牌。我在下一个Post请求中使用的令牌登录到url!但由于某种原因,http响应是我无法重新提交表单。但是在Postman rest客户端(chrome插件)中做同样的事情我可以登录!

当我尝试向此网址提交表单时:

postLoginUrl = "?username=%s&password=%s&submit=inloggen&_eventId=submit&credentialsType=ldap&lt=%s"
loginUrl     = "https://login.hro.nl/v1/login"

其中%s填写凭据

req, err := client.Post(loginUrl, "application/x-www-form-urlencoded", strings.NewReader(uri))

我收到的回复是表格无法重新提交。

但是当我和Postman休息客户端一起尝试时,我被允许登录。

Csrf令牌的代码:

func getCSRFtoken() (key string) {
    doc, err := goquery.NewDocument(loginUrl)
    if err != nil {
        log.Fatal(err)
    }
    types := doc.Find("input")
    for node := range types.Nodes {
        singlething := types.Eq(node)

        hidden_input, _ := singlething.Attr("type")

        if hidden_input == "hidden" {
            key, _ := singlething.Attr("value")
            return key
        }
    }
    return ""
}
  

goquery.NewDocument是一个http.Get()

我现在的问题是,URL是如何从库中格式化的

1 个答案:

答案 0 :(得分:0)

也许你会更好地使用: (c *Client)PostForm(url string, data url.Values) (resp *Response, err error)

来自net / http,例如http://play.golang.org/p/8D6XI6arkz

使用url.Values中的参数(而不是像现在这样连接字符串。)