Homebrewでsearch
コマンド等をたくさんしてると使用回数を超えて
GitHub API rate limit exceeded
と言ったエラーが出てしまいます。
その対処法について。
アクセス回数制限
GitHubでは認証無しのアクセスについて、同じIPアドレスから1時間で60回までと 制限がかかっています1。
Homebrewで沢山searchコマンドなんかを使ってると、
$ brew search
Error: GitHub API rate limit exceeded for xxx.xxx.xxx.xx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
You may want to create an API token: https://github.com/settings/applications
and then set HOMEBREW_GITHUB_API_TOKEN.
こんな感じでもうGitHubにアクセス出来なくなります (メッセージにもあるようにTokenを作って回避する方法は下に)。
現在どのくらい残ってるかは以下のコマンドで確かめられます。(一回消費しますが。。。)
$ curl -i https://api.github.com/users/whatever
HTTP/1.1 200 OK
Server: GitHub.com
Date: ---
Content-Type: application/json; charset=utf-8
Status: 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 44
X-RateLimit-Reset: 13xxxxxxxx
...
60回の制限中16回消費してるの図、です。
1時間毎の制限で、X-RateLimit-Reset
にある時間2にリセットされます。
ただし、これは全てのGitHubへのアクセスに関係するので、 他の所で同じ様なアクセスをしてるものがあると影響が出てしまいます。
これを回避するために、HomebrewではGitHubde で作れるAccess Tokenを渡せる様になってるので、これを作って渡してあげます。
GitHubでAccess Tokenを作る
GitHubで右上にあるAccount Settings
へ行くと
Applications
という項目があるので、そこから
Create new token
へ行きます。
適当な名前を入れてTokenを作ります。
追記: 2017/05/15
現在はTokenを作る際にアクセス出来るスコープを選択するようになっていて
下にGenerate token
というボタンがあります。
これらは基本的にユーザーのプライベートなものへのアクセスなので、
今回やるHomebrewでのbrew search
に関しては何もチェックせずに
そのままGenerate token
を押して作ればOKです。
追記ここまで
作成されたTokenがコピーできる様になってるので、これをコピー。
このTokenは作成後ページをリロードするともう表示されずに値がわからなくなるので 作った直後に値をコピーして取っておいて下さい (取れなかったらまた直ぐに消して作りなおせば良いだけですが)。
この値を使ってアクセスすると、1時間に5000回まで許可される様になります。 調べるには上のcurlコマンドにTokenをheader情報で足してあげてみます。
$ curl -i -H "Authorization: token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://api.github.com/users/whatever
HTTP/1.1 200 OK
Server: GitHub.com
Date: ---
Content-Type: application/json; charset=utf-8
Status: 200 OK
X-RateLimit-Limit: 5000
X-RateLimit-Remaining: 4999
X-RateLimit-Reset: 13xxxxxxxx
...
と今度は5000回の制限になっています(xxxxxxx
の部分にコピーしたTokenの値を入れて下さい)。
HomebrewにTokenを渡す。
HOMEBREW_GITHUB_API_TOKEN
という環境変数にTokenを指定してあげると、
HomebrewはそのTokenを使用してGitHubへアクセスする様になります。
HomebrewがこのTokenを使ってGitHubにアクセスする様になります。
こんな感じで.bashrc
に書いておけばOK。
1
|
|
.bashrc
をGitHubの公開レポジトリで管理したくてこの値を公開したくない時は
別途ホームディレクトリに.brew_api_token
という名のファイルを作って
上のexport
文を書いておいて、.bashrc
の中で
1 2 3 4 |
|
とでも書いておけば.bashrc
の方は公開しても大丈夫になります。
-
UTC epochなのでMac(BSD系)なら
$ date -r 13xxxxxxxx
GNU系なら
$ date -d @13xxxxxxxx
でローカルの時間で分かりやすく表示してくれます。 ↩