多くのHTTPリクエストをGitHubに送信する必要があるWebアプリケーションを開発しています。n回のリクエストが成功するHTTP 403: Forbidden
と、メッセージが表示されますAPI Rate Limit Exceeded
。
APIレート制限を増やす方法、またはGitHubでそれを完全にバイパスする方法はありますか?
多くのHTTPリクエストをGitHubに送信する必要があるWebアプリケーションを開発しています。n回のリクエストが成功するHTTP 403: Forbidden
と、メッセージが表示されますAPI Rate Limit Exceeded
。
APIレート制限を増やす方法、またはGitHubでそれを完全にバイパスする方法はありますか?
これは相対的な解決策です。これは、制限が1時間あたり5000 API呼び出し、または1分あたり最大80呼び出しであり、実際にはそれほど多くないためです。
私は、組織内の350を超えるリポジトリを比較し、それらの相関関係を見つけるためのツールを作成しています。わかりました。ツールはgit/githubアクセスにPythonを使用しますが、ここではそれは適切なポイントではないと思います。
最初の成功の後、GitHub APIの機能は、本当にリポジトリに多くの深い質問をしたい場合は、呼び出しの数と帯域幅が制限されすぎていることがわかりました。
したがって、別のアプローチを使用して、概念を切り替えました。
GitHub APIですべてを行う代わりに、pygit2を介して並列Pythonスクリプトを使用して、15分以内にすべてのリポジトリをミラーリングできるGitHubミラースクリプトを作成しました。
次に、ローカルリポジトリとpygit2を使用して可能な限りすべてを記述しました。APIも帯域幅のボトルネックもなかったため、このソリューションは100倍以上高速になりました。
もちろん、これには余分な労力がかかりました。pygit2APIは、GitHubソリューションの部分で好んだgithub3.pyとはかなり異なるためです。
そして、それが実際の私の結論/アドバイスです。多くのGitデータを処理する最も効率的な方法は次のとおりです。
興味のあるすべてのリポジトリをローカルに複製します
ローカルでpygit2を使用して可能なすべてを書く
github3.py APIまたはお好みのものを使用して、パブリック/プライベート情報、プルリクエスト、Wikiページへのアクセス、問題などの他のものを記述します。
このようにして、スループットを最大化できますが、制限はプログラムの品質になります。(これも重要です)
APIレート制限を増やすために、
OAuth2トークンを介してGithubで自分自身を認証するか
キー/シークレットを使用して、認証されていないレート制限を増やします。
これを行うには複数の方法があります。
curl -u <token>:x-oauth-basic https://api.github.com/user
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com
OAuth2TokenをURLパラメータとして設定して送信する
curl https://api.github.com/?access_token=OAUTH-TOKEN
curl 'https://api.github.com/users/whatever?client_id=xxxx&client_secret=yyyy'
ここで新しい「パーソナルアクセストークン」を作成し、単純なフェッチ方法を使用して(もちろん、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()
}
レート制限を引き上げる方法はまだないようですが、GitHubにはGraphQL APIが搭載されており、API呼び出しを減らすことができる可能性があります。
GitHubはGraphQLとRESTAPIの間でレート制限を異なる方法で計算することに注意してください。GraphQL APIのレート制限は5000ポイント/時間です(1時間あたり5000コールではありません!したがって、1回のGraphQLコールは1ポイント以上かかる可能性があります)詳細については、https ://docs.github.com/en/graphql/overview/を参照してください。リソースの制限(TL; DRはクエリでフェッチするリソースが多い=ポイントが多い)
たとえば、複数のエンドポイントに対して複数の呼び出しを行う代わりに、クリスチャンの答えと同様のユースケースがある場合
GET /repos/{owner}/{repoA}
GET /repos/{owner}/{repoB}
https://api.github.com/graphql
このクエリを使用して、 1つのGraphQL呼び出しを実行できます。
query {
repoA: repository(owner:"owner", name:"repoA") {
...
}
repoB: repository(owner:"owner", name:"repoB") {
...
}
}
リポジトリクエリの内容に応じて、1回の呼び出しでさらに多くのリポジトリを追加し、各呼び出しで1ポイントを使用することができます。
jenkinsでのmultibrnachパイプライン構成中にこのエラーを確認しました
ソースをgithubとして選択しました。それをgitに変更し、guthubリポジトリの詳細を渡した後、それは機能しました。(git実行可能パスをjenkinsで構成し、githubへの認証用にクレデンシャルを設定します)
「アーカイバになる」ことを提案してもいいですかhttps://github.com/github/site-policy/issues/56
ところで、「非アーカイバ」でさえ、公開データにアクセスできます...
すべてのツールはgithubにあります。