yshr10ic’s Blog

備忘録

GitHub GraphQL API v4を試してみる

こんにちは、@yshr10icです。

GitHub GraphQL API v4をPythonで実行してみたので、実行したときのメモを残しておきます。

なお、こちらを参考にさせていただきました。

目次

  1. GitHubのアクセストークンの取得
  2. PythonでAPIの実行
  3. まとめ

GitHubのアクセストークンの取得

今回は、PythonからAPIを実行する際に、OAuth認証で認証をするため、OAuth用のトークンを取得します。

まず初めにGitHubを開き、右上のアイコンから「Settings」を選択します。

f:id:yshr10ic:20200329170907p:plain

次に設定画面のペインの中から「Developer settings」を選択します。

f:id:yshr10ic:20200329170824p:plain

開発者設定画面のペインの中から「Personal access tokens」を選択し、「Generate new tokens」を押します。

f:id:yshr10ic:20200329170830p:plain

ここで、GitHubのパスワードを要求された場合は、パスワードを入力しましょう。

f:id:yshr10ic:20200329170837p:plain

APIの権限設定をし、一番下にある「Generate token」を押します。

f:id:yshr10ic:20200329170847p:plain f:id:yshr10ic:20200329170853p:plain

トークンが発行されるので、そのトークンをメモしておきましょう。

f:id:yshr10ic:20200329170901p:plain

なお、このトークンは二度と表示することはできないので、必ずどこかにメモしておきましょう。(トークンを忘れてしまった場合は、削除してから新規発行しましょう。)

f:id:yshr10ic:20200329172206p:plain

これでトークンの取得は完了です!

PythonAPIの実行

まずはクエリを実行するひな形を作ります。

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
            }
          }
        ]
      }
    }
  }
}

まとめ

今回は、PythonGitHub GraphQL API v4を実行してみました。 GraphQLを触るのが初めてだったので、クエリの書き方に苦戦してしまいましたが、比較的簡単に情報を取得することができました。 これを使って何か作ってみたいと思います。

また、GraphQLについては、以下の書籍で勉強しようか迷い中です。

初めてのGraphQL ―Webサービスを作って学ぶ新世代API