Golang“登录该站点并下载xls文件”? [关闭]

问题描述 投票:-6回答:1

告诉我如何使用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.")

}

go
1个回答
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/")
}

© www.soinside.com 2019 - 2024. All rights reserved.