go-colly:将数据切片到 POST 请求中

问题描述 投票:0回答:1

我想使用此网站完成的计算:http://www.isewase.de/dwz/.

因此,我在网站本身输入数据时检查了 POST 请求,例如:

dwz_name: 1000-100
geb: 1990
punkte: 1
dwz[]: 1300
dwz[]: 1400
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
dwz[]: 
Los: DWZ berechnen!
name: 
kennwort: 

或(查看来源):

dwz_name=1000-100&geb=1990&punkte=1&dwz%5B%5D=1300&dwz%5B%5D=1400&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&dwz%5B%5D=&Los=DWZ+berechnen%21&name=&kennwort=

所以我尝试用这个小程序复制它:

// test.go
package main

import (
    "fmt"
    "strings"

    "github.com/gocolly/colly"
)

func main() {
    dwz := [18]string{
        "1300",
        "1400",
    }

    dwzStr := strings.Join(dwz[:], "&dwz[]=") // (a)
    // dwzStr := strings.Join(dwz[:], "&dwz%5B%5D=") // (b)

    c := colly.NewCollector()
    c.OnHTML("body > form > fieldset:nth-child(4) > dl > dd:nth-child(8)", func(h *colly.HTMLElement) {
        fmt.Println(h.Text)
    })

    c.Post("http://www.isewase.de/dwz/", map[string]string{
        "dwz_name": "1000-100",
        "geb":      "1900",
        "punkte":   "1",
        "dwz[]":    dwzStr,
        "Los":      "DWZ berechnen!",
        "name":     "",
        "kennwort": "",
    })
}

结果(

(a)
(b)

> go run test.go
1040 (+40)

这正是您在使用

1300
输入第一个选项时从网站收到的结果。

但是由于

colly.Post
想要
map[string]string
作为第二个参数,我不知道如何以另一种方式将数组/切片传递到 POST 请求中。

go http-post go-colly
1个回答
1
投票

您应该能够使用

c.Request
,以便您可以手动设置请求正文:

form := url.Values{}
form.Add("dwz_name", "1000-100")
form.Add("geb", "1900")
form.Add("punkte", "1")
form.Add("Los", "DWZ berechnen!")
form.Add("name", "")
form.Add("kennwort", "")
form.Add("dwz[]", "1300")
form.Add("dwz[]", "1400")
header := http.Header{}
header.Add("Content-Type", "application/x-www-form-urlencoded")

err := c.Request(
    http.MethodPost, 
    "http://www.isewase.de/dwz/", 
    strings.NewReader(form.Encode()), 
    nil,
    header,
)
© www.soinside.com 2019 - 2024. All rights reserved.