Edited at

Github APIの検索でページングを利用する

More than 1 year has passed since last update.

RubyからGithub APIへアクセスするためにOctokitを利用する。OctokitはGithub APIのRubyラッパー。


Gemfile

直接使うgemはOctokitのみ。

gem 'octokit'


Github APIアクセストークンの取得

scopesは公開情報へアクセスするだけなら何も指定しなくてもよい。noteは作成したトークンの名前になるので分かりやすいものにした方が後で便利。

require 'octokit'

client = Octokit::Client.new(
:login => 'Github ID',
:password => 'PASS')

token = client.create_authorization(
:scopes => ["user"], :note => "トークン名",
:headers => { "X-GitHub-OTP" => "二段階認証の数字" })

# token.tokenは今後使うので保存しておく

一度アクセストークンを作れば次回以降は下記のようにクライアントオブジェクトを作成できる。

client = Octokit::Client.new(access_token: token.token)


検索結果のページング

Github APIで検索のページングを利用するには、クエリパラメーターのpageの値を変えていけばよい。

  repos = []

page = 1

loop do
resource = nil
retry_count = 0

begin
resource = client.search_repositories("stars:1000..3000", page: page, per_page: 100)
repos.concat resource.items
rescue Octokit::TooManyRequests => e
retry_count += 1
if retry_count <= 3
sleep client.rate_limit.resets_in
retry
else
puts "Retries exhausted: #{e.inspect}"
break
end
rescue => e
puts "Something error: #{e.inspect}"
break
end

break unless client.last_response.rels[:next]
page += 1
end


注意点:同じ検索条件で取得できる結果は1000件まで

上記の検索条件では1000件(10回のループ)でページングが終わってしまう。これはGithub APIの制限によるもの。

この制限を回避するには、ページングが終わるたびに検索条件を少し変えるとよい。(リポジトリの作成日を検索条件に入れるなど)


参考リンク

https://developer.github.com/v3/search/

https://help.github.com/articles/understanding-the-search-syntax/

https://github.com/octokit/octokit.rb