LoginSignup
2
1

More than 3 years have passed since last update.

AutoML Vision API を使って簡単な画像選別サイトを作りたい

Last updated at Posted at 2019-05-16

AutoML Vision APIを使って画像選別をクライアント上で出来るサイトを作りたい。
完成するまでの過程をメモしていく

準備

  • GoogleCloudSDKのインストール
  • サービスアカウント設定
  • 環境変数の設定(必須だったかは後日確認)
    • GOOGLE_APPLICATION_CREDENTIALS = webコンソール上でサービスアカウントから”鍵を作成”で得られるjsonファイルのパス
    • PROJECT_ID = プロジェクトのID
  • gcloud auth activate-service-account --key-file=<キーファイルのパス> キーファイルの設定
  • gcloud auth application-default print-access-token でトークンを取得

成功したリクエスト

<?php
//リクエスト用url
$url = "https://automl.googleapis.com/v1beta1/projects/###プロジェクトID###/locations/us-central1/models/
###利用するデータモデル###:predict";

//セキュリティトークン。gitとかに挙げる時は要注意。
$token = "###gcloud auth application-default print-access-token で取得したトークン###";

//画像をbase64文字列にエンコード
$img = base64_encode(file_get_contents('###画像パス###'));

//json作成
$data = array("payload"=>array("image"=>array("imageBytes"=>$img)));

$header = [//ヘッダ情報
    'Authorization: Bearer '.$token,//トークン
    'Content-Type: application/json',//テキストタイプ
];

$curl = curl_init();//cURL セッションを初期化する
//以下curl詳細設定
curl_setopt($curl, CURLOPT_URL, $url);//取得するURLの指定。curl_init() でセッションを初期化する際に指定することも可能。
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //HTTPリクエストで"GET"あるいは"HEAD"以外に使用するカスタムメソッドの指定
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); //HTTP "POST" で送信するすべてのデータの指定
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //ヘッダーの指定

//curlはデフォルトでセッション終了後にレスポンスを出力する。以下の文でそれを止める
//TRUEを設定すると、curl_exec()の返り値を文字列で返します。通常はデータを直接出力
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, true );

$response = curl_exec($curl);//cURLセッションを実行。レスポンスが返されるっぽい

curl_close($curl);//cURLセッションを閉じる

$arr = json_decode($response,true);//trueで連想配列の指定

//ラベル名の取得、出力
echo $arr["payload"][0]["displayName"];

OAuthからリフレッシュトークン、アクセストークン生成

  1. GCPのwebコンソールページからOAuth client IDを作成する
    ※リダイレクトURIはwww.google.co.jp等でも大丈夫
  2. 作成時の①クライアントID、②クライアントシークレット、③リダイレクトURIをメモしておく
  3. 使いたいapiのスコープを調べる=>④(autoMlはhttps://www.googleapis.com/auth/cloud-platform)
  4. ブラウザからhttps://accounts.google.com/o/oauth2/auth?client_id=①クライアントID&redirect_uri=③リダイレクトURI&scope=④apiのスコープ&response_type=code&approval_prompt=force&access_type=offlineにアクセス
  5. 確認後にリダイレクトされたサイトのurl欄からcode=以下をメモする=>⑤
  6. curlを実行#curl -d client_id=①クライアントID -d client_secret=②クライアントシークレット -d redirect_uri=③リダイレクトURI -d grant_type=authorization_code -d code=⑤ https://accounts.google.com/o/oauth2/token
  7. 取得したjsonをメモ⑥(リフレッシュトークンが含まれています)
  8. curl --data "refresh_token=⑥リフレッシュトークン" --data "client_id=①クライアントID" --data "client_secret=②クライアントシークレット" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token
  9. apiに必要なアクセストークンが得られる

ここで得たリフレッシュトークンには有効期限がない

8,9の手順をphp等でまとめれば自動でトークンを更新できる

解決していない問題

winのコマンドプロンプトのcurlを使って試しにリクエストを送ろうとしていたが401エラーの解決法がわからず断念
コマンド内のoauthトークン発行がうまくいってなかったのかもしれない
まだローカルでしか確認できていないためherokuに挙げても実行できるのかわからない
gcloudコマンドをもう少し調べる
これでいけるなら他言語の実装も何とかなりそう
なぜか公式のcurlがうまくいかない

更新予定....

2
1
1

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
1