高木のブログ

GitHub GraphQL API でコントリビューション数(草の情報)を取得する

2022/07/12

GitHub のコントリビューション数(草の情報)を使ってやりたいことができたので、GitHub GraphQL API を使って取得してみる

手順

アクセストークンの発行

GitHub の Settings -> Developer setting -> Personal access tokens から発行する

コントリビューション数だけ取れたらいいので、権限は user -> read:user だけ付与した

動作確認

発行したトークンがちゃんと使えるかの確認

公式では、GraphQL Explorer を使うことをおすすめされているが、今回は cURL を使った

エンドポイント https://api.github.com/graphql に対して POST リクエストで、クエリを投げる

query {
  viewer {
    login
  }
}
$ curl -s -H "Authorization: bearer [token]" https://api.github.com/graphql -d '{"query": "query { viewer { login } }"}' | jq
{
  "data": {
    "viewer": {
      "login": "ytkg"
    }
  }
}

自分の GitHub のユーザー名が返ってきたらOK

コントリビューション数の取得

認証も無事通過できたので、本題のコントリビューション数を取得する

以下のクエリでコントリビューション数が取得できる

query {
  user(login: "ユーザー名") {
    contributionsCollection {
      contributionCalendar {
        weeks {
          contributionDays {
            date
            contributionCount
          }
        }
      }
    }
  }
}

クエリが長いので、ファイルに書き込んでからリクエストする

query.json
{
  "query": "
    query {
      user(login: \"ytkg\") {
        contributionsCollection {
          contributionCalendar {
            weeks {
              contributionDays {
                date
                contributionCount
              }
            }
          }
        }
      }
    }
  "
}
$ curl -s -H "Authorization: bearer [token]" https://api.github.com/graphql [email protected] | jq
{
  "data": {
    "user": {
      "contributionsCollection": {
        "contributionCalendar": {
          "weeks": [
            {
              "contributionDays": [
                {
                  "date": "2021-07-11",
                  "contributionCount": 0
                },
                {
                  "date": "2021-07-12",
                  "contributionCount": 1
                },
                {
                  "date": "2021-07-13",
                  "contributionCount": 2
                },
                {
                  "date": "2021-07-14",
                  "contributionCount": 1
                },
                {
                  "date": "2021-07-15",
                  "contributionCount": 0
                },
                {
                  "date": "2021-07-16",
                  "contributionCount": 5
                },
                {
                  "date": "2021-07-17",
                  "contributionCount": 1
                }
              ]
            },
            ...省略...
            {
              "contributionDays": [
                {
                  "date": "2022-07-03",
                  "contributionCount": 4
                },
                {
                  "date": "2022-07-04",
                  "contributionCount": 2
                },
                {
                  "date": "2022-07-05",
                  "contributionCount": 4
                },
                {
                  "date": "2022-07-06",
                  "contributionCount": 1
                },
                {
                  "date": "2022-07-07",
                  "contributionCount": 4
                },
                {
                  "date": "2022-07-08",
                  "contributionCount": 3
                },
                {
                  "date": "2022-07-09",
                  "contributionCount": 2
                }
              ]
            },
            {
              "contributionDays": [
                {
                  "date": "2022-07-10",
                  "contributionCount": 3
                },
                {
                  "date": "2022-07-11",
                  "contributionCount": 11
                },
                {
                  "date": "2022-07-12",
                  "contributionCount": 2
                }
              ]
            }
          ]
        }
      }
    }
  }
}

デフォルトで直近1年分が取得できた

jq で整形

発展として、読みやすように jq で整形してみる

date と contributionCount の部分のみに整形

$ curl -s -H "Authorization: bearer [token]" https://api.github.com/graphql -d @query.json | jq '[.data.user.contributionsCollection.contributionCalendar.weeks[].contributionDays[]]'
[
  {
    "date": "2021-07-11",
    "contributionCount": 0
  },
  {
    "date": "2021-07-12",
    "contributionCount": 1
  },
  ...省略...
  {
    "date": "2022-07-11",
    "contributionCount": 11
  },
  {
    "date": "2022-07-12",
    "contributionCount": 2
  }
]

date をキー、contributionCount をバリューに整形

$ curl -s -H "Authorization: bearer [token]" https://api.github.com/graphql -d @query.json | jq '[.data.user.contributionsCollection.contributionCalendar.weeks[].contributionDays[] | { key: .date, value: .contributionCount }] | from_entries'
{
  "2021-07-11": 0,
  "2021-07-12": 1,
  "2021-07-13": 2,
  ...省略...
  "2022-07-10": 1
  "2022-07-11": 11,
  "2022-07-12": 2
}

参考


ytkg

Written by ytkg, Twitter, GitHub