エンジニアはこわくない

好きなように書く

golangでGitHub APIを使うならgo-githubライブラリが超便利だと思う


スポンサーリンク

f:id:tsujitaku50:20170107105906p:plain

最近仕事でGithub APIを使用していて、言語はgolangで実装しています。

その際にイチからGETやPOSTを実装しても良かったのですが正直めんどくさい

楽できるなら楽したい。と思っていたところ

googleが作っているGithub APIを使用するライブラリがあったので、紹介します。

さすが天下のgoogleさん。しかもめちゃくちゃ勉強になるコードになってます。

go-githubライブラリとは

天下のgoogleさんが作っているGithub APIを使用するOSSライブラリ。

ライブラリの関数を使用するだけ、issueを取得したり、リポジトリを取得したり、ユーザー情報を取得したりetc

めちゃくちゃ便利です

現在のところ活発に開発は行われているようです。

github.com

このまま開発が続いてほしい・・
(途中で開発が中止になったりするライブラリも山ほどありますから)

ライブラリのREADMEにも書いてありますが、ちょっとだけライブラリの使い方紹介します。

アクセストークン取得

まず最初にGithubのアクセストークンを取得しましょう。

アクセストークンを取得しなくてもGithubAPIは使えますが、取得したほうが良いです。
(理由は後述)

下記URLにアクセスしてGithubにログインします。

Sign in to GitHub · GitHub

そして画面右上にあるGenerate new tokenを選択します。

するとこのような画面表示になると思います。 f:id:tsujitaku50:20170120235017p:plain

Token descriptionはtoken名になります。自分の好きな名前を付けましょう。

Select scopesは権限になります。APIに適切な権限を与えましょう。

(あまりdelete権限は与えない方が良いと思います。
API操作を間違ってリポジトリ消しちゃった!なんてことにならないように)

入力が完了したなら、画面に下にあるGenerate tokenボタンを選択しましょう。

これでアクセストークンが取得できました。

認証の方法

import "golang.org/x/oauth2"

func main() {
  ts := oauth2.StaticTokenSource(
    &oauth2.Token{AccessToken: "... your access token ..."},
  )
  tc := oauth2.NewClient(oauth2.NoContext, ts)

  client := github.NewClient(tc)

  // 自分の全てのリポジトリ取得
  repos, _, err := client.Repositories.List("", nil)
}

上記コードの... your access token ...部分を自分のgithubアカウントのアクセストークンに差し替えれば認証に成功します。

Github公式ドキュメントに書かれていますが、認証済みの場合1時間に5000回APIを叩くことができます。 認証していない場合は1時間に60回叩くことができます。

GitHub API v3 | GitHub Developer Guide

これがアクセストークンを取得したほうが良い理由になります。

APIの制限に引っかかっていないか確認

先程書いたように認証済みなら1時間で5000回、認証していないなら1時間に60回APIを叩くことができます。

その制限に引っかかっていないかの確認が以下のコードで可能です。

repos, _, err := client.Repositories.List("", nil)
if _, ok := err.(*github.RateLimitError); ok {
    log.Println("hit rate limit")
}

特定のオーガニゼイションのパブリックリポジトリ取得方法

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

func main() {
  ts := oauth2.StaticTokenSource(
    &oauth2.Token{AccessToken: "... your access token ..."},
  )
  tc := oauth2.NewClient(oauth2.NoContext, ts)

  client := github.NewClient(tc)

// 「github」というオーガニゼイションのpublicリポジトリを取得します
opt := &github.RepositoryListByOrgOptions{Type: "public"}
repos, _, err := client.Repositories.ListByOrg("github", opt)
}

issueを作成する方法

import "github.com/google/go-github/github"

func main() {
  ts := oauth2.StaticTokenSource(
    &oauth2.Token{AccessToken: "... your access token ..."},
  )
  tc := oauth2.NewClient(oauth2.NoContext, ts)

  client := github.NewClient(tc)

opt := &github.IssueRequest{
            Title:"テストissue",
            Body:"これはテストです",
        }

// 「github」というオーガニゼイションの「test」リポジトリにissue作成
client.Issues.Create("github", "test", nil)

issue取得方法

import "github.com/google/go-github/github"

func main() {
  ts := oauth2.StaticTokenSource(
    &oauth2.Token{AccessToken: "... your access token ..."},
  )
  tc := oauth2.NewClient(oauth2.NoContext, ts)

  client := github.NewClient(tc)


// 「github」というオーガニゼイションの「test」リポジトリのissue取得
issues, _, err := githubClient.Issues.ListByRepo("github", "test", nil)

まとめ

ここに書いたのは本当に一部で他にも色々な関数があります。

そしてさすがgoogleさんと言いたいのですが、golangを使っている人間からするとだいぶ勉強になる書き方がされていると思います。

OSSなので一度ソースコードを見てみてはどうでしょうか。

おわり!

おまけ

GithubのOutside Collaborators部分のAPIはプレビュー版なので注意しようという記事を書いてるので、良かったらどうぞ。

ちなみに、このOSSライブラリにはOutside Collaboratorsに関するAPIを叩く処理は一切入ってないです。

プレビュー版なので、当然ちゃ当然ですね。

tsujitaku50.hatenablog.com