Github 您在 Go Http 客户端中访问此站点已被限制
Github Your access to this site has been restricted in Go Http client
我 运行 在使用 Go 的 http 客户端从 Github 下载 zip 或 tar.gz 文件时遇到了问题。
我收到 403 消息“您对该网站的访问已被限制”。
虽然 Curl 工作正常。
我在 us-west-2 区域的 AWS 上的一个 EC2 实例中 运行。特别是,
Ubuntu 服务器 16.04 LTS (HVM),SSD 卷类型 - ami-0807918df10edc141(64 位 x86)/ami-0c75fb2e6a6be38f6(64 位 Arm)
信息
- Go:go1.15.linux-amd64(也在 14 上试过了)
- AWS - Ubuntu 服务器 16.04 LTS (HVM),SSD 卷类型 - ami-0807918df10edc141(64 位 x86)/ ami-0c75fb2e6a6be38f6(64 位 Arm)
- 端点:https://github.com/kubeflow/manifests/archive/v1.0.2.tar.gz(我也和其他人一起尝试过,none 有效)
要重现的示例代码:
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
header,因为这样可以将您的行为与其他人的行为区分开来。 (毕竟有很多人使用 Go。)您应该通过 API 而不是直接通过 github.com
获取您正在使用的 URL。您还应该尽可能进行身份验证(例如,使用令牌),因为 GitHub 会给经过身份验证的请求更高的限制,如果您造成问题,GitHub 可以联系您。最后,您应该实施适当的 rate-limiting 和限制,这样您就不会发出太多请求并在收到 403、429 或 5xx 错误时退出或完全停止。
如果您需要为同一个存储库下载许多档案,请克隆它并使用 git archive
,这样效率更高。还建议缓存数据而不是多次请求它。
如果您执行所有这些操作,您可能会发现您的请求有效。
我 运行 在使用 Go 的 http 客户端从 Github 下载 zip 或 tar.gz 文件时遇到了问题。 我收到 403 消息“您对该网站的访问已被限制”。
虽然 Curl 工作正常。
我在 us-west-2 区域的 AWS 上的一个 EC2 实例中 运行。特别是,
Ubuntu 服务器 16.04 LTS (HVM),SSD 卷类型 - ami-0807918df10edc141(64 位 x86)/ami-0c75fb2e6a6be38f6(64 位 Arm)
信息
- Go:go1.15.linux-amd64(也在 14 上试过了)
- AWS - Ubuntu 服务器 16.04 LTS (HVM),SSD 卷类型 - ami-0807918df10edc141(64 位 x86)/ ami-0c75fb2e6a6be38f6(64 位 Arm)
- 端点:https://github.com/kubeflow/manifests/archive/v1.0.2.tar.gz(我也和其他人一起尝试过,none 有效)
要重现的示例代码:
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
header,因为这样可以将您的行为与其他人的行为区分开来。 (毕竟有很多人使用 Go。)您应该通过 API 而不是直接通过 github.com
获取您正在使用的 URL。您还应该尽可能进行身份验证(例如,使用令牌),因为 GitHub 会给经过身份验证的请求更高的限制,如果您造成问题,GitHub 可以联系您。最后,您应该实施适当的 rate-limiting 和限制,这样您就不会发出太多请求并在收到 403、429 或 5xx 错误时退出或完全停止。
如果您需要为同一个存储库下载许多档案,请克隆它并使用 git archive
,这样效率更高。还建议缓存数据而不是多次请求它。
如果您执行所有这些操作,您可能会发现您的请求有效。