问题描述
使用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
,效率要高得多。还建议缓存数据,而不是多次请求。
如果您做完所有这些事情,您可能会发现您的请求有效。