Python
GitHub

GitHub APIのステータス表示で遊ぼう

More than 3 years have passed since last update.

Travis CI等を使っているとPull Requestでこういう表示を見たりしますよね。

ss.png

こういうのナウくてかっこいいいし、Travis CIでやってるんだったら自分でもできるでしょということで、GitHub APIのお試しも兼ねて遊んでみました。


とりあえずアプリケーション登録

OAuthでやりたいので、まずはアプリケーションを登録してClient IDとClient Secretをもらいましょう。

GitHubのページ右上からアカウントの設定に飛んで、右カラムの"Applications"から"Register New Application"をクリック。

項目は特に難しいところもないので適当に埋めちゃいましょう。

ss2.png

登録すると画面が遷移して、左側に"Client ID"と"Client Secret"が表示されます。


Python + githubpyで

アプリケーションの登録が終わったら、次はコードから認証処理をやります。

言語はPython、ライブラリは何でもいいんですが、githubpyというライブラリでいくことに。

https://github.com/michaelliao/githubpy

pip install git+https://github.com/michaelliao/githubpy

アクセストークンを取得するまで認証は、ほぼgithubpyのREADMEに記載されている方法でOK。

ただし認証時にはそのアプリケーションで使いたいAPIに応じて、適切に権限をリクエストしておく必要があります。

https://developer.github.com/v3/oauth/#web-application-flow

https://developer.github.com/v3/oauth/#scopes

これは認証時に scope というパラメータで、コンマ区切りで指定するようです。今回はステータスで遊びたいので、 repo:status をリクエスト。

というわけでこんなコードでアクセストークンを取得します。

認証ページのURLを表示して、得られたコードを手入力する簡単なやつです。


get_access_token.py

# -*- coding: utf-8 -*-

import github

# client_id, client_secretはアプリケーション登録時のものを使う
# scopeの指定も忘れずに
gh = github.GitHub(
client_id = 'YOUR CLIENT ID',
client_secret = 'YOUR CLIENT SECRET',
scope = 'repo:status'
)

# 認証時にはCSRF攻撃対策用にランダムな文字列が必要らしいので、適当に用意してあげてくださいね
st = 'CREATE YOUR RANDOM STRING'
print 'Please authorize at: ' + gh.authorize_url( state = st )

# コールバック先のURLから拾って手入力
code = raw_input( 'Please input code: ' )

print 'Access token: ' + gh.get_access_token( code, st )


出力されたURLに遷移するとこんな画面が表示されます。

ss3.png

権限が scope に応じたものになってますね。

"Authorize application"をクリックすると、コールバックURLで指定したURLに code パラメータ付きで遷移します。

自分は空欄でアプリケーションを登録していたんですが、その場合は"Homepage URL"で指定したページに遷移しました。

あとは code パラメータの文字列をスクリプトに入力してあげればアクセストークンが出力されます。


ステータスをいじろう

アクセストークンを取得したらいよいよAPIを叩くことができます!

適当なリポジトリをおっ立てて、Pull Requestを作成しておきましょう。

ここでは自分(bonono)のアカウントで"github-api-test"リポジトリを作成して、"fix/readme"ブランチでPull Requestを作成しました。

ss5.png

さて、今回使うAPIは2つ。Pull Request一覧を取得するAPIとステータスを更新するAPIです。

https://developer.github.com/v3/pulls/#list-pull-requests

https://developer.github.com/v3/repos/statuses/

githubpyを使っていればAPIを叩くのはすごく簡単です。


update_status.py

# -*- coding: utf-8 -*-

import github
import sys

# さっき取得したアクセストークンを使用
gh = github.GitHub( access_token = 'YOUR ACCESS TOKEN' )

# 適当なPull RequestのHEADのハッシュ1つ
pulls = gh.repos( ).bonono( )( 'github-api-test' ).pulls( ).get( )
sha = pulls[ 0 ][ 'head' ][ 'sha' ]

# ステータスを更新!
gh.repos( ).bonono( )( 'github-api-test' ).statuses( )( sha ).post(
state = sys.argv[ 1 ],
target_url = 'https://twitter.com/bonon0',
description = sys.argv[ 2 ],
context = 'github-api-test'
)


引数を2つとり、1つ目をステータスとして、2つ目を説明文として扱ってステータスを更新します。

ステータス更新用のAPIは、以下の4つのパラメータを取ります。

まず state パラメータは4つの中から以下の4つの中から選択できます。


  • pending

  • success

  • error

  • failure

これで見栄えを変更できるわけですね。

target_url は、右側の"Details"ボタンのリンク先を指定できるパラメータです。

description はまんまステータス表示内の文字列を指定します。

context は複数のアプリケーションによってステータスが変更される場合に、この指定毎にステータスを持っておくラベルの役割を果たすみたいです。

そんなに不可解なパラメータもないですね。

では試しにステータスを"pending"でAPIを叩いてみましょう。

python update_status.py pending "おでん食べてからマージしない...?"

変わった!

ss6.png

ハードコードしてますが、 context パラメータを切り替えると複数のステータスも持てます。

ss7.png


結論

GitHub API楽しい!!!!