Cloud Vision APIをPHPから使ってみた。その②
前回はCloud Vision APIに登録するところまで実施しましたので、
今回はPHP側からリクエストを投げてみたいと思います。
PHPファイルの作成
「Cloud Vision API」にリクエスト(画像)を投げて、レスポンス(解析結果)を取得するPHPファイルを作成していきます。
まずリクエストの形式ですが、POSTメソッドでJSON形式のリクエストを送信する必要があります。
詳細は以下のドキュメントに書かれています。
参考:https://cloud.google.com/vision/docs/reference/rest/v1/images/annotate?hl=ja
まず、以下の様にrequestsというキーに対してAnnotateImageRequestオブジェクトを値にセットするとあります。
{ "requests": [ { object(AnnotateImageRequest) } ], }
この「AnnotateImageRequest」のところが上述のドキュメントではリンクになっていますので、
クリックすると、その中にどのような設定をすればよいかが追えます。
AnnotateImageRequestには以下の項目をセットできることが分かります。
{ "image": { object(Image) }, "features": [ { object(Feature) } ], "imageContext": { object(ImageContext) }, }
「image」と「features」の設定が大事で、
「image」はどの画像を解析したいのか、
「features」でどんな解析をしたいかの指定を行っていきます(imageContextは必須ではないので削除しました)。
今回は顔の表情解析を行っていきたいので、以下の様に記述しました。
imageにはcontentにbase64エンコードした画像を指定します。
"image": { "content":【画像base64エンコードしたもの】, }, "features": [ { "type":"FACE_DETECTION" , "maxResults":3 , } ], }
さて、PHPでこのjsonを生成するにはjson_encode関数を用いて配列からjsonに変換します。
画像をbase64形式に変換するにはbase64_encode関数を用います。
$req_json = json_encode(array( "requests" => array( array( "image" => array( "content" => base64_encode(file_get_contents("test.jpg")), ), "features" => array( array( "type" => "FACE_DETECTION", "maxResults" => 3, ), ), ), ), ));
次に、出来上がったJSON形式の$req_jsonをPOSTしていきます。
PHPからPOSTリクエストを生成する際には、formタグなどが一般的ですが、今回はJSONがボディに入ってくるので、cURLを用います。
$curl = curl_init();
curl_init関数でPHPでcURLを用いるハンドラを生成します。
curl_initの説明:
新規セッションを初期化し、cURL ハンドルを返します。このハンドルは、関数 curl_setopt(), curl_exec(), curl_close() で使用します。
curl_setopt関数でリクエストのヘッダー部分などを生成していきます。
各設定項目と値は以下のようにしました。
CURLOPT_URL | “https://vision.googleapis.com/v1/images:annotate?key=*****” | リクエストURLを指定。 |
CURLOPT_CUSTOMREQUEST | POST | リクエストをPOSTに。 |
CURLOPT_HTTPHEADER | array( “Content-Type: application/json” ) | HTTPHEADERを指定。Content-Typeをjson形式に。 |
CURLOPT_RETURNTRANSFER | true | curl_exec() の戻り値を文字列で返す。 |
CURLOPT_TIMEOUT | 10 | レスポンスまでのタイムアウトを設定。 |
CURLOPT_POSTFIELDS | $req_json | POSTの内容。上述の$req_jsonを指定 |
オプションの設定ができたら、curlを実行します。
$res = curl_exec($curl); $info = curl_getinfo($curl);
レスポンスヘッダーサイズを取得したいため、curl_getinfoも取得しておきます。
その後、curlをクローズします。
curl_close($curl);
json部分を$res_jsonに代入し、それをjson_decodeでArray形式にもどします。
$res_json=substr($res,$info["header_size"]); $jsonArr=json_decode($res_json,true);
こうすることで、以下の様な形で戻り値をPHPで取得出来ました。
$jsonArr["responses"][0]["faceAnnotations"][0]["angerLikelihood"]
次回は戻ってきたレスポンス内容をもう少し詳しく見ていきたいと思います。
初級インフラエンジニアにオススメ連載リンク
ネットワーク学習の登竜門・・
ゼロからのCCNA独学講座
Linuxの取り扱いを基礎から学ぶ
Linux資格 「LPIC-Lv1」徹底解説