Geocoding APIの使用でだいぶハマりました。よくは理解できてないのですが、一応動くようにはなったので、メモです。
現象
Google Maps APIの Geocoding APIでの位置情報がうまく取得できたりできなかったりという現象がおきておりました。
状況
APIキーの作成まで済んでいるのに動かない。色々調べていると下記の記事を見つけました。
参考:Google Map APIs を使用するためのAPIキー取得と設定方法
どうやら、『HTTPリファラーの制限』を行っていると下記のサービスはアクセスが拒否されるようです。
Google Maps Geocoding API
Google Maps Distance Matrix API
Google Maps Roads API
Google Maps Time Zone API
Google Maps Geolocation API
Google Maps Directions API
Google Maps Elevation API
Google Places API Web Service
なるほどと思い、IPアドレス制限を行うAPIキーを別途作成しました。
サーバのIPv4を入力。
すると、上記に書いた『位置情報がうまく取得できたりできなかったり』という状況になりました。
エラーメッセージ
コードは下記のように書いていたので、返り値の$xmlを出力しました。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://maps.googleapis.com/maps/api/geocode/xml?address="住所"&sensor=false&key=キー");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec($ch);
$xml = new SimpleXMLElement($xml);
$lat = (String)$xml->result[0]->geometry[0]->location[0]->lat;
$lng = (String)$xml->result[0]->geometry[0]->location[0]->lng;
curl_close($ch);
すると、下記のようなエラーメッセージが入っておりました。
” REQUEST_DENIED This IP, site or mobile application is not authorized to use this API key. Request received from IP address ○○○○○○(IPv6), with empty referer “
日本語にすると以下のような感じです。
リクエスト拒否。このIP、サイト、またはモバイルアプリケーションからのリクエストは許可されていないようです。このリクエストは○○○○○○(IPv6)から行われました。
解決
○○○○○○の部分にはIPv6が入っていて、エラーメッセージは「ここからアクセスされてるよ~」って教えてくれていたので、素直にそのIPv6をそのままGCPコンソールの『リクエストを受け入れるサーバー IP アドレス』に設定してみました。
するとなんと、安定して位置情報が取得できたんですね。
設定画面の説明文には「単一の IPv4 または IPv6、あるいは CIDR 表記法を使用したサブネット(例: 192.168.0.0/22)を指定します。」と書いてあり、IPv4でもいいはずではあるのですが、IPv6にするとなぜか解決したという話でした。
なので、結局よくわからないままだけれどとりあえず動いたという状況でして、使用しているサーバとの相性の問題なのかよくわからないのですが、同じ状況の方の参考になれば幸いです。
コメント