最近Line Bot作りを暇つぶしにやっています。
簡単な画像認識をするためにGoogle Vision APIを使おうとしたのですが、LineBotの運用をHerokuで行っていたことで問題がありました。
Herokuではアプリケーションの管理をgitを用いて行っています。そのためGoogle Vison Apiを使用するのに必要な認証用のjsonファイルをプロジェクトに含めなければなりませんでした。(Google Vision APIのGo言語用パッケージの仕様はjsonファイルを読み込む用になっている)
ctx := context.Background()
// Create the client.
client, err := vision.NewClient(ctx)
if err != nil {
return nil, err
}
通常は上記のようにしてclient
のインスタンスを作成します。しかし、これでは先ほど述べたようにjsonファイルをHeroku上に置くことになるのでよろしくありません。
ここに参考となるコードが載っていたので、これを参考に書き換えてみました。
json := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS")
ctx := context.Background()
jwtConfig, err := google.JWTConfigFromJSON([]byte(json), vision.Scope)
if err != nil {
return nil, errors.New("google.JWTConfigFromJSON :" + err.Error() + "\n" + json)
}
ts := jwtConfig.TokenSource(ctx)
// Create the client.
client, err := vision.NewClient(ctx, option.WithTokenSource(ts))
if err != nil {
return nil, err
}
先ほどよりも長くなってしまいましたが、これでいけました。Herokuの環境変数GOOGLE_APPLICATION_CREDENTIALS
に認証用のjsonファイルの中身を設定しておく必要があります。使っているシェルがbashであるなら以下のようにして設定できると思います。
$ heroku config:set GOOGLE_APPLICATION_CREDENTIALS="$(cat <ファイル名>.json)"
参考にしたページ:
Load GOOGLE_APPLICATION_CREDENTIALS json content via an environment variable instead of a file #185
Google Vision APIのサンプルプログラム
作成中のlinebot
https://github.com/hasokon/linebot