Download 从谷歌硬盘下载公共文件-Golang

Download 从谷歌硬盘下载公共文件-Golang,download,go,google-drive-api,Download,Go,Google Drive Api,我有一个zip文件存储在谷歌硬盘上(它是公开共享的)。我想知道如何在Golang下载它。当前代码只创建了一个名为“file.zip”的空白文件: 这似乎是一个错误,无论是谷歌驱动器或与golang,我不知道哪一个 问题是,您提供的第一个URL重定向到第二个URL,看起来像这样 https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh88

我有一个zip文件存储在谷歌硬盘上(它是公开共享的)。我想知道如何在Golang下载它。当前代码只创建了一个名为“file.zip”的空白文件:


这似乎是一个错误,无论是谷歌驱动器或与golang,我不知道哪一个

问题是,您提供的第一个URL重定向到第二个URL,看起来像这样

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/*/0B2Q7X-DUTUBEBLYSVH1ZS1IATQ?h=16653014193614665626&e=下载

请注意URL中的
*
,该URL根据法律规定是合法的。然而,它确实有一个特殊的意义,作为一个delimeter

Go使用编码为
%2A
*
获取URL,如下所示

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/%2A/0B2Q7X-DUTUBEBLYSVH1ZS1IATQ?h=16653014193614665626&e=下载

谷歌对其回复为“403禁止”

谷歌似乎没有将
%2A
解析为
*

根据URI方案中使用的保留字符(其中
*
是其中之一):如果需要将该字符用于其他目的,则必须对该字符进行百分比编码

我不是这方面的专家,不足以说谁是对的,但既然问题的两部分都是谷歌写的,那肯定是他们的错

我找到了解决办法。 用途:ID


除了:ID

之外,我还在调查发生这种情况的原因,同时您可以使用以下解决方法:

当发生重定向时,将调用CheckRedirect,您可以添加不透明路径以避免对URL进行编码


Francesc

错误变量有什么?我尝试在本地运行您的代码。响应状态为403禁止。我不知道是什么原因造成的。此外,切勿将“error”用作变量。你在跟踪宇宙的“错误”类型。嗯,为什么它会这么说?我公开分享了这个文件。感谢大家对错误变量的关注,我将把它改为err。谷歌可能正在做一些与浏览器交互的事情。也许他们发现你没有使用浏览器,并以此为由拒绝了你。谢谢你的解释。我找到了解决办法。我很快就会发布。现在是2015年,谷歌仍然不接受
%2A
。追踪这个问题是一次可怕的经历,因为流量是用HTTPS保护的。谢谢你的回答,真的很有帮助!非常感谢你!!!我在网上搜索了两个小时来解决这个问题,你是唯一一个这样做的人。你能提供你答案的来源吗?对不起,那是很久以前的事了。我想这是一个谷歌帮助页面,它与其他东西有关,我想我会看看它是否也适用于此,它确实适用于CheckRedirect。仅供参考,现在就使用驱动器url:另外,在共享url中使用ID,而不是实际的文件ID。
package main

import (
    "fmt"
    "io"
    "net/http"
    "os"
)

func main() {
    url := "https://docs.google.com/uc?export=download&id=0B2Q7X-dUtUBebElySVh1ZS1iaTQ"
    fileName := "file.zip"
    fmt.Println("Downloading file...")

    output, err := os.Create(fileName)
    defer output.Close()

    response, err := http.Get(url)
    if err != nil {
        fmt.Println("Error while downloading", url, "-", eerrror)
        return
    }
    defer response.Body.Close()

    n, err := io.Copy(output, response.Body)

    fmt.Println(n, "bytes downloaded")
}