Передача данных о погоде в Яндекс Метрику с использованием API Яндекс Погоды
Ваш бизнес зависит от погоды? Доставка еды, службы такси, пункты проката, фермерские продукты, продажа сезонной одежды, занятия на открытом воздухе, парк развлечений? Научитесь передавать данные о погодных условиях в Яндекс Метрику и узнайте, как температура и условия влияют на конверсию и вашу выручку.
Примечание: о том, как передавать данные о погоде в Google Analytics, читайте в этой публикации.
В этом руководстве мы научимся передавать погодные данные, используя сервис Яндекса - Яндекс Погода. И поможет нам в этом Яндекс Тег Менеджер!
Яндекс Погода
Сразу бы хотелось отметить то, что приведенный ниже способ является платным. Итоговая стоимость реализации будет зависеть от выбранного вами тарифа доступа к API Яндекс Погоды. Однако Яндекс предоставляет бесплатный пробный период на 7 дней. Так что вам хватит времени попробовать выполнить все настройки, описанные в данном руководстве.
Яндекс Погода - это сервис от Яндекса, предоставляющий точные прогнозы погоды, карту осадков и метеоданные на основе собственной технологии Meteum, использующей ИИ, спутники, радары и отзывы пользователей.
Сервис работает через сайт, приложение и API, предлагая поминутные, почасовые, долгосрочные и тематические прогнозы для любой точки. Благодаря этому мы можем использовать Яндекс Погоду для передачи данных в Яндекс Метрику через Яндекс Тег Менеджер.
Для этого нужно использовать API. С помощью API Яндекс Погоды вы можете получать данные о погоде и использовать их в ваших системах или продуктах. Для этого есть интерактивная среда GraphQL и готовые REST-запросы.
API с нужной вам регулярностью передает текущие данные и прогноз по 150+ погодным параметрам: от базовых (температура, осадки) до нишевых, которые важны для вашего бизнеса. Например, на тестовом тарифе, который я буду использовать в текущей демонстрации, доступны следующие погодные данные:
- текущее значение облачности
- общие погодные условия в данный момент
- процент массовой доли водяных паров в воздухе относительно максимально возможного значения при текущей температуре
- иконка общих погодных условий
- планетарный K-индекс
- текущее атмосферное давление на среднем уровне моря
- фаза луны
- текущее погодное явление. Отсутствует при нормальных погодных условиях
- общий объем атмосферных осадков за этот час
- текущая вероятность осадков
- текущее значение силы осадков
- текущий тип осадков
- текущее атмосферное давление
- время начала восхода солнца
- время восхода солнца
- время окончания захода солнца
- время захода солнца
- значение температуры в тени на высоте двух метров над земной поверхностью
- видимость
- температура поверхности воды
- угол направления ветра
- текущее направление ветра
- скорость порывов ветра
- скорость ветра на высоте 10 метров над земной поверхностью
На других тарифах вы получите гораздо больше погодных данных.
Один из самых распространенных сценариев использования погодных данных - получение информации о текущей погоде в точке. Представьте себе, что вы можете сегментировать своих пользователей в Яндекс Метрике в зависимости от погодных условий в их регионе (например, в Яндекс Директе показывать рекламу зонтов, если precType (тип осадков) - дождь, или кондиционеров, если temperature (температура) > 25).
Чтобы запросить такие данные, необходимо в запросе указать объект now и перечислить поля, которые вы желаете получить в ответе.
Доступны данные по:
- температуре - temperature
- влажности воздуха - humidity
- давлению - pressure
- типу и силе осадков - precType, precStrength
- скорости и направлению ветра - windSpeed, windDirection
- облачности - cloudiness
- другим погодным параметрам.
Вы можете использовать специальные единицы измерения:
- PressureUnit - уровень давления;
- TemperatureUnit - температура;
- WindSpeedUnit - скорость ветра.
Более детальный список доступных полей и их аргументов можно посмотреть на странице Полная спецификация GraphQL.
Однако нас не просто интересуют погодные данные в конкретной точке, а погода в конкретном регионе у конкретного пользователя. Например, вы хотите на сайте отслеживать не просто факт оформления заказа, но еще и вместе с событием передавать данные о погодных условиях (какая температура в текущей локации посетителя, какая влажность воздуха, скорость ветра и т.д. и т.п.). Все это мы сделаем ниже.
Чтобы попробовать бесплатно API Яндекс Погоды в течение 7-ми дней (тестового периода), перейдите по ссылке и нажмите на кнопку Получить доступ:
На открывшейся странице примите условия использования сервиса и войдите с помощью Яндекс ID:
Далее Попробовать бесплатно:
Вам будет предоставлен тестовый период на 7 дней. Привязывать карту не нужно. Яндекс попросит вас рассказать о вашем проекте, для чего вы хотите получить доступ к API и как будете использовать погодные условия. Я указал как есть: Для демонстрации функционала API Яндекс Погоды и передачи данных о погодных условиях в Яндекс Метрику с помощью Яндекс Тег Менеджера. Мой проект - osipenkov.ru
После отправки информации Яндекс активирует вам пробный период на 7 дней, а на электронную почту придет соответствующее уведомление. Теперь вы можете пользоваться API Яндекс Погоды.
Теперь перейдем в интерфейс Яндекс Тег Менеджера и начнем настройку.
Активация функции “Пользовательский HTML”
Первым делом вам необходимо активировать опцию Пользовательский HTML в настройках счетчика Яндекс Метрики.
Для этого перейдите в раздел Настройки - Счетчик:
И включите функцию Пользовательский HTML:
Пользовательский HTML в Yandex Tag Manager (YTM) - это тип тега, который позволяет добавлять на сайт произвольный HTML-код, JavaScript или другие скрипты, которые не поддерживаются стандартными тегами и которых нет в каталоге шаблонов. Код будет выполняться при срабатывании триггера, в нем также можно использовать переменные для динамической подстановки нужных значений.
Сохраните изменения.
Создание триггера
Перейдите на вкладку Триггеры и создайте триггер типа Просмотр страницы:
Задайте ему название (например - All Pages (Все страницы)) и сохраните его.
Создание переменной
Теперь перейдите в раздел Переменные и создайте переменную типа Константа. В Значение переменной вставьте ключ, скопировав его из интерфейса API Яндекс Погоды:
У вас должно получится так:
Задайте название переменной (например - API ключ) и сохраните ее.
Создание тега
Откройте раздел Теги и создайте тег типа Пользовательский HTML с таким кодом:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
<script> (function () { /* =============================== НАСТРОЙКИ И ХЕЛПЕРЫ =============================== */ var YANDEX_API_KEY = 'КЛЮЧ_API'; // Ваш ключ API Яндекс Погоды var GEO_TIMEOUT = 3000; var SESSION_COOKIE_NAME = 'weather_session'; function log() { if (window.console) console.log.apply(console, arguments); } function pushToDataLayer(data) { window.dataLayer = window.dataLayer || []; window.dataLayer.push(data); } // Функция для получения значения куки по имени function getCookie(name) { var value = "; " + document.cookie; var parts = value.split("; " + name + "="); if (parts.length === 2) return parts.pop().split(";").shift(); } // Функция установки куки на 30 минут (1800000 мс) function setSessionCookie() { var d = new Date(); d.setTime(d.getTime() + 1800000); var expires = "expires=" + d.toGMTString(); document.cookie = SESSION_COOKIE_NAME + "=1; " + expires + "; path=/"; log('Сессионная кука установлена на 30 минут'); } /* =============================== ПОГОДА =============================== */ function fetchWeather(lat, lon, source) { log('Запрос погоды для источника:', source, lat, lon); fetch('https://api.weather.yandex.ru/v2/forecast?lat=' + lat + '&lon=' + lon, { headers: { 'X-Yandex-Weather-Key': YANDEX_API_KEY } }) .then(function (r) { if (!r.ok) throw new Error('Ошибка HTTP при запросе погоды'); return r.json(); }) .then(function (data) { var now = data.fact; pushToDataLayer({ event: 'weatherDone', // Название события для триггера в ЯТМ weather_source: source, // Источник геоданных (browser или ip) temperature: now.temp, // Температура в градусах Цельсия feels_like: now.feels_like, // Температура по ощущению condition: now.condition, // Код состояния погоды cloudiness: now.cloudness, // Облачность humidity: now.humidity, // Влажность воздуха (%) precType: now.prec_type, // Тип осадков precStrength: now.prec_strength, // Сила осадков pressure: now.pressure_mm, // Атмосферное давление в мм рт. ст. windSpeed: now.wind_speed, // Скорость ветра в м/с windDirection: now.wind_dir // Направление ветра }); setSessionCookie(); // Устанавливаем куки только после успешного запроса log('Данные о погоде отправлены в dataLayer'); }) .catch(function (err) { log('Ошибка при получении погоды:', err); }); } /* =============================== ГЕОЛОКАЦИЯ =============================== */ function geoByBrowser() { if (!navigator.geolocation) return Promise.reject('Геолокация не поддерживается'); return new Promise(function (resolve, reject) { navigator.geolocation.getCurrentPosition( function (pos) { resolve({ lat: pos.coords.latitude, lon: pos.coords.longitude, source: 'browser' }); }, function () { reject('Доступ к геолокации запрещен'); }, { timeout: GEO_TIMEOUT } ); }); } function geoByIp() { return fetch('https://ipwho.is/') .then(function (r) { return r.json(); }) .then(function (data) { if (!data.success) throw new Error('Не удалось определить гео по IP'); return { lat: data.latitude, lon: data.longitude, source: 'ip' }; }); } /* =============================== ИНИЦИАЛИЗАЦИЯ С ПРОВЕРКОЙ КУКИ =============================== */ if (getCookie(SESSION_COOKIE_NAME)) { log('Данные о погоде уже запрашивались в последние 30 минут. Пропуск.'); } else { log('Сессия не найдена. Начинаю поиск местоположения...'); geoByBrowser() .catch(function (err) { log('Браузерная гео недоступна, пробую IP'); return geoByIp(); }) .then(function (geo) { fetchWeather(geo.lat, geo.lon, geo.source); }) .catch(function (err) { log('Не удалось определить местоположение:', err); }); } })(); </script> |
Важно: в переменную YANDEX_API_KEY вставьте свою переменную типа Константа, которую вы создали на предыдущем шаге. В ней сохранен ваш ключ API Яндекс Погоды.
Примечание: API Яндекс Погоды имеет три версии с разными подходами к протоколу и функционалу. v1 - устаревшая версия, не рекомендуется для использования. v2 использует REST API, а v3 перешла на GraphQL с расширенными данными.
Больше никаких изменений в коде не делайте. В качестве триггера активации задайте All Pages (Все страницы). Сохраните тег.
Расшифровка кода
Этот скрипт предназначен для автоматического определения местоположения пользователя, получения данных о погоде через API Яндекс Погоды и передачи этих данных в Яндекс Тег Менеджер (через dataLayer).
1. Настройки и переменные
- YANDEX_API_KEY - ключ доступа к API Яндекс Погоды;
- GEO_TIMEOUT - лимит ожидания ответа от встроенной геолокации браузера (3000 - 3 секунды);
- SESSION_COOKIE_NAME - название куки (в нашем примере - weather_session), которая используется для предотвращения повторных запросов к API;
- log() - вспомогательная функция для вывода сообщений в консоль браузера (для отладки);
- pushToDataLayer(data) - функция-обертка для отправки объектов в массив window.dataLayer.
2. Функции для работы с файлами cookie
- getCookie(name) - ищет в браузере куки с указанным именем. Возвращает значение, если куки существует;
- setSessionCookie() - создает куки на 30 минут. Это механизм оптимизации: скрипт не будет запрашивать погоду при каждом обновлении страницы, если данные уже были получены недавно (экономия лимитов API).
3. Функции определения местоположения (геолокация)
Скрипт использует двухэтапную проверку:
- geoByBrowser() - пытается получить координаты через встроенное API браузера (запрашивает разрешение у пользователя). Если пользователь разрешил доступ, возвращает широту и долготу;
- geoByIp() - если браузерная геолокация недоступна или пользователь отклонил запрос, скрипт обращается к стороннему сервису ipwho.is, который определяет примерные координаты по IP-адресу пользователя.
Другими словами, когда пользователь заходит на сайт - у него запрашивается доступ к данным о геолокации:
Если человек предоставляет этот доступ - скрипт считывает GPS-координаты посетителя и для этих координат возвращает данные о погоде. Если пользователь запрещает доступ к данным о геолокации - координаты определяются по IP-адресу посетителя сайта с помощью ipwho.is. Если пользователи используют VPN - данные о погоде будут неточными.
Примечание: при современном развитии интернет-технологий и различных защит отслеживаний в браузерах могут возникнуть ситуации, при которых сам браузер блокирует на своей стороне выполнения скрипта, в результате чего вы не сможете узнать местоположение пользователя, скрипт не сработает и не передаст эту информацию в аналитику.
4. Функция получения погоды
|
1 |
fetchWeather(lat, lon, source): |
- принимает координаты и метку источника (browser или ip в зависимости от выбранного способа определения геолокации);
- выполняет GET-запрос к API Яндекс Погоды;
- при успешном ответе вызывает pushToDataLayer и устанавливает сессионную куку.
5. Логика работы (инициализация)
При загрузке страницы скрипт выполняет следующие действия:
- проверка файла cookie. Если кука weather_session есть - скрипт завершает работу, так как погода уже была получена;
- поиск координат. Сначала пробует geoByBrowser (определение геолокации через браузер). Если ошибка - пробует geoByIp (определение геолокации с помощью стороннего сервиса ipwho.is);
- запрос данных. С полученными координатами вызывает API Яндекса.
- результат. Данные уходят в аналитику.
6. Что попадает на уровень данных (dataLayer)?
Самое важное и интересное. После успешного получения погоды в dataLayer отправляется событие weatherDone, а вместе с ним ряд параметров:
- event - название события для настройки триггера специального события;
- weather_source - как узнали местоположение пользователя (по браузеру или по ip-адресу);
- temperature - температура воздуха;
- feels_like - температура по ощущениям;
- condition - общие погодные условия;
- cloudiness - облачность;
- humidity - влажность воздуха;
- precType - тип осадков;
- precStrength - сила осадков;
- pressure - атмосферное давление;
- windSpeed - скорость ветра;
- windDirection - направление ветра.
Эти и другие параметры подробно представлены в официальной документации API Яндекс Погоды. Вы можете менять их в коде в зависимости от ваших задач.
Создание триггера специального события
Сохранив тег, перейдите на вкладку Триггеры и создайте триггер типа Специальное событие. В поле Название события введите weatherDone:
Назовите триггер (например - weatherDone) и сохраните его.
Создание переменных уровня данных
После этого перейдите на вкладку Переменные и создайте переменную типа Переменная уровня данных. В поле имя переменной уровня данных поочередно добавьте все значения, которые присутствуют в вашем пользовательском HTML-теге:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pushToDataLayer({ event: 'weatherDone', // Название события для триггера в ЯТМ weather_source: source, // Источник геоданных (browser или ip) temperature: now.temp, // Температура в градусах Цельсия feels_like: now.feels_like, // Температура по ощущению condition: now.condition, // Код состояния погоды cloudiness: now.cloudness, // Облачность humidity: now.humidity, // Влажность воздуха (%) precType: now.prec_type, // Тип осадков precStrength: now.prec_strength, // Сила осадков pressure: now.pressure_mm, // Атмосферное давление в мм рт. ст. windSpeed: now.wind_speed, // Скорость ветра в м/с windDirection: now.wind_dir // Направление ветра }); |
Для источника геоданных укажите Имя переменной уровня данных - weather_source:
Для температуры - temperature:
Для температуры по ощущения - feels_like:
И так далее. В результате, если вы будете отслеживать все параметры, которые перечислены в моем коде, вам нужно создать 11 переменных уровня данных:
API Яндекс Погоды отдает некоторые значения на английском языке. Например, параметр precType (тип осадков) на тестовом тарифе принимает следующие значения:
- 0 - без осадков;
- 1 - дождь;
- 2 - дождь со снегом;
- 3 - снег;
- 4 - град.
При проверке работы в режиме отладки Яндекс Тег Менеджера это будет выглядеть так:
И чтобы не запоминать все коды при анализе параметров событий/визита в Яндекс Метрике, вы можете преобразовать значения в удобный вид. Для этого используйте переменную типа Таблица поиска.
В качестве входной переменной выберите переменную уровня данных precType:
Задайте входные и выходные данные (результат):
Задайте переменной название (например - Таблица поиска - Тип осадков) и сохраните ее.
Проделайте точно такие же действия для других переменных, для которых требуется осуществить сопоставление или перевод погодных данных.
Коды расшифровки погодного описания для параметра condition:
- clear - ясно;
- partly-cloudy - малооблачно;
- cloudy - облачно с прояснениями;
- overcast - пасмурно;
- light-rain - небольшой дождь;
- rain - дождь;
- heavy-rain - сильный дождь;
- showers - ливень;
- wet-snow - дождь со снегом;
- light-snow - небольшой снег;
- snow - снег;
- snow-showers - снегопад;
- hail - град;
- thunderstorm - гроза;
- thunderstorm-with-rain - дождь с грозой;
- thunderstorm-with-hail - гроза с градом.
Параметр wind_dir (направление ветра):
- nw - северо-западное;
- n - северное;
- ne - северо-восточное;
- e - восточное;
- se - юго-восточное;
- s - южное;
- sw - юго-западное;
- w - западное;
- c - штиль.
Параметр prec_strength (сила осадков):
- 0 - без осадков;
- 0.25 - слабый дождь/слабый снег;
- 0.5 - дождь/снег;
- 0.75 - сильный дождь/сильный снег;
- 1 - сильный ливень/очень сильный снег.
Параметр cloudness (облачность) принимает следующие значения:
- 0 - ясно;
- 0.25 - малооблачно;
- 0.5 - облачно с прояснениями;
- 0.75 - облачно с прояснениями;
- 1 - пасмурно.
Подробнее о параметрах погоды и объекте fact читайте в официальной справке.
Передача данных в Яндекс Метрику
Последним шагом в Яндекс Тег Менеджере является создание тега для Яндекс Метрики. Как отмечалось ранее, обогащение данных Метрики позволяет более точно сегментировать пользователей с учетом погодных условий в их регионе. В долгосрочной перспективе это повышает эффективность таргетирования и оптимизации рекламных кампаний в Яндекс Директе. В связи с этим рекомендуется передавать погодные данные на уровне визита (метод params), поскольку вряд ли они меняются от события к событию.
Вернитесь в Яндекс Тег Менеджер, перейдите на вкладку Теги и создайте тег типа Пользовательский HTML. Добавьте в него нижеприведенный код (если все сделали так, как я показал выше):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<script> ym(XXXXXX, 'params', { "API Яндекс Погоды": { "Источник геоданных": "{{DLV - weather_source}}", "Температура": "{{DLV - temperature}}", "Температура по ощущениям": "{{DLV - feels_like}}", "Состояние погоды": "{{DLV - condition}}", "Облачность": "{{DLV - cloudiness}}", "Влажность воздуха в %": "{{DLV - humidity}}", "Тип осадков": "{{DLV - precType}}", "Сила осадков": "{{DLV - precStrength}}", "Атмосферное давление в мм рт.ст.": "{{DLV - pressure}}", "Скорость ветра в м/с": "{{DLV - windSpeed}}", "Направление ветра": "{{DLV - windDirection}}" } }); </script> |
, где вместо XXXXXX укажите собственный идентификатор Яндекс Метрики.
Задайте тегу название и сохраните его.
Проверка настроек
Поскольку мы передаем данные в Яндекс Метрику на уровне визита, то для проверки всех параметров целесообразнее использовать комбинированный подход - активировать режим предварительного просмотра Яндекс Тег Менеджера и панель отладки самой Метрики с помощью параметра _ym_debug=2.
Как только вы зайдете на сайт, отобразится всплывающее окно с запросом на разрешение доступа к данным о местоположении и на шкале событий появится weatherDone. Если вы настроили все корректно, то HTML-тег Яндекс Метрики будет активным.
Открыв вкладку DataLayer, вы увидите какие значения переменные приняли в текущий момент времени:
Вы также можете перейти на вкладку Переменные и убедиться, что все переменные уровня данных, которые вы создали, вернули конкретные значения:
И напоследок откройте панель отладки Метрики, вкладку Parameters:
Эти данные будут отображаться и в консоли разработчика на вкладке Console, включая логи:
Я живу в Москве. Но по IP определился как Подольск. На момент написания этой статьи Яндекс определил мою погоду как облачно с прояснениями (cloudly) и температуру -21 ℃ (по ощущениям -26 ℃). Что вполне похоже на правду.
Теперь эти данные отображаются в моих отчетах Яндекс Метрики. В частности, в отчете Параметры визитов:
И в самой карточке пользователя на уровне визита:
И пример сегментации на уровне визита (отчет по географии с температурой в этом регионе):
В завершение не забудьте опубликовать контейнер Яндекс Тег Менеджера.
Пример всплывающего окна в браузере, когда пользователь заходит на сайт:
Ради интереса вернитесь в интерфейс API Яндекс Погоды и посмотрите, какое количество запросов вы израсходовали во время этих настроек и тестов:
На тестовом тарифе вам доступно до 10 000 запросов в месяц.
Заключение
В этом руководстве мы с вами разобрали нетривиальную настройку продвинутого уровня, которая позволяет обогатить данные вашего счетчика Яндекс Метрики дополнительной информации с использованием API Яндекс Погоды. Благодаря этому у вас появляется возможность более гибко работать со своей аудиторией - сегментировать их по дополнительным параметрам, создавать списки, использовать аудитории в Яндекс Директе, персонализировать рекламу, контент и многое другое.
Учтите, что поскольку в коде используются сторонние API и открытые ключи в клиентском коде (ваш API ключ Яндекс Погоды) - это всегда компромисс между удобством разработки и безопасностью. Поскольку переменная YANDEX_API_KEY передается в открытом виде в JavaScript-коде, она доступна для обнаружения через исходный код страницы или инструменты разработчика любым пользователем. Злоумышленник может скопировать ваш ключ и использовать его в своих проектах. Яндекс предоставляет определенное количество бесплатных запросов в сутки. Если ваш ключ «украдут», лимиты исчерпаются мгновенно, и сервис на вашем основном сайте перестанет работать.
Единственным недостатком Яндекс Погоды остается стоимость тарифов. Сервис довольно дорогой, и не каждый бизнес может позволить себе подписку - особенно в случаях, когда трафик на сайте невысокий. К счастью, существуют альтернативные погодные сервисы, которые позволяют решать те же задачи. Некоторые из них предлагают бесплатные лимиты на количество API-запросов (отлично подходит для небольших проектов), а некоторые ориентированы на некоммерческое использование, но при этом имеют ограничения на набор доступных параметров.
Так, например, в статье о передаче данных о погоде в Google Analytics использовался сервис OpenWeatherMap. Кроме того, на GitHub можно найти множество репозиториев, предлагающих получение погодных данных через API. К таким решениям относится, например, Open-Meteo Weather API.
Если эта статья наберет хотя бы 100 реакций под постом в моем Telegram, то я опубликую продолжение с использованием бесплатных или более дешевых решений!





































