Ruby
GitHub
api
Octokit
paging

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

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