Skip to content

Python で GitHub の GraphQL API へアクセスする

Python から gql を使って GitHub の GraphQL API を呼び出すサンプルをメモしておきます。 対象は octocat / Hello-World リポジトリとし、Pull Request の一覧を取得します。

GitHub の AccessKey を取得する

GitHub へアクセスし、SettingsPersonal access tokensGenerate new token をクリックします。

file

GitHub のパスワードを要求されたので入力して先へ進みます。

file

New personal access token 画面が表示されます。 Note は必須項目なので、何かわかりやすいコメントを入力しておきます。 Generate token をクリックして先へ進みます。

file

これでアクセストークンが発行されました。

file

venv 環境を作成する

Python の venv 環境を作成し、必要なライブラリをインストールします。

1
2
3
4
5
6
7
mkdir graphql
cd graphql
python3 -m venv .venv
echo 'source .venv/bin/activate' > .envrc
direnv allow
python3 -m pip install --upgrade pip
python3 -m pip install gql requests requests-toolbelt

サンプルスクリプト

サンプルスクリプトは以下の通りです。 access_token には予め GitHub で発行したアクセストークンを入力します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3

from gql import Client, gql
from gql.transport.requests import RequestsHTTPTransport

access_token = "0123456789012345678901234567890123456789"
client = Client(
    transport=RequestsHTTPTransport(
        url="https://api.github.com/graphql",
        use_json=True,
        headers={
            "Content-type": "application/json",
            "Authorization": "Bearer {}".format(access_token),
        },
        retries=3,
    ),
    fetch_schema_from_transport=True,
)
resp = client.execute(
    gql(
        """
    query($owner:String!, $name:String!) {
      repository(owner:$owner, name:$name){
        pullRequests(first:100, states:OPEN) {
          nodes {
            number
            title
          }
        }
      }
    }"""
    ),
    variable_values={"owner": "octocat", "name": "Hello-World"},
)
for pr in resp["repository"]["pullRequests"]["nodes"]:
    print(str(pr["number"]) + ":" + pr["title"])

実行例

実行例は以下の通りです。

1
2
3
4
5
6
7
8
# ./sample.py
32:Update README
34:Just a pull request test
35:Update README
(snip)
255:Contributors add
258:CO-mitting a new file
259:Create CONTRIBUTING.md