タイトルのようなことをしたい。

やりたいこと


自分がレビューしたプルリクの一覧を取りたい

追記 : GitHub API v4 (GraphQL)でのやり方を書きました

環境


GitHub API v3

Reviewイベントの取得の前に…


GitHubのAPIにはユーザや組織のイベントを最大300件(もしくは90日前)まで取得できる下記のようなAPIがあります。

1
2
3
4
https://api.github.com/users/YoshinoriN/events/public

// ちなみにpublicを外してtokenで認証すればプライベートリポジトリのイベントも取得できる
// 最大300件(もしくは90日前)で過去のものは取得できないので注意

このAPIで取得できるイベントの一覧は下記のとおりです。

Event Types & Payloads

これであらかたのイベントは取得できます。取得できるのですが、どうも使ってみたところ、とあるイベントが取得できません。これです。

このReviewのうち Approvalしたやつだけ が上記のAPIで取得できません。コードの指摘を行ったものや、PullReqにコメントしたものは取得できます。しょうがないので個別に取得することにしました。

やりかた


いろいろと調べたところ/search/issuesにクエリパラメータつければ取得できることがわかりました。下記にサンプルが載っています。

Searching issues and pull requests

具体的にいくつか記載します。

特定リポジトリで自分がレビューに関わったもの

repoでリポジトリ指定してreviewed-byに自分のユーザ名を指定すればいいです。

1
https://api.github.com/search/issues?q=is:pr+repo:hexojs/hexo+reviewed-by:YoshinoriN

Approvedになってて、自分がレビューに関わったもの

review:approvedreviewed-byに自分のユーザ名を指定すればいいです。

1
https://api.github.com/search/issues?q=is:pr+review:approved+reviewed-by:YoshinoriN

reviewd-byについて

おそらくですが、下記のようにReviewersでチェックが付いてるやつだと思います。ごめん確認してない。

ページネーション

APIを少し叩けばわかるのですが、最大取得数が決まっています。これは100件のようです。こちらはEventのAPIと異なり、ページネーションを指定できます。下記のように&page=nという形で数値を指定すればそれ以降のデータも取得できます。

1
https://api.github.com/search/issues?p=2&q=is:pr+repo:hexojs/site&page=2

Pagination

余談: なんでこんなことしたいのか?


以下、ただの余談です。自分はGitHubのコントリビューションのコレ ↓ はちょっとどやねん?と思ってます。

理由はいろいろあるのですが、そのうちの一つを書くとIssueの回答ってのは結構パワーのいる作業なのですが、Issueの起票はコントリビューションにカウントされて、回答がコントリビューションにカウントされないのは到底納得がいってなくて、まあ、これは「何をもって回答したとするか」というところが難しいのでカウントしないというのはまあわかるんですよ。

でも、自分としてはIssueの回答に結構パワーを割いていて、ちょっと言い方は悪くなるんですけれども…

  • npmでパッケージインストールできません
  • GitHubPagesで表示できません
  • エラーが出ました(パーミッションエラー)
  • etcetc…

みたいなリポジトリに関係ないIssueが結構な頻度であがってくるんですね。ちなみにこれは別に自分がメンテナやってるものに限った話じゃなくて、見た感じだと万国共通の全リポジトリで普通におこっていることのように思えます。別にそれがあがってくることに対してどうこういうつもりはないんですが、そういうIssueの起票がコントリビューションにカウントされるのに、回答がコントリビューションにカウントされないのはどなんすか…?

なので自分で自分のGitHubの活動をサマライズするものを作ってます。で、その過程でこの問題にぶつかったので調べた結果が今回の記事です。

ちなみに、自分の予定ではGitHubAPIから取得した全てのデータにはイベントIDが付与されていると(いう想定で)開発していたのですが、イベントIDが付与されているのはイベントのAPIを叩いたときのみで、例えばプルリクのAPIから対象のプルリクのイベントIDを取得するといったことはムリ??なようで、どうにもDBの設計からやり直さないといけないという状況になってしまいました…。

昨日、ようやくフロントをReactで…というところだったのですが…。先は長い…。