go google api auth

サービスアカウント作成

  1. GCPにプロジェクト作成
  2. API画面でサービスアカウント作成
  3. JSONダウンロード

ソースコード

package main

import (
    "encoding/base64"
    "io/ioutil"
    "log"

    "golang.org/x/net/context"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/vision/v1"
)

func main() {
    jsonData, err := ioutil.ReadFile("./auth.json")
    if err != nil {
        panic(err)
    }

    // 前述のJSONファイルを読み込んでJWTのConfigを作成
    cfg, err := google.JWTConfigFromJSON(jsonData, vision.CloudPlatformScope)
    if err != nil {
        panic(err)
    }

    // OAuth2の認可を付与したHTTPクライアントを作る
    client := cfg.Client(context.Background())

    // Vision APIのサービスを作る
    svc, err := vision.New(client)
    if err != nil {
        panic(err)
    }

    // 画像ファイルを読み込んでBASE64エンコード
    imgData, err := ioutil.ReadFile("./cat.jpeg")
    if err != nil {
        panic(err)
    }

    enc := base64.StdEncoding.EncodeToString(imgData)
    img := &vision.Image{Content: enc}

    // 使いたいVisionの機能
    feature := &vision.Feature{
        Type:       "LABEL_DETECTION",
        MaxResults: 10,
    }

    // 1つの画像に対して複数のFeatureを指定できる
    req := &vision.AnnotateImageRequest{
        Image:    img,
        Features: []*vision.Feature{feature},
    }

    // 1回の呼び出しで複数の処理を要求できる
    batch := &vision.BatchAnnotateImagesRequest{
        Requests: []*vision.AnnotateImageRequest{req},
    }

    // 実際のAPIコールを実行
    res, err := svc.Images.Annotate(batch).Do()

    b, err := res.MarshalJSON()
    if err != nil {
        panic(err)
    }
    log.Print(string(b))
}