2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

みなさんGithubはお世話になっていますよね?Githubの各種操作はghコマンドやGithubAPIで行うことができます!この記事ではGithubAPIについて紹介します.GitHub APIはGitHub上のリポジトリやユーザ情報などを柔軟に操作できる強力なAPIである. 本記事では, 代表的なエンドポイントの使い方を初心者にもわかりやすく解説する. まずはcurlでのリクエスト例を示し, それからGo言語でgithub.com/google/go-github/v57/githubライブラリを使った実装例を紹介する. 各エンドポイントごとにGoファイル(example/SampleRepository配下を想定)を作成しているので参考にしてほしい.

前提

  • GitHub APIを利用するには適切な認証が必要である(パーソナルアクセストークンなど)
  • 本記事はAPIの利用方法を示す. セキュリティ的な観点やトークン管理については別途注意が必要
  • APIを実行する際はAPIのRate Limitにも注意する

他のチートシート

git/gh コマンド(gitコマンド以外にもgitの概念も書いてあります)

Githubの操作にはGithub API以外にもCUI操作のghコマンドがあります.ぜひご覧ください.

lazygit

Docker コマンド(dockerコマンド以外にもdockerの概念の記事へのリンクもあります)

ステータスコード

TypeScript

Go/Gorm

Ruby・Ruby on Rails

SQL

Vim

プルリクエスト・マークダウン記法チートシート

ファイル操作コマンドチートシート

VSCode Github Copilot拡張機能

OpenAI Assistants API

他のシリーズ記事

TypeScriptで学ぶプログラミングの世界
プログラミング言語を根本的に理解するシリーズです.

情報処理技術者試験合格への道[IP・SG・FE・AP]
情報処理技術者試験の単語集です.

IAM AWS User クラウドサービスをフル活用しよう!
AWSのサービスを例にしてバックエンドとインフラ開発の手法を説明するシリーズです.

Project Gopher: Unlocking Go’s Secrets
Go言語や標準ライブラリの深掘り調査レポートです.

ユーザ情報 (Users API)

curlでの例

ユーザ情報を取得するためのUsers APIの一例を示す. 以下は任意のユーザ情報を取得する例だ.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/users/example

exampleというユーザのプロフィール情報を取得している. アクセストークンを利用しないと回数制限が厳しくなるので, できるだけアクセストークンを使うとよい.

Go言語での例

users.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	// 任意のユーザ情報を取得する
	user, _, err := client.Users.Get(ctx, "example")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("ユーザ: %s\nID: %d\nアバターURL: %s\n", user.GetLogin(), user.GetID(), user.GetAvatarURL())
}

github.NewClient(tc)を用いてGitHub APIクライアントを作成している. oauth2パッケージでGitHubトークンを認証に利用する仕組みである.

リポジトリ (Repositories API)

curlでの例

認証済みユーザでアクセスできるリポジトリ一覧を取得する例を示す.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/user/repos

認証したユーザのパブリックおよびプライベートリポジトリ一覧を取得できる.

Go言語での例

repos.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	// 自身のリポジトリ一覧を取得する
	repos, _, err := client.Repositories.List(ctx, "", nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, repo := range repos {
		fmt.Printf("リポジトリ名: %s (%s)\n説明: %s\nプライベート: %v\n\n",
			repo.GetName(), repo.GetFullName(), repo.GetDescription(), repo.GetPrivate())
	}
}

client.Repositories.List(ctx, "", nil)でユーザ名に空文字を渡すと, 認証ユーザのリポジトリ一覧を取得できる.
また, ほかにもスターを付けたリポジトリの一覧取得やリポジトリの作成, 削除なども可能である.

イシュー (Issues API)

curlでの例

イシューの一覧を取得する例である. 以下のリポジトリexample/SampleRepositoryの全イシューを取得する.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/repos/example/SampleRepository/issues

イシューの作成や更新も同様にPOSTPATCHメソッドを使う.

Go言語での例

issues.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	owner := "example"
	repo := "SampleRepository"

	// イシュー一覧を取得する
	issues, _, err := client.Issues.ListByRepo(ctx, owner, repo, nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, issue := range issues {
		fmt.Printf("イシュー番号: %d\nタイトル: %s\n内容: %s\n\n",
			issue.GetNumber(), issue.GetTitle(), issue.GetBody())
	}

	// 新規イシューを作成する例
	newIssue := &github.IssueRequest{
		Title: github.String("新しいイシュー"),
		Body:  github.String("イシューの内容"),
	}
	createdIssue, _, err := client.Issues.Create(ctx, owner, repo, newIssue)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("作成されたイシュー番号: %d\nタイトル: %s\n内容: %s\n",
		createdIssue.GetNumber(), createdIssue.GetTitle(), createdIssue.GetBody())
}

イシュー作成時にはIssues.CreateIssueRequestを渡し, タイトルや本文などを指定している. 更新の場合はIssues.Edit, 閉じる場合はstateclosedに編集する.

プルリクエスト (Pull Requests API)

curlでの例

プルリクエスト一覧を取得する. 以下はexample/SampleRepositoryリポジトリのプルリクを取得する例だ.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/repos/example/SampleRepository/pulls

プルリクエストを作成する際はPOSTメソッドを使う.

Go言語での例

pullrequest.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	owner := "example"
	repo := "SampleRepository"

	// プルリクエスト一覧を取得する
	pulls, _, err := client.PullRequests.List(ctx, owner, repo, nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, pr := range pulls {
		fmt.Printf("PR番号: %d\nタイトル: %s\nベースブランチ: %s\nヘッドブランチ: %s\n\n",
			pr.GetNumber(), pr.GetTitle(), pr.Base.GetRef(), pr.Head.GetRef())
	}

	// 新規プルリクエストを作成する例
	newPR := &github.NewPullRequest{
		Title: github.String("新しいプルリクエスト"),
		Head:  github.String("feature-branch"),
		Base:  github.String("main"),
		Body:  github.String("プルリクエストの内容"),
	}
	createdPR, _, err := client.PullRequests.Create(ctx, owner, repo, newPR)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("作成されたプルリク: %d\nタイトル: %s\n",
		createdPR.GetNumber(), createdPR.GetTitle())
}

HeadBaseの指定が必要であり, ブランチ名に気をつけてプルリクを作成する. 更新やマージ操作も合わせて利用可能である.

Gists API

Gistはコードスニペットを管理するための仕組みである. 公開/非公開設定が可能だ.

curlでの例

個人のGist一覧を取得する例を示す.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/users/example/gists

Go言語での例

gists.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	user := "example"
	gists, _, err := client.Gists.List(ctx, user, nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, gist := range gists {
		fmt.Printf("Gist ID: %s\nDescription: %s\n公開: %v\n\n",
			gist.GetID(), gist.GetDescription(), !gist.GetPublic())
	}

	// 新規Gist作成例
	files := map[github.GistFilename]github.GistFile{
		"sample.go": {
			Content: github.String("package main\n\nfunc main() {}"),
		},
	}
	newGist := &github.Gist{
		Description: github.String("サンプルGist"),
		Public:      github.Bool(true),
		Files:       files,
	}
	createdGist, _, err := client.Gists.Create(ctx, newGist)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("作成されたGist ID: %s\n", createdGist.GetID())
}

Search API

リポジトリ, コード, イシューなどを検索できる. 例としてリポジトリ検索を紹介する.

curlでの例

Go言語のサンプルリポジトリを検索する例である. クエリはURLエンコードして利用する.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     "https://api.github.com/search/repositories?q=language:go+sample"

Go言語での例

search.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	query := "language:go sample"
	result, _, err := client.Search.Repositories(ctx, query, nil)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("検索結果: %d件\n", *result.Total)
	for _, repo := range result.Repositories {
		fmt.Printf("- %s (%d stars)\n", repo.GetFullName(), repo.GetStargazersCount())
	}
}

Search APIは結果や詳細表示, パラメータ指定など多彩な機能がある.
リポジトリ以外にもコード, イシュー, コミットなどを検索可能である.

Notifications API

通知一覧や既読処理を行うためのAPIである. プロジェクトの状態を把握する際に役立つ.

curlでの例

通知一覧を取得する. たとえば全通知を取得する場合は以下のようにする.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/notifications

Go言語での例

notifications.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	// 通知の一覧を取得する
	notifications, _, err := client.Activity.ListNotifications(ctx, nil)
	if err != nil {
		log.Fatal(err)
	}

	for _, n := range notifications {
		fmt.Printf("通知: %s\nリポジトリ: %s\nスレッドURL: %s\n\n",
			n.GetSubject().GetTitle(),
			n.GetRepository().GetFullName(),
			n.GetSubject().GetURL())
	}

	// 既読にする場合はMarkThreadReadなどを利用する
}

Organizations API

組織情報を取得・管理するためのAPIである. 組織のメンバ情報やリポジトリ管理などに使われる.

curlでの例

組織情報を取得する例を示す.

curl -H "Authorization: token <YOUR_PERSONAL_ACCESS_TOKEN>" \
     https://api.github.com/orgs/github

Go言語での例

orgs.go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/google/go-github/v57/github"
	"golang.org/x/oauth2"
)

func main() {
	token := os.Getenv("GITHUB_TOKEN")
	if token == "" {
		log.Fatal("GITHUB_TOKENが設定されていない")
	}

	ctx := context.Background()
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: token},
	)
	tc := oauth2.NewClient(ctx, ts)

	client := github.NewClient(tc)

	orgName := "example"
	org, _, err := client.Organizations.Get(ctx, orgName)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("組織名: %s\n説明: %s\nWebサイト: %s\n",
		org.GetLogin(), org.GetDescription(), org.GetBlog())
}

組織のメンバーやリポジトリの一括管理などに利用できる.

本記事ではGitHub APIの主要なエンドポイントと, curlおよびGo言語のgithub.com/google/go-github/v57/githubライブラリを使った例を紹介した. エンドポイントによってメソッドやパラメータが異なるが, 適切な認証とリクエストを行うことで様々な操作を自動化できる. 本記事のサンプルコードはexample/SampleRepositoryというディレクトリ構成での使用を想定しているが, 適宜カスタマイズして自身のプロジェクトに組み込んでみてほしい.

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?