GitHub GraphQL API v4を試してみる
こんにちは、@yshr10icです。
GitHub GraphQL API v4をPythonで実行してみたので、実行したときのメモを残しておきます。
なお、こちらを参考にさせていただきました。
目次
GitHubのアクセストークンの取得
今回は、PythonからAPIを実行する際に、OAuth認証で認証をするため、OAuth用のトークンを取得します。
まず初めにGitHubを開き、右上のアイコンから「Settings」を選択します。
次に設定画面のペインの中から「Developer settings」を選択します。
開発者設定画面のペインの中から「Personal access tokens」を選択し、「Generate new tokens」を押します。
ここで、GitHubのパスワードを要求された場合は、パスワードを入力しましょう。
APIの権限設定をし、一番下にある「Generate token」を押します。
トークンが発行されるので、そのトークンをメモしておきましょう。
なお、このトークンは二度と表示することはできないので、必ずどこかにメモしておきましょう。(トークンを忘れてしまった場合は、削除してから新規発行しましょう。)
これでトークンの取得は完了です!
PythonでAPIの実行
まずはクエリを実行するひな形を作ります。
import requests import json TOKEN = 'YOUR ACCESS TOKEN' ENDPOINT = 'https://api.github.com/graphql' def get_query(): query = { 'query': """ query{ xxx } """ } return query def post(query): headers = {'Authorization': 'bearer ' + TOKEN} response = requests.post(ENDPOINT, json=query, headers=headers) if response.status_code != 200: print('Post fails: {}'.format(response)) return response.json() if __name__ == "__main__": query = get_query() response = post(query) print(json.dumps(response, indent=2))
TOKEN
に先ほど取得したアクセストークンを貼り付けます。
get_query
メソッドでクエリを発行し、post
メソッドに引数として渡します。
以降は、このget_query
メソッドのみを修正して、GitHub GraphQL API v4を実行していきます。
ユーザ情報の取得
自分のアカウントの情報を取得してみます。viewer
は現在の認証されているユーザの情報を取得します。
def get_query(): query = { 'query': """ query{ viewer { createdAt login name url } } """ } return query
取得結果。GitHubのアカウント作成してから3年半しか経っていないんですね。。。
{ "data": { "user": { "createdAt": "2016-10-13T08:00:51Z", "login": "yshr10ic", "name": "yshr10ic", "url": "https://github.com/yshr10ic" } } }
リポジトリ情報の取得
最新のリポジトリの3件の情報の取得と、リポジトリ数の取得をしてみます。
repositories
の中で、作成日時の降順に並び替えをし、最初の3件を取得するように指定しています。
nodes
の中ではcreatedAt
が作成日時を指しますが、orderBy
の中ではCREATED_AT
作成日時を指すので、注意が必要です。
def get_query(): query = { 'query': """ query{ viewer { repositories(first: 3 orderBy: {field: CREATED_AT, direction: DESC}) { nodes { createdAt isPrivate name } totalCount } } } """ } return query
取得結果。
{ "data": { "viewer": { "repositories": { "nodes": [ { "createdAt": "2020-03-12T13:20:34Z", "isPrivate": false, "name": "baby-steps" }, { "createdAt": "2020-03-08T23:00:29Z", "isPrivate": false, "name": "portfolio" }, { "createdAt": "2020-03-08T09:02:26Z", "isPrivate": true, "name": "books" } ], "totalCount": 34 } } } }
コミット数の取得
2020/03/20~2020/03/29のリポジトリ毎のコミット数を取得します。
def get_query(): query = { 'query': """ query{ viewer { contributionsCollection(from: "2020-03-20T00:00:00", to: "2020-03-30T00:00:00") { totalCommitContributions commitContributionsByRepository { repository { name } contributions { totalCount } } } } } """ } return query
取得結果。
{ "data": { "viewer": { "contributionsCollection": { "totalCommitContributions": 69, "commitContributionsByRepository": [ { "repository": { "name": "books" }, "contributions": { "totalCount": 67 } }, { "repository": { "name": "blog" }, "contributions": { "totalCount": 2 } } ] } } } }
まとめ
今回は、PythonでGitHub GraphQL API v4を実行してみました。 GraphQLを触るのが初めてだったので、クエリの書き方に苦戦してしまいましたが、比較的簡単に情報を取得することができました。 これを使って何か作ってみたいと思います。
また、GraphQLについては、以下の書籍で勉強しようか迷い中です。