告诉我如何使用Golang登录该网站。已获得下载xls文件,但是为了在Excel表中包含数据,您需要登录到该站点。该站点位于公司的服务器上。如果您知道如何做。
例如,我用来执行此操作的VBA代码。
Set oFields = CreateObject("Scripting.Dictionary")
With oFields
.Add "login", "sdiscor"
.Add "password", "sdiscor"
End With
For Each sName In oFields
oFields(sName) = sName & "=" & EncodeUriComponent(oFields(sName))
Next
sPayLoad = Join(oFields.Items(), "&")
With CreateObject("MSXML2.XMLHTTP")
.Open "POST", "http://effect.gvc.oao.rzd/cgi_bin/effect_access.pl?", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Content-Length", LenB(sPayLoad)
.Send (sPayLoad)
Do While .readyState <> 4
DoEvents
Loop
webLink = "http://effect.gvc.oao.rzd/effect/table/***&LOGIN=&PASSWORD="
vLocalFile = ThisWorkbook.Path & "\SIS-Effect.xls"
.Open "GET", webLink, True
.Send
Do While .readyState <> 4
DoEvents
Loop
oResp = .responseBody
vFF = FreeFile
If Dir(vLocalFile) <> "" Then Kill vLocalFile
Open vLocalFile For Binary As #vFF
Put #vFF, , oResp
Close #vFF
End With
谢谢leolara !!! 最终代码
func main() {
urlLogin := "http://effect.gvc.oao.rzd/cgi_bin/effect_access.pl?"
urlDownload := "http://effect.gvc.oao.rzd/effect/table/OZODO10U.XLS?DAT=2019.03.04&LOGIN=&PASSWORD="
cookieJar, _ := cookiejar.New(nil)
client := &http.Client{Jar: cookieJar,}
_, err := client.PostForm(urlLogin,
url.Values{"login": {"sdiscor"}, "password": {"sdiscor"}})
if err != nil {
fmt.Println("Error while downloading", urlLogin, "-", err)
return
}
fileName := "1.xls"
fmt.Println("Downloading", urlDownload, "to", fileName)
output, err := os.Create(fileName)
if err != nil {
fmt.Println("Error while creating", fileName, "-", err)
return
}
defer output.Close()
resp, err := client.Get(urlDownload)
if err != nil {
fmt.Println("Error while downloading", urlDownload, "-", err)
return
}
defer resp.Body.Close()
n, err := io.Copy(output, resp.Body)
if err != nil {
fmt.Println("Error while downloading", urlDownload, "-", err)
return
}
fmt.Println(n, "bytes downloaded.")
}
答案 0 :(得分:2)
我不知道VBA,但是在我看来,您正在使用凭据执行HTTP POST,然后您正在执行HTTP GET以获取您要查找的文件。我猜您正在使用的类会在请求之间保留cookie,这就是身份验证的工作方式。
假设在Go语言中,您将使用库https://golang.org/pkg/net/http/cookiejar/来保留cookie,并使用https://golang.org/pkg/net/http/来执行实际的请求。
您每次传递相同的饼干罐。
沿这些方面的东西(不完全或未经检查):
package main
import (
"net/http"
"net/http/cookiejar"
)
func main() {
cookieJar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: cookieJar,
}
resp, err := http.PostForm("http://example.com/loginform",
url.Values{"login": {"sdiscor"}, "password": {"sdiscor"}})
resp, err := client.Get("http://example.com/")
}