何を作るか?
Python で GitHub API を利用するアプリケーションを作るときは、GitHub API を実行して情報取得する部分を、1 つのモジュールとして切り出しておくと全体のコードがすっきりします。
ここでは、実装例として GitHubApi
というクラスを作り、次のようなことを行えるようにします。
get_members()
やget_issues()
といった直感的な API で GitHub の情報を取得できるようにする- オプションでプロキシや Personal Access Token を指定できるようにする
- ページネーションによる連続アクセスで、多くの情報を一度に取得できるようにする
GitHub の REST API に関しては、下記の記事を参照してください。
GitHubApi クラスを実装する
ここで紹介する GitHubApi
クラスを使うと、次のようなシンプルなコードで GitHub API を呼び出して、その結果を Python のオブジェクトとして取得することができます。
# ユーザー情報を取得する
user = api.get_user('maku77')
print(user['login'])
下記は、GitHubApi
クラスの実装例です。
最後の方にある get_xxx
系のメソッドが、GitHub API を呼び出すための public メソッドです。
同じようにメソッドを追加していけば、いろいろな GitHub API に対応することができます。
どのような API があるかは、GitHub REST API v3 のサイト を参照してください。
ページネーション処理
GitHub API v3 でリポジトリの一覧などを取得すると、デフォルトでは 30 件ずつしか結果を返してくれません。
URL 末尾のクエリパラメーターで per_page=100
と指定すれば、100 件までは一度に取得できるのですが、100 件を超えるすべての情報を取得したいときは、ページネーションの仕組み を使って何度かに分けて取得する必要があります。
次ページの情報を取得するときは、page=2
のようにクエリ指定する必要があるのですが、次ページが存在する場合は HTTP レスポンスの Link
ヘッダーに次ページのアドレスが含まれているので、このアドレスを使って繰り返しアクセスするのがよいでしょう。
上記のサンプルコードでは、__get_json
メソッドの中で次のようにページネーション処理しています。
次のページがある場合は、再帰的に __get_json
を呼び出し、その結果を json_obj
配列に結合しています。
# ページネーションによる繰り返し取得
if paginate:
next_link = self.__get_next_link(res.info())
if next_link:
json_obj.extend(self.__get_json(next_link))
GitHubApi クラスの使用例いろいろ
下記は、GitHubApi
クラスを使って、いろいろな情報を取得するサンプルコードです。
from github import GitHubApi
api = GitHubApi()
# ユーザー情報を取得
user = api.get_user('maku77')
print(user['login'])
print(user['blog'])
print(user['company'])
# 指定した組織のリポジトリ一覧を取得します
repos = api.get_org_repos('sony')
for repo in repos:
print(repo['name'])
print(repo['full_name'])
print(repo['description'])
print(repo['html_url'])
print()
# 指定した組織のメンバーリストを取得
members = api.get_members('sony')
for member in members:
print(member['login'])
# 指定したリポジトリの Issue 一覧を取得します(open 状態のもの)
issues = api.get_issues('sony', 'nnabla')
for issue in issues:
print(issue['title'])
# 指定したリポジトリの Issue 一覧を取得します(close 状態のものも取得)
issues = api.get_issues('sony', 'nnabla', params={'state': 'all'})
for issue in issues:
print(issue['title'])
プロキシや Personal Access Token を指定してアクセスする必要がある場合は、GitHubApi
コンストラクタのオプションで次のように指定します。
options = {
'proxy': 'proxy.example.com:80',
'token': 'a0709c8d0ac21812d9c4b8511298b33ec0fd2813'
}
api = GitHubApi(options)
ここでは、取得した情報のうち、ごく一部のプロパティだけを参照していますが、GitHub API が返す値にはもっといろいろな情報が含まれています。 これらの情報をうまく使えば、日々の業務を自動化できるかもしれません。