はじめに
GitHubのコントリビューション、俗にいう「草」の情報をGitHub APIを利用して取得する方法を紹介します。
なお取得するのは自分のコントリビューション情報です。また言語としてはGoを利用します。
$ go version
go version go1.20.3 linux/amd64
事前準備
事前準備として、アクセストークンの作成を行います。
① アクセストークンの作成ページへ移動します。
② Generate new token を選択します。
③ Token name に任意の名前を入力。Repository acess は Public Repository (read-only)を選択し、Generate token ボタンを押下します。
④ 作成されたアクセストークンを控えておきます。
ソースコード
変数TOKENには事前に作成したアクセストークンを、変数USERにはGitHubのユーザ名をそれぞれ設定します。
main.go
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strings"
)
type GithubResponse struct {
Data struct {
User struct {
ContributionsCollection struct {
ContributionCalendar struct {
Weeks []struct {
ContributionDays []struct {
Color string `json:"color"`
ContributionCount int `json:"contributionCount"`
Date string `json:"date"`
Weekday int `json:"weekday"`
} `json:"contributionDays"`
} `json:"weeks"`
} `json:"contributionCalendar"`
} `json:"contributionsCollection"`
} `json:"user"`
} `json:"data"`
}
var TOKEN = "..."
var USER = "nekoTheShadow"
var URL = "https://api.github.com/graphql"
var QUERY = fmt.Sprintf(`
{
user(login: "%s") {
contributionsCollection {
contributionCalendar {
weeks {
contributionDays {
color
contributionCount
date
weekday
}
}
}
}
}
}
`, USER)
func main() {
// リクエストボディを作成する
requestBody, err := json.Marshal(map[string]string{"query": QUERY})
if err != nil {
log.Fatal(err)
}
// リクエストを作成する
request, err := http.NewRequest("POST", URL, strings.NewReader(string(requestBody)))
if err != nil {
log.Fatal(err)
}
request.Header.Set("Authorization", fmt.Sprintf("bearer %s", TOKEN))
// POSTを実行する
client := &http.Client{}
response, err := client.Do(request)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
// レスポンスを構造体にマッピングする。
var githubReponse GithubResponse
if err := json.NewDecoder(response.Body).Decode(&githubReponse); err != nil {
log.Fatal(err)
}
// 構造体をPretty Printする
b, err := json.MarshalIndent(githubReponse, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
プログラムを実行します。
go run main.go
実行結果は以下のようになります。