有没有办法增加GitHub的API请求速率限制或者完全绕过它?

37

我正在开发一个需要向GitHub发送大量HTTP请求的Web应用程序。在成功执行n次请求后,我会收到HTTP 403: Forbidden错误,伴随着API Rate Limit Exceeded消息。

是否有办法增加GitHub的API速率限制或完全绕过它?


那个限制不是为了防止自动化爬取网站吗? - Pieter B
每天我都会遇到速率限制问题 - 即使我发送了身份验证详细信息。如果有人能够想出更好的解决方法,我非常愿意听取建议。 - balupton
7个回答

22

这是一个相对解决方案,因为限制仍然是每小时5000个API调用, 或者每分钟约80个调用,这真的不算太多。

我正在编写一个工具来比较组织中的350多个仓库并找到它们之间的相关性。 好吧,该工具使用python进行git/github访问,但我认为这不是相关点。

在一些初步成功后,我发现GitHub API的功能在#调用数和带宽方面过于有限, 如果你真的想要向repos提出很多深入的问题。

因此,我改变了概念,使用了不同的方法:

与其完全使用GitHub API,我编写了一个GitHub Mirror脚本, 通过pygit2使用我的并行python脚本能够在不到15分钟的时间内镜像所有这些仓库。

然后,我尽可能地使用本地仓库和pygit2来编写所有东西。 这种解决方案的速度提高了100倍或更多,因为既没有API也没有带宽瓶颈。

当然,这需要额外的努力,因为pygit2 API与我喜欢的GitHub解决方案部分的github3.py有很大区别。

这实际上是我的结论/建议: 处理大量Git数据的最有效方法是:

  • 本地克隆您感兴趣的所有仓库

  • 使用pygit2在本地编写尽可能多的东西

  • 使用github3.py API或您喜欢的其他API编写其他内容, 如公共/私有信息、拉取请求、访问wiki页面、问题等。

这样,您可以最大程度地提高吞吐量,而您的限制现在是程序的质量。(也不是简单的)


这可能是一种方法,但基本上您正在添加一个15分钟的时间延迟,以查看存储库中的内容刷新。这可能是一个问题,如果需要有关文件的实时信息。 - Sameer Sawla
3
你是从哪里得知每分钟的请求限制是5000次的?我只看到每小时的请求限制是5000次。参考链接为https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications - Joozty
在Jens的建议下,吞吐量达到了5000/分钟(2015年测量)。你能否尝试确认这是否仍然如此? - Christian Tismer
1
你尝试过GitHub的GraphQL API吗?你可以在一个调用中获取多个存储库的数据,并潜在地降低速率限制的使用。请查看我的答案 - Owl
不,这对我来说是新的。有趣,谢谢!与此同时,由于我换了工作,这个话题的兴趣很小 :) - Christian Tismer

13
为了增加API速率限制,您可以通过OAuth2令牌对自己进行身份验证,或者使用密钥/密钥来增加未经身份验证的速率限制
有多种方法可以做到这一点: 基本认证+OAuth2Token curl -u <token>:x-oauth-basic https://api.github.com/user 在标头中设置和发送OAuth2Token curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com 将OAuth2Token设置并发送为URL参数

curl https://api.github.com/?access_token=OAUTH-TOKEN

使用访问令牌调用GitHub API。

为服务器之间通信设置密钥和秘密

设置用于服务器之间通信的密钥和秘密。

curl 'https://api.github.com/users/whatever?client_id=xxxx&client_secret=yyyy'

使用客户端ID和客户端密钥调用GitHub API。

假设我有一个Python脚本,它会进行许多GitHub API调用。我还从我的GitHub帐户中获取了一个令牌。现在打开我的Git Bash,我执行其中任何一个命令,然后运行Python脚本,是这样吗? - Nasif Imtiaz Ohi
2
但这将提高速率,仅为每小时5000个请求。 - Sameer Sawla
添加身份验证可能只会将每小时限制增加到5000。如果这还不够怎么办? - Sameer Sawla
您可以在脚本中添加延迟,以避免每小时发送超过5000个请求。 - yoyo
@NasifImtiazOhi,你有没有得到这个问题的答案? - young_souvlaki

11

只需在此处创建新的“个人访问令牌”,并使用简单的fetch方法(如果您正在使用JS编码)并将YOUR_ACCESS_TOKEN替换为您的令牌。

测试的最佳方法是使用Postman

async function fetchGH() {
    const response = await fetch('https://api.github.com/repos/facebook/react/issues', {
        headers: {
            'Authorization': 'token YOUR_ACCESS_TOKEN',
        }
    })
    return await response.json()
}

这个是否存在与OP所描述的相同的速率限制问题,就像对他们API的任何其他调用一样? - milosmns

9
解决方案:添加身份验证详细信息或客户端ID和秘钥(在您在GitHub上注册应用程序时生成)。
找到详细信息这里这里
“如果您需要进行未认证的调用,但需要使用与您的OAuth应用程序关联的更高速率限制,则可以在查询字符串中发送客户端ID和秘钥”。

2
重要提示:仅在服务器之间通信时执行此操作。否则,您的客户端密钥可能会暴露给用户。 - Braden Steffaniak
1
即使您包含了凭据,速率限制也是每小时5000个。如果这还不够怎么办? - Sameer Sawla

5
尽管目前似乎还没有增加速率限制的方法,但GitHub现在拥有GraphQL API,它有可能允许您降低API调用次数。请注意,GitHub在GraphQL和REST API之间计算速率限制的方式不同。 GraphQL API速率限制为每小时5000个点(不是每小时5000个调用!因此,一个GraphQL调用可能会花费您多个点)您可以在此处阅读更多信息:https://docs.github.com/en/graphql/overview/resource-limitations(简而言之,查询中获取的更多资源=更多点数)。例如,如果您与Christian的答案有类似的用例,可以使用GraphQL API一次性进行多个端点的调用。
GET /repos/{owner}/{repoA}
GET /repos/{owner}/{repoB}

你可以通过以下查询一次GraphQL调用到"https://api.github.com/graphql":
query {
  repoA: repository(owner:"owner", name:"repoA") {
    ...
  }
  repoB: repository(owner:"owner", name:"repoB") {
    ...
  }
}

根据仓库的查询情况,你可以在一个调用中添加更多的仓库,每个调用仍然只使用1点。


2

1
我在jenkins的多分支流水线配置中观察到了这个错误。 我已经将源选择为GitHub。更改为git并通过guthub repo详细信息传递后,它可以工作。(在jenkins中配置了git可执行路径,并设置了用于身份验证GitHub的凭据)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接