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

Viv*_*ira 17 github

我正在开发一个Web应用程序,需要向GitHub发送大量HTTP请求.在n次成功请求之后,我收到HTTP 403: Forbidden了消息API Rate Limit Exceeded.

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

Jen*_*och 8

为了提高API速率限制,您可以

有多种方法可以做到这一点:

基本Auth + 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

设置Server-2-Server通信的密钥和密钥

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

  • 但这会将速率提高到每小时 5000 个请求。 (2认同)

Chr*_*mer 8

这是一个相对的解决方案,因为限制仍然是每分钟5000个API调用,或者每秒约70个调用,实际上并不是那么多.

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

在取得初步成功之后,我发现GitHub API的功能在调用次数和带宽方面都非常有限,如果你真的想要问一些重要的问题.

因此,我使用不同的方法切换了这个概念:

我没有用GitHub API做任何事情,而是写了一个GitHub Mirror脚本,它能够在不到15分钟的时间内通过pygit2使用我的并行python脚本镜像所有这些repos.

然后,我使用本地存储库和pygit2编写了所有可能的东西.这个解决方案变得快了100倍或更多,因为既没有API也没有带宽瓶颈.

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

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

  • 在本地克隆你感兴趣的所有回购

  • 在本地使用pygit2写一切可能的东西

  • 使用github3.py API或您喜欢的方式编写其他内容,例如公共/私人信息,拉取请求,访问维基页面,问题等.

这样,您可以最大化您的吞吐量,而您现在的限制是程序的质量.(也是非平凡的)

  • 你在哪里发现速率限制是每分钟 5000 个请求?我每小时只能看到 5000 个请求。https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications (3认同)

Viv*_*ira 7

解决方案:添加身份验证详细信息或客户端ID和密码(在GitHub上注册应用程序时生成).

在这里这里找到细节

"如果您需要进行未经身份验证的呼叫,但需要使用与OAuth应用程序关联的更高速率限制,则可以通过查询字符串中的客户端ID和密码发送"

  • 需要注意的是,仅针对服务器-2-服务器通信执行此操作。否则,您的客户端密钥可能会暴露给用户。 (2认同)

Owl*_*Owl 6

虽然似乎仍然无法提高速率限制,但 GitHub 现在有一个 GraphQL API,它可能允许您降低 API 调用。

请记住,GitHub 计算 GraphQL 和 REST API 之间的速率限制的方式不同。GraphQL API 速率限制为 5000 点/小时(不是每小时 5000 次调用!因此 1 次 GraphQL 调用可能会花费您超过 1 点)您可以在此处阅读更多信息:https ://docs.github.com/en/graphql/overview/资源限制(TL;DR 是在查询中获取更多资源 = 更多点)

例如,如果您有与 Christian 的答案类似的用例,而不是对多个端点进行多次调用

GET /repos/{owner}/{repoA}
GET /repos/{owner}/{repoB}
Run Code Online (Sandbox Code Playgroud)

https://api.github.com/graphql您只需使用此查询执行一次 GraphQL 调用即可:

query {
  repoA: repository(owner:"owner", name:"repoA") {
    ...
  }
  repoB: repository(owner:"owner", name:"repoB") {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

根据存储库查询的内容,您仍然可以在一次调用中添加更多存储库,并且每次调用仍使用 1 点。


Kam*_*ski 5

只需在此处创建新的“个人访问令牌”并使用简单的获取方法(当然,如果您使用 JS 进行编码:D)并将 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()
}
Run Code Online (Sandbox Code Playgroud)