2016-10-24
GitHub で特定ユーザの行動を逐一追いかけたい
アイドルファンがアイドルの言動を逐一追いかけるように、我々凡人 GitHubber が著名な GitHubber や可愛い GitHubber 、その他知り合いの GitHubber などの言動を逐一追いかけたいのは自然なことである。
しかし GitHub ウェブサイトの更新通知機能は貧弱であり、逐一追いかけるには値しない。何とかして追いかけられないか。
最初に結論
- GitHub の Web API を使えば可能。使いこなすにはスクリプトで REST API を叩ける程度の技術力が必要だが。
- GitHub ウェブサイトでもある程度は更新を追えるが、通知されてくる情報が限られており、とても逐一追いかけるレベルではない
Watch じゃダメなの?
GitHub.com にログインし、Aさんのリポジトリrepo1を Watch すると、Notifications画面 にて repo1 の更新情報が表示されるようになる。
が、こいつはあまり使い物にならない。表示されるのは自分に関するイベントのみ。もっというと自分に対してメンションされてたり自分が書いた Issue に対してコメントが書き込まれたりなど自分に絡む更新のみ。
したがって、傍観者として特定リポジトリの更新内容を知りたい、なんてことはできない。
Follow はダメなの?
GitHub.com にログインし、Aさんを Follow すると トップページのタイムライン に「Aが〜〜しました。n hours ago」みたいな一行更新情報が表示される。
が、こいつもあまり使い物にならない。表示される情報は
- UserA created repository hogehoge(リポジトリhogehogeを作った)
- UserA starred hogehoge (リポジトリhogehogeにスターを付けた)
- UserA forked hogehoge to fugafuga(リポジトリhogehogeをfugafugaとしてフォークした)
- UserA made hogehoge public(Aさんがプライベートで運用してたリポジトリhogehogeをパブリックにした)
くらいである。
じゃあどうするの? → GitHub API を使う
GitHub API には Events という API がある。こいつを使うと以下のようなことができる。
- 特定ユーザの更新情報を取得
- 特定ユーザの特定リポジトリに関する更新情報を取得
しかも、ここでいう更新情報とは以下を含む。
- リポジトリ作ったよ(CreateEvent)
- リポジトリ消したよ(DeleteEvent)
- とあるコミットに対してコメントを書いたよ(CommitCommentEvent)
- フォローしたよ(FollowEvent)
- スターを付けたよ(WatchEvent)
DeleteEvent や FollowEvent など GitHub ウェブサイトでは取得されてなかったイベントもキャッチできる。というか、たぶん GitHub 上の行動ならほぼ何でも取得できるように見える。詳しくは Event Types & Payloads | GitHub Developer Guide を参照、取得できるイベントの種類が網羅してある。
ただし、これらイベント情報には以下制約がある。
- 保持されるイベントは直近90日以内あるいは最大300件まで
- 一度の API リクエストで取得できる件数は30件固定
- (後述する)更新有無チェック機能を使う場合、チェック可能な間隔(x-poll-interval)は60秒
ターゲットがいつ何をしたかの過去全てを知ることはできないということだ。Twitter と同じく、今を追うべきなのだろう。
あと、API リクエスト数の削減(APIにもリクエスト数に上限があるので削減できるならしたいですよね)と更新有無の簡易チェックを兼ねることのできる、良い手段があるので使うと便利。名を ETag という。
- Events API で情報をゲットすると、返却されたヘッダ内に ETag という 更新情報のコミットIDみたいなもの がある
- Events API リクエスト時、この ETag をヘッダに指定してリクエストしてやると、もし新たな更新がない場合にステータスコード304 Not Modified を返却してくれる&APIリクエスト数もカウントされない
- ちなみに更新がある場合、直近30件をそのまま取得する(差分のみ取得する機能はない)
……以上で Events API の仕様は一通り述べた(と思う)。
あとは、スクリプトを書いて、めぼしいターゲットの Events を取得&記録する仕組みを構築するのみ。
追伸
この辺の更新情報を捕捉してくれるツールが既にありそうな気がする……。どうなんでしょうね。
簡単に調べた限りではなかった。詳しくは以下。
- Git - GUI Clients
- 大半は GitHub ではなく Git 用のGUI
- GitHub 用は GitHub Desktop - Simple collaboration from your desktop くらいか
- Search ・ github stalker
- Most stars でも 5 だし、マウスカーソルを追いかけるサンプルなど関係のないものも多い
- 1881 https://www.google.co.jp/
- 180 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=14&ved=0ahUKEwjvjYy4x_PPAhVCKpQKHQ10AnQ4ChAWCCowAw&url=http://d.hatena.ne.jp/shouh/20161015/1476489961&usg=AFQjCNFwwjR0PCswjMZgo-o4wOmsppq9hg&bvm=bv.136593572,d.dGo
- 93 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0ahUKEwjHm5KWyvTPAhVMUbwKHULTDBsQFgglMAE&url=http://d.hatena.ne.jp/shouh/20151016/1444999964&usg=AFQjCNG1DQgI7cE6aaLA1bxoJG4evVZkFQ
- 73 https://www.google.co.jp
- 47 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0ahUKEwjPuu624fTPAhVDQLwKHXS7ChgQFggvMAM&url=http://d.hatena.ne.jp/shouh/20150328/1427502581&usg=AFQjCNHTwUdFkzmWKVIgOWDOVt3dj39_6A
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0ahUKEwjV87zDzvTPAhUKU7wKHbhZB9UQFggrMAI&url=http://d.hatena.ne.jp/shouh/20141009/1412860480&usg=AFQjCNGL6gL3MkITzs9aIerZ-NnNZWnrIg
- 25 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&uact=8&ved=0ahUKEwiRjdWH9fTPAhWBVrwKHRf1DI8QFgg2MAQ&url=http://d.hatena.ne.jp/shouh/20140314/1394797082&usg=AFQjCNEEkLxv9kQTn161da0ZuQANRBE4hA&bvm=bv.136811127,d.dGc
- 22 https://www.google.com/
- 19 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&cad=rja&uact=8&ved=0ahUKEwj4_bP-ofXPAhWBwbwKHXrvDzEQFghHMAY&url=http://d.hatena.ne.jp/shouh/20150328/1427501118&usg=AFQjCNHG_NU6kxZCXvIhRj5opycM6pTQBQ&sig2=TLqmiwnKP9cos2k1o8rdtA
- 16 http://search.yahoo.co.jp/