Как я могу получить данные JSON из URL, используя PHP? Я получаю ошибку аутентификации - PullRequest
3 голосов
/ 03 апреля 2019

Это общедоступный URL-адрес для данных о погоде JSON от Национальной службы погоды США.

https://forecast.weather.gov/MapClick.php?lat=39.71&lon=-104.76&FcstType=json

Если я введу этот URL-адрес в адресную строку браузера (или щелкните ссылку выше), я получу именно те данные JSON, которые мне нужны. Но все мои попытки с PHP (на моем сайте WordPress) приводят к ошибкам аутентификации. Я пробовал варианты предложений StackOverflow по этой линии:

$json = file_get_contents('url_here');
$obj = json_decode($json);
echo $obj->access_token;

Я пробовал несколько вариантов предложений StackOverflow по этой строке:

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'url_here');
$result = curl_exec($ch);
curl_close($ch);

$obj = json_decode($result);
echo $obj->access_token;

Во всех случаях я получаю ошибки аутентификации:

Доступ запрещен
У вас нет прав доступа к * http://forecast.weather.gov/MapClick.php?" на этом сервере.

Ссылка № 18.d56775c7.1554244115.21225898

Тот факт, что сообщение об ошибке останавливается на "?" в URL заставляет задуматься, нужно ли передавать параметры PHP другим способом, кроме простого добавления их к URL.

Полагаю, мне не нужны данные аутентификации (имя пользователя, пароль), потому что данные NWS предназначены для публичного использования.

Предложения будут оценены.

1 Ответ

1 голос
/ 03 апреля 2019

Похоже, что сайт, к которому вы пытаетесь получить доступ, ожидает агента пользователя.

Не беспокойтесь, мы легко можем сделать это с помощью cURL:

<?php
    function curler ($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output);
    }

    var_dump (
        curler("https://forecast.weather.gov/MapClick.php?lat=39.71&lon=-104.76&FcstType=json")
    );

Что вернет ожидаемые вами данные в объекте.

...