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 13xxxxxxxxGNU系なら
$ date -d @13xxxxxxxxでローカルの時間で分かりやすく表示してくれます。 ↩