rcmdnk's blog

20131205_accesstokens_200_200

Homebrewでsearchコマンド等をたくさんしてると使用回数を超えて GitHub API rate limit exceededと言ったエラーが出てしまいます。 その対処法について。

Sponsored Links

アクセス回数制限

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を作ります。

作成された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
export HOMEBREW_GITHUB_API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

.bashrcをGitHubの公開レポジトリで管理したくてこの値を公開したくない時は 別途ホームディレクトリに.brew_api_tokenという名のファイルを作って 上のexport文を書いておいて、.bashrcの中で

1
2
3
4
## brew api token
if [ -f ~/.brew_api_token ];then
  source ~/.brew_api_token
fi

とでも書いておけば.bashrcの方は公開しても大丈夫になります。

Sponsored Links
  1. GitHub API v3

  2. UTC epochなのでMac(BSD系)なら

    $ date -r 13xxxxxxxx
    

    GNU系なら

    $ date -d @13xxxxxxxx
    

    でローカルの時間で分かりやすく表示してくれます。

Sponsored Links

« GNU screenでクリップボードの履歴を使えるようにする 2 Facebookのボタンを「いいね!」から「シェア」に »