Github您在Go Http客户端中对该网站的访问受到限制

问题描述

使用Go的http客户端从Github下载zip或tar.gz文件时,我遇到了问题。 我收到403消息,提示“您对此网站的访问受到限制”。

卷曲可以正常工作。

我正在us-west-2区域的AWS的EC2实例中运行它。特别是

Ubuntu Server 16.04 LTS(HVM),SSD卷类型-ami-0807918df10edc141(64位x86)/ ami-0c75fb2e6a6be38f6(64位Arm)

信息

  • 转到:go1.15.linux-amd64(也在14上尝试过)
  • AWS-Ubuntu Server 16.04 LTS(HVM),SSD卷类型-ami-0807918df10edc141(64位x86)/ ami-0c75fb2e6a6be38f6(64位Arm)
  • 端点:https://github.com/kubeflow/manifests/archive/v1.0.2.tar.gz(我也尝试过与其他人一起尝试,但均无济于事)

要复制的示例代码

package main

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

func main() {
    endpoint := "https://github.com/kubeflow/manifests/archive/v1.0.2.tar.gz"

    // or https://api.github.com/repos/kubeflow/manifests/zipball/v0.12.0

    // Get the data
    resp,err := http.Get(endpoint)
    if err != nil {
        fmt.Printf("[error] %v",err)
        return
    }
    defer resp.Body.Close()

    respData,err := IoUtil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("[error] %v",err)
        return
    }

    // Returns a 403 and html error page
    fmt.Printf("Resp:\n%v\n",string(respData))
}

注意:上面的代码在我的本地计算机上工作正常,似乎只是在aws实例中停止了。

谢谢!

解决方法

该特定错误消息意味着GitHub限制了您,因为您发出的请求与正在进行的滥用模式相匹配。 GitHub阻止了这种模式,因为它引起其他用户的可用性担忧。

您应始终使程序使用自定义的User-Agent标头,因为这会将您的操作与其他人的操作区分开。 (毕竟,很多人都使用Go。)您应该通过API而不是直接通过github.com来获取正在使用的URL。您还应在可能的情况下进行身份验证(例如,使用令牌),因为GitHub会给已身份验证的请求提供更高的限制,如果您遇到问题,则GitHub可以与您联系。最后,您应该实施适当的速率限制和限制,以免发出过多的请求,并且在遇到403、429或5xx错误时退回或完全停止。

如果您需要为同一个存储库下载许多归档文件,请克隆它并使用git archive,效率要高得多。还建议缓存数据,而不是多次请求。

如果您做完所有这些事情,您可能会发现您的请求有效。