Получение правильного ответа от Google Geolocation API для MAC-адреса, PHP / JSON

В настоящее время я разрабатываю веб-портал для использования Google Geo-location API, особенно для MAC-адресов.

Я использую PHP и cURL для отправки запроса на API, декодирования возвращенного JSON из Google и в целях тестирования, повторяя результаты.

Код, который я сейчас успешно отправляю, отправляет запрос в API Google и получает результат без ошибок.

У меня проблема в том, что возвращаемые результаты определения местоположения никогда не относятся к расположению MAC-адреса, а всегда относятся к IP-адресу, используемому для отправки запроса. Точность также всегда очень высокая (неточная).

Я проверил это, используя предложенный Google ввод по адресу:

https://developers.google.com/maps/documentation/geolocation/intro#sample-requests

Я могу надежно изменить результат, возвращаемый API, используя VPN. Я также удостоверился, что мои запросы включают «считают IP» ложным. Если данные геолокации не найдены, API должен вернуть ошибку 404, однако я всегда получаю 200 кодов с результатами.

Из того, что я вижу, мой запрос на cURL правильный, и я в полном недоумении, почему API возвращает информацию о моем IP-адресе при использовании предложенного им собственного примера.

Код показан ниже:

function askGoogle(){
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.googleapis.com/geolocation/v1/geolocate?key=[MYAPIKEY]");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$JSONArray = array (
'considerIp' => 'false',
'wifiAccessPoints' =>
array (
0 =>
array (
'macAddress' => '00:25:9c:cf:1c:ac',
),
1 =>
array (
'macAddress' => '00:25:9c:cf:1c:ad',
),
),
);

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($JSONArray));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

$headers = array();
$headers[] = "Content-Type: application/json";
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/json", "Content-Length: 0"));

$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "The curl completion is ".$httpCode."<br>";

$message =  json_decode($result, true); //converts the returned JSON message into an array.

print_r(array_values($message));
echo "<br>";

curl_close ($ch);
}

0

Решение

Я получил ваш код работает. Я полагаю, что две причины, по которым ваш запрос возвращал ответ API по умолчанию на основе ip, заключается в том, что вы использовали http_build_query в массиве вместо json_encode, и потому что длина содержимого в заголовке была 0 вместо длины строки полезной нагрузки json ,

function askGoogle()
{
$ch = curl_init();

curl_setopt(
$ch,
CURLOPT_URL,
"https://www.googleapis.com/geolocation/v1/geolocate?key=[MYAPIKEY]");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$payloadArray = [
'considerIp' => false,
'wifiAccessPoints' => [
[
'macAddress'         => '00:25:9c:cf:1c:ac',
"signalStrength"     => -25,
"signalToNoiseRatio" => -101
],
[
'macAddress'         => '00:25:9c:cf:1c:ad',
"signalStrength"     => -25,
"signalToNoiseRatio" => -101
],
],
];

$payloadJson = json_encode($payloadArray);

curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
["Content-type: application/json", "Content-Length: ".strlen($payloadJson)]
);


curl_setopt($ch, CURLOPT_POSTFIELDS, $payloadJson);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);



$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}

$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "The curl completion is ".$httpCode."<br>";

$message =  json_decode($result, true); //converts the returned JSON message into an array.

print_r($message);
echo "<br>";

curl_close($ch);
}

askGoogle();
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]