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からリフレッシュトークン、アクセストークン生成
- GCPのwebコンソールページからOAuth client IDを作成する
※リダイレクトURIはwww.google.co.jp
等でも大丈夫 - 作成時の①クライアントID、②クライアントシークレット、③リダイレクトURIをメモしておく
- 使いたいapiのスコープを調べる=>④(autoMlは
https://www.googleapis.com/auth/cloud-platform
) - ブラウザから
https://accounts.google.com/o/oauth2/auth?client_id=①クライアントID&redirect_uri=③リダイレクトURI&scope=④apiのスコープ&response_type=code&approval_prompt=force&access_type=offline
にアクセス - 確認後にリダイレクトされたサイトのurl欄から
code=
以下をメモする=>⑤ - 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
- 取得したjsonをメモ⑥(リフレッシュトークンが含まれています)
curl --data "refresh_token=⑥リフレッシュトークン" --data "client_id=①クライアントID" --data "client_secret=②クライアントシークレット" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token
- apiに必要なアクセストークンが得られる
ここで得たリフレッシュトークンには有効期限がない
8,9の手順をphp等でまとめれば自動でトークンを更新できる
解決していない問題
winのコマンドプロンプトのcurlを使って試しにリクエストを送ろうとしていたが401エラーの解決法がわからず断念
コマンド内のoauthトークン発行がうまくいってなかったのかもしれない
まだローカルでしか確認できていないためherokuに挙げても実行できるのかわからない
gcloudコマンドをもう少し調べる
これでいけるなら他言語の実装も何とかなりそう
なぜか公式のcurlがうまくいかない
更新予定....