0
0

Goを利用し、API経由で自分の草の情報を取得したい

Posted at

はじめに

GitHubのコントリビューション、俗にいう「草」の情報をGitHub APIを利用して取得する方法を紹介します。

image.png

なお取得するのは自分のコントリビューション情報です。また言語としてはGoを利用します。

$ go version
go version go1.20.3 linux/amd64

事前準備

事前準備として、アクセストークンの作成を行います。

① アクセストークンの作成ページへ移動します。

② Generate new token を選択します。

image.png

③ Token name に任意の名前を入力。Repository acess は Public Repository (read-only)を選択し、Generate token ボタンを押下します。

image.png

④ 作成されたアクセストークンを控えておきます。

image.png

ソースコード

変数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

実行結果は以下のようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0