API Яндекс.Погоды - погода на сайт

Главные вкладки

Аватар пользователя nick80 nick80 29 марта 2022 в 11:49

Добрый день, всем.
Подскажите что делаю не так?
Делаю по примеру: https://coderbook.ru/2021/09/11/%D1%80%D0%B0%D0%B7%D0%B1%D0%B8%D1%80%D0%...

<?php    $client = \Drupal::httpClient();
        
    
$url "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
    
$response $client->get($url, array('header' => 'X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx'));
    
$body $response->getBody()->getContents();
    
$data json_decode($body 1);    ?>

Ключ активен.

Сайт пишет нет доступа: GuzzleHttp\Exception\ClientException: Client error: `GET https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393` resulted in a `403 Forbidden` response: Forbidden in GuzzleHttp\Exception\RequestException::create() (line 113 of /var/www/data/www/new/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php).

Подскажите, может я не правильно header задаю?

Комментарии

Аватар пользователя nick80 nick80 29 марта 2022 в 12:45
<?php$url = "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
    $response = $client->get($url, array('headers' => array('X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078')));?>

Такая конструкция также дает - > resulted in a `403 Forbidden`

Аватар пользователя nick80 nick80 29 марта 2022 в 14:10

Не совсем помогло, я естественно просмотрел "Доки" на Яндексе.
Они пишут:

Пример
Запрос:

GET https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393

X-Yandex-API-Key: 3fc...7

Вопрос в том, как правильно передать X-Yandex-API-Key, указанные выше записи работают не верно.
API не видит X-Yandex-API-Key

Аватар пользователя OldWarrior OldWarrior 29 марта 2022 в 14:26

nick80 wrote: $response = $client->get($url, array('header' => 'X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx'));

Матчасть, а именно 'headerS':

<?php
...
$client->get($url, array('headers' => array('X-Yandex-API-Key:e5287006-f9e1-415a-bec1-xxxxxxx')));
...
?>
Аватар пользователя OldWarrior OldWarrior 29 марта 2022 в 14:55

Да похоже я вас ввёл в заблуждение. Правильную реализацию вы уже привели выше в первом комментарии:

<?php
$response 
$client->get($url, array('headers' => array('X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078')));
?>

Должно работать при правильном API Key.

Аватар пользователя nick80 nick80 29 марта 2022 в 15:02
1
<?php
$client 
= \Drupal::httpClient();
        
    
$url "https://api.weather.yandex.ru/v2/informers?lat=55.75396&lon=37.620393";
$response $client->get($url, array('headers' => array('X-Yandex-API-Key' => 'c3014e2d-656e-4389-8ea5-xxxxxxx')));
    
$body $response->getBody()->getContents();
    
$data json_decode($body 1);
?>

Большое спасибо, что откликнулись на вопрос.
Привожу рабочую конструкцию запроса API Яндекс.Погоды для Drupal 9. В интернете нет такой информации, теперь будет. Подставляете только свое значение X-Yandex-API-Key

Аватар пользователя chelwolf chelwolf 20 января 2023 в 13:13

Подскажите как для Drupal 7 это может выглядеть? Вот такой вариант правильный?


<?php
    $yandex_weather_url 
"https://api.weather.yandex.ru/v2/informers?lat=55.043990&lon=59.964664";
    
$yandex_weather_options = array(
            
'method' => 'GET',
            
'header' => "X-Yandex-API-Key:0000000-0000000-0000000-00000-00000000000000"."\r\n"
        
);
    
$response drupal_http_request($yandex_weather_url$yandex_weather_options);
    
$data json_decode($response);
?>
Аватар пользователя chelwolf chelwolf 20 января 2023 в 14:13

Разобрался, решение для Drupal 7:

<?php
    $yandex_weather_url 
"https://api.weather.yandex.ru/v2/forecast?lat=55.043990&lon=59.964664";
    
$yandex_weather_options = array(
            
'headers' => array('X-Yandex-API-Key' => '0000000-00000000-0000-0000000000'),
            
'method' => 'GET'
        
);
    
$response drupal_http_request($yandex_weather_url$yandex_weather_options);
    
$data json_decode($response->data);
    
$weather=$data->fact;
    echo 
"Температура: ".$weather->temp."°C (ощущается как ".$weather->feels_like."°C)"
?>

Вместо нулей подставляем наш API Key. В переменной $yandex_weather_url в ссылке не забываем указать координаты места (lat и lon)

Аватар пользователя OldWarrior OldWarrior 29 марта 2022 в 15:04

Попробуйте ещё как-то так:

<?php
$response 
$client->get('https://api.weather.yandex.ru/v2/informers', [
  
'query' => [
    
'lat'  => '55.75396',
    
'lon' => '37.620393',
  ],
  
'headers' => [
    
'X-Yandex-API-Key' => 'e5287006-f9e1-415a-bec1-626c4ff25078',
  ]
]);
?>