Получение статистики Яндекс Метрики в Telegram с помощью n8n
Подробный гайд по созданию собственного чат-бота в Telegram с использованием n8n для получения статистики из вашего счетчика Яндекс Метрики.
Перед тем, как повторять нижеприведенные шаги, вы должны использовать экземпляр n8n в n8n Cloud или же установить n8n на своем собственном сервере. Подробнее о том, как это сделать, читайте в этом руководстве. В нем я использовал решение selfhost-ai (ex. n8n-install, Автор - Yury Kossakovsky) - готовый инсталлятор для развертывания n8n Community Edition и целого набора дополнительных сервисов на собственном сервере под управлением Docker Compose.
Основные этапы настройки автоматизации, которые вам предстоит выполнить, следующие:
- создать бота в Telegram;
- получить токен доступа для работы с API Яндекс Метрики;
- создать рабочий процесс в n8n.
Давайте рассмотрим каждый шаг подробнее.
Импорт шаблона n8n
Скачать итоговый шаблон n8n из этого руководства вы можете на моей образовательной платформе edu.osipenkov.ru, в разделе Материалы.
СКАЧАТЬ WORKFLOW
1. Создание Telegram-бота
Подробнее про создание бота в Telegram и получение токена читайте здесь.
2. Получение токена для Яндекс Метрики
Для этого используйте инструкции:
3. Создание рабочего процесса n8n
Создав бота в Telegram и сохранив его chat_id и токен, а также создав приложение Яндекса и получив токен доступа для работы с счетчиками Яндекс Метрики, мы наконец можем перейти к основной части - созданию workflow в n8n.
Для этого перейдите в интерфейс своего инстанса (экземпляра) n8n и создайте новый рабочий процесс:
В открывшемся окне нажмите на холсте и в строке поиска введите Telegram:
В n8n триггеры Telegram определяют, на какое именно событие внутри мессенджера будет реагировать ваш бот, чтобы запустить сценарий автоматизации.
Доступны варианты:
- On callback query - срабатывает, когда пользователь нажимает на инлайн-кнопку (кнопку, прикрепленную прямо к сообщению);
- On channel post - запускает сценарий при публикации нового поста в канале, где ваш бот является администратором;
- On edited channel post - срабатывает в момент, когда кто-то редактирует уже существующий пост в канале;
- On edited message - реагирует на редактирование обычного сообщения пользователем в чате или группе;
- On inline query - активируется при использовании инлайн-режима. Это когда пользователь вводит юзернейм бота (например, @gif hello) в поле ввода любого чата, и бот должен «на лету» предложить варианты ответов (картинки, статьи и т.д.);
- On message - самый популярный триггер, срабатывающий на любое новое входящее сообщение (текст, фото, файл, стикер, голосовое) в личном чате с ботом или группе;
- On Poll Change - запускается, когда изменяется состояние опроса (например, кто-то проголосовал или опрос был остановлен). Бот должен быть автором опроса или админом чата;
- On pre checkout query - срабатывает на этапе финальной проверки платежа в Telegram. После того как пользователь нажал «Оплатить», Telegram отправляет этот запрос боту, чтобы тот подтвердил наличие товара и актуальность цены перед списанием денег;
- On shipping query - активируется, когда пользователь оформляет заказ через платежную систему Telegram и выбирает адрес доставки. Триггер нужен, чтобы рассчитать стоимость доставки на основе указанного адреса.
Для нашего бота подойдет самый популярный триггер - On message, который срабатывает на любое новое входящее сообщение. Выберите его:
В настройках триггера нажмите на кнопку Set up credential, чтобы добавить данные от вашего чат-бота Telegram:
В открывшемся окне в поле Access Token добавьте токен, который бот прислал после его создания (см. выше):
Сохраните свои учетные данные, нажав на кнопку Save.
После этого вернитесь в настройки триггера Telegram. Вы должны увидеть, как в разделе Credential подставились ваши учетные данные от бота Telegram:
Теперь мы должны немного изменить настройки триггера. Для этого в разделе Trigger On раскройте список и выберите дополнительно Callback Query:
Поскольку мы планируем создать чат-бота для получения статистики из Яндекс Метрики и для ввода настроек использовать inline-кнопки, то нам обязательно нужно выбрать этот вариант, поскольку именно триггер On callback query срабатывает, когда пользователь нажимает на инлайн-кнопку (кнопку, прикрепленную прямо к сообщению).
На этом настройки триггера Telegram завершены. Теперь нужно продумать дальнейшую логику работы нашего рабочего процесса и правила, по которым бот в Telegram будет нам отвечать. Для этого я предлагаю использовать узел-действие (action node) Switch, который позволяет создать несколько развилок/ветвлений и выполнять разные сценарии в зависимости от выбранного действия на предыдущем шаге.
Как правило, первую команду, которую вводят боту в Telegram, является команда /start. Но это только в самом начале. Далее вы уже можете общаться с ним без всяких вводных сообщений. Таким образом, для активации следующих шагов нам необходимо предусмотреть три правила:
- start - если пользователь (вы) написал в чате команду /start, бот показывает нам меню с кнопкой получения отчета по Яндекс Метрике (report);
- report - после нажатия на inline-кнопку весь основной процесс будет проходить далее по этому узлу (ввод данных счетчика Яндекс Метрики и получение итогового отчета);
- Fallback - если пользователь написал в чате любое другое сообщение (ни /start, и ни выбрал создание отчета), то бот отправляет подсказку по созданию отчета.
Давайте реализуем такие правила. Для этого рядом с триггером Telegram нажмите на иконку + и в окне выбора следующего узла введите в поиске Switch. Выберите этот узел:
Для того, чтобы настроить правила в этом узле, нам необходимо понять, какие данные и в каком виде приходят в n8n от предыдущего узла (триггера Telegram) в текущий, чтобы дальше настроить правила распределения по веткам Switch. Для этого нажмите слева (в разделе Input) на кнопку Execute previous nodes:
Вернитесь в своего бота Telegram и напишите что-нибудь в чат. Например, выполните команду /start. После этого во входных данных узла должен появиться результат этого сообщения.
Теперь мы можем использовать схему полученных данных для составления правил в Switch. Первое правило - это ветка start. Выбрав в настройках узла режим Rules (по правилам), перетащите в Routing Rules в value1 поле text из объекта message. В ней хранится текст сообщения пользователя в чате:
Если перетащить из схемы именно это поле, в условии получится что-то вроде:
|
1 |
{{ $json.message.text }} |
А поскольку эта ветка будет работать только с командой /start, то в поле value2 вставьте значение /start:
Условие в правиле можно оставить таким - is equal to (равно). При желании вы можете переименовать название самой ветки в Rename Output, указав свое собственное значение в поле Output Name. Например, написать просто start:
Закройте пока настройки узла и вернитесь на холст. Ваш рабочий процесс должен выглядеть примерно так. Он будет состоять всего из одной ветки start:
Для настройки ее логики нажмите на иконку + и в строке поиска введите Telegram. Выберите Action - Send a text message:
Нам нужно, чтобы после выполнения команды /start бот отправлял нам сообщение с inline-кнопкой, с помощью которой мы можем создать отчет Яндекс Метрики.
В настройках этого узла проверьте, чтобы:
- в разделе Credential автоматически подставили ваши учетные данные от аккаунта Telegram;
- в меню Resource был выбран Message;
- в настройках Operation было выбрано Send Message.
В поле Chat ID перетащите значение переменной id, которая является частью объекта chat внутри другого объекта message (message.chat.id), чтобы оно автоматически подставилось:
Если перетащить из схемы именно это поле, в условии получится:
|
1 |
{{ $json.message.chat.id }} |
В поле Text напишите текст сообщения бота, которое будет отображаться вместе с inline-кнопкой. Например: Привет! Нажми на кнопку, чтобы получить отчет Яндекс Метрики:
Чтобы добавить кнопку в сообщение, в разделе Reply Markup из выпадающего списка выберите Inline Keyboard:
Так можно показать кнопку и передать скрытые данные через дополнительные настройки (callback_data).
Выбрав Inline Keyboard, нажмите на кнопку Add Keyboard Row, а затем на Add Button. В поле Text введите название кнопки. Например, 📊 Отчет по Яндекс Метрике:
В Additional Fields нажмите кнопку Add Field и выберите из выпадающего списка Callback Data. Это обязательный шаг, без которого ваша основная логика получения статистики из Яндекс Метрики не будет работать:
Callback Data - это скрытое значение, которое отправляется вашему чат-боту при нажатии inline-кнопки. Пользователь его не видит, но оно дает возможность далее выполнять определенные действия в боте по заданному сценарию. В нашем workflow это нужно, чтобы узел Switch понял, какую кнопку нажали, и запустил нужную ветку.
В моем примере поле Callback Data имеет значение ym_report, но вы можете задать любое другое. Главное, чтобы оно дальше использовалось в рабочем процессе. Если вы работаете по моему шаблону n8n, это значение лучше не менять:
На этом настройка узла-действия Telegram по ветке start завершена. Вы можете попробовать запустить этот узел, чтобы посмотреть, как сообщение с inline-кнопкой будет выглядеть в боте Telegram:
Если вам не нравится системное уведомление This message was sent automatically with n8n, вы можете его скрыть. Для этого вернитесь в настройки узла и в самом низу в настройках Additional Fields добавьте поле Add Field - Append n8n Attribution:
И просто отключите эту настройку:
Теперь сообщения будут приходить без этого уведомления.
Закройте настройки узла Telegram. Нажмите снизу кнопку Execute workflow, чтобы выполнить тестовый запуск вашего рабочего процесса:
Откройте вашего бота и нажмите на inline-кнопку 📊 Отчет по Яндекс Метрике. Вы должны увидеть, как по цепочке запустилось несколько узлов и выполнение остановилось на Switch:
Примечание: если меню еще не было: отправьте /start, а затем нажмите inline-кнопку 📊 Отчет по Яндекс Метрике.
Откройте настройки узла Switch. Для создания еще одного правила внутри Switch нажмите на кнопку Add Routing Rule:
Теперь вам нужно заполнить правила для основной ветки, по которой и будет происходить вся логика работы вашего чат-бота Telegram - создание отчета с заданными параметрами и получение статистики из Яндекс Метрики.
На предыдущем шаге в Callback Data кнопки мы указали ym_report. Чтобы Switch направил выполнение в нужную ветку, добавьте новое правило - из входных данных возьмите поле data объекта callback_query (callback_query.data) и перетащите его в value1:
Именно в этом поле приходит значение Callback Data нажатой кнопки. В value2 укажите ym_report - то же скрытое значение, которое вы задали кнопке в узле Telegram. Если вы его изменили, то добавьте свое. В правиле можно оставить условие is equal to (равно), но саму ветку переименовать, указав в Rename Output - Output Name собственное имя. Например - report.
Таким образом, итоговое второе правило, где будет происходить вся основная работа вашего workflow n8n, выглядит так:
Нам осталось добавить последнее правило, которое бы срабатывало в боте тогда, когда пользователь (или вы) не выполнил команду /start и не нажал на inline-кнопку (ym_report), а сделал что-то другое. Для этого в настройках узла Switch в разделе Options нажмите на кнопку Add option и добавьте Fallback Output:
В представленном списке выберите Extra Output:
Fallback Output - это запасной выход Switch. Сюда попадает все, что не подошло ни под одно правило (в нашем случае - не /start и не ym_report), а это Extra Output - вариант этого запасного выхода. n8n создает отдельную дополнительную ветку Fallback (ее можно переименовать, но мы этого делать не будем).
Именно на нее мы повесим узел с подсказкой, который будет напоминать пользователю (нам) о том, как запустить рабочий процесс по основному сценарию и получить статистику из счетчика Яндекс Метрики.
Для этого рядом с дополнительной веткой Fallback нажмите на иконку + и в строке поиска введите Telegram. Выберите Action - Send a text message:
В настройках этого узла укажите Chat ID. Обновления Telegram бывают разными, поэтому идентификатор чата может лежать в разных полях: у текстового сообщения - в message.chat.id, у нажатия кнопки - в callback_query.message.chat.id. Ветка Fallback как раз может получить и то, и другое. Поэтому здесь лучше использовать конструкцию:
|
1 |
{{ $json.message.chat.id || $json.callback_query.message.chat.id }} |
Ее смысл достаточно простой - взять id из message.chat.id, а если его нет - из callback_query. Символ || означает логическое условие ИЛИ.
Последняя настройка узла - это поле Text. В него введите то, что вы хотите, чтобы отображалось тогда, когда пользователь отправил не /start или не нажал на inline-кнопку. Например: Напиши /start, а затем нажми кнопку 📊 Отчет по Яндекс Метрике:
Примечание: не забудьте отключить опцию Append n8n Attribution, чтобы не отображалось системное сообщение от n8n.
В итоге, если отправить в чат что угодно, кроме /start, и не нажать кнопку отчета, бот ответит вам сообщением-подсказкой:
На этом этапе я рекомендую переименовать названия узлов, чтобы вы потом не запутались. Например, так:
Теперь мы можем двигаться дальше, по центральной ветке, и настраивать основную логику workflow.
Следующее, что нужно сделать, после того как вы нажмете на кнопку 📊 Отчет по Яндекс Метрике, это создать узел, в котором будут задаваться настройки конфигурации отчета - диапазоны дат, модель атрибуции и тип отчета.
Для этого на ветке report нажмите на иконку + и в строке поиска введите Telegram. Выберите Action - Send message and wait for response:
Этот узел отправляет пользователю сообщение и ставит выполнение workflow на паузу, пока не придет ответ. В отличие от обычной отправки текста, он не идет дальше по цепочке сразу. Сценарий ждет, пока человек заполнит форму или нажмет кнопку ответа. Когда данные получены, n8n возобновляет процесс и передает ответ в следующие узлы. Так бот в одном запуске и запускает сценарий, и собирает параметры отчета (период, шаблон, модель атрибуции) без отдельной логики хранения состояния.
Повторно запустите узел Показ inline-кнопки и нажмите в своем чат-боте на нее. В результате дальше по цепочке через Switch они попадут в Input только что созданного узла Send message and wait for response:
Теперь нам необходимо заполнить настройки нужными данными. Во-первых, перетащите поле id из объекта chat (chat.id), который является объектом message, а тот, в свою очередь является частью callback_query, в поле Chat ID:
Перетащите поле id из объекта chat в поле Chat ID. Оно лежит в callback_query.message.chat.id (callback_query - message - chat - id):
Если перетащить из схемы именно это поле, в условии получится:
|
1 |
{{ $json.callback_query.message.chat.id }} |
В поле Message добавьте свое сообщение, которое будет напоминать вам о выборе конфигурации отчета. Например: Выбери шаблон отчета (preset), период и модель атрибуции:
В разделе Response Type измените значение на Custom Form:
В режиме sendAndWait бот отправляет сообщение и ждет ответ. Response Type как раз задает, в каком виде этот ответ собрать:
- Custom Form - форма с полями (текст, списки и т.д.) по ссылке n8n. Удобно использовать, когда нужно сразу несколько параметров, как в нашем примере;
- Approval - кнопки подтверждения вроде Approve / Decline (да/нет). Тут нет формы, только решение пользователя. Для нашего примера не подойдет;
- Free Text - свободный текстовый ответ: пользователь просто пишет сообщение в чат, а бот ждет этот текст. Подходит для одного значения (например: введи номер счетчика Яндекс Метрики), но не для нескольких полей сразу.
Другими словами, Custom Form - анкета, Approval - да/нет, а Free Text - один текстовый ответ.
Следующая настройка - это Define Form - Using Fields Below. Это означает, что мы сами создаем форму прямо в этом узле со своим набором полей и опций. Поочередно добавим несколько таких полей для заполнения:
Задайте для первого поля такие настройки:
- Field Name - counter_id
- Element Type - Text type
- Required Field - включено
В это поле вы будете вводить ID счетчика Яндекс Метрики, из которого планируете получить статистику.
Снова нажмите на кнопку Add Form Element и добавьте еще одно поле с такими настройками:
- Field Name - preset
- Element Type - Dropdown
- Option - по очереди: sources_summary, search_engines, sources_sites, tech_browsers, tech_devices, traffic, geo_country, content_entrance;
- Required Field - включено
Этот список - шаблоны Яндекс Метрики. В API отчетов параметр preset автоматически задает метрики и группировки, которые необходимы для того или иного отчета. Вы можете задать свою собственную конфигурацию из параметров (dimensions) и показателей (metrics), а можете использовать другой список шаблонов (не мой из этого руководство), который подробно представлен в официальной документации Яндекса.
Следующее поле, которое нужно создать, имеет такие настройки:
- Field Name - date_from
- Element Type - Text type
- Text input - 2026-07-01
- Required Field - включено
Оно предназначено для ввода даты начала периода, за который вы хотите выгрузить данные.
Следующее поле - точно такое же, только для даты окончания отчетного периода:
- Field Name - date_to
- Element Type - Text type
- Text input - 2026-07-15
- Required Field - включено
Для полей date_from и date_to я специально добавил подсказки, так как даты нужны в формате YYYY-MM-DD (например, 2026-07-01). Он выглядит «перевернутым» относительно привычного ДД.ММ.ГГГГ. Но так требует API Яндекс Метрики. Период в запросе передается как date1 / date2 именно в ISO-формате YYYY-MM-DD. Если указать дату иначе, запрос к API, скорее всего, завершится ошибкой.
Последнее поле, которое мы добавив для заполнения - это:
- Field Name - attribution
- Element Type - Dropdown
- Option - по очереди: last, lastsign, cross_device_first, cross_device_last_significant, automatic;
- Default value - lastsign;
- Required Field - включено
Для API отчетов доступна параметризация - механизм задания параметров для некоторых группировок и метрик. И там мы можем добавить модель атрибуции. Это поле как раз и будет отвечать за это в нашем отчете.
Чтобы открыть текущую форму для заполнения, в разделе Options в самом низу нажмите на кнопку Add option и выберите Message Button Label:
В поле Message Button Label введите текст кнопки. Например: Создать отчет:
Еще раз нажмите Add option и выберите Response Form Title. Эта настройка отвечает за заголовок на странице формы. Введите произвольный title. Например: Параметры отчета Яндекс Метрики:
Следующую настройку, которую можно добавить - это Response Form Description. Она позволяет добавить подсказку прямо под заголовком формы. Давайте сделаем это и добавим туда следующий текст:
- counter_id - ID счетчика
- preset - готовый шаблон API отчетов
- date_from/date_to - в формате YYYY-MM-DD
- attribution - модель атрибуции
Еще одна настройка, которую я предлагаю добавить в этом узле - Response Form Button Label. После нажатия на текст этой кнопки заполненные данные уходят в n8n, и workflow продолжается. Давайте назовем ее Сформировать отчет:
Чтобы наш бот не ждал от нас бесконечного ответа, добавим настройку Limit Wait Time. Задайте для нее следующие данные:
- Limit Type - After Time Interval
- Amount - 30
- Unit - Minutes
Таким образом, наш бот ждет заполнения формы до 30 минут. После 30 минут ожидание обрывается. Если пользователь (вы) так и не нажал кнопку формирования отчета, то данные формы в n8n не приходят, а сам workflow дальше по цепочке не идет. Обычно такой запуск (execution) завершается с ошибкой/таймаутом ожидания.
В завершение не забудьте отключить опцию Append n8n Attribution, чтобы не отображалось системное сообщение от n8n.
Закройте настройки узла и запустите его на тест. В Telegram придет ваше сообщение с кнопкой, после нажатия на которую вам откроется форма, в которой вы заполните свои данные:
Нажав Сформировать отчет, вернитесь в n8n к этому узлу (или в Executions). В результате выполнения данные формы придут одним item - с конфигурацией отчета для запроса к API Яндекс Метрики.
Пока все просто! Но вот теперь начинается самая главная и сложная часть - подготовить данные к запросу API таким образом, чтобы Яндекс понял, что мы от него хотим. Поэтому следующим звеном по цепочке будет идти узел Code. Добавьте его в конец ветки report.
Вставьте в редактор JavaScript нижеприведенный код:
|
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 |
// Берем данные формы: иногда они в .data, иногда сразу в корне json const data = $input.first().json.data || $input.first().json; // Достаем поля формы и приводим к строкам без лишних пробелов const counter_id = String(data.counter_id || '').trim(); const preset = String(data.preset || 'sources_summary').trim(); // если пусто — шаблон по умолчанию const date_from = String(data.date_from || '').trim(); const date_to = String(data.date_to || '').trim(); const attribution = String(data.attribution || 'last').trim(); // модель атрибуции по умолчанию // Проверки до запроса к API Яндекс Метрики if (!counter_id) throw new Error('Укажи counter_id'); if (!/^\d{4}-\d{2}-\d{2}$/.test(date_from) || !/^\d{4}-\d{2}-\d{2}$/.test(date_to)) { throw new Error('Даты должны быть в формате YYYY-MM-DD'); } // Человекочитаемые названия preset для HTML/подписей const presetTitles = { sources_summary: 'Источники, сводка', search_engines: 'Поисковые системы', sources_sites: 'Сайты', tech_browsers: 'Браузеры', tech_devices: 'Устройства', traffic: 'Трафик', geo_country: 'География: страны', content_entrance: 'Страницы входа' }; // Человекочитаемые названия моделей атрибуции const attributionTitles = { cross_device_first: 'Первый переход', last: 'Последний переход', cross_device_last_significant: 'Последний значимый переход', automatic: 'Автоматическая атрибуция' }; // Один item для следующих узлов: параметры API + chat_id для ответа в Telegram return [{ json: { // ID чата, где нажали кнопку (из исходного callback Telegram Trigger) chat_id: $('Telegram Trigger').first().json.callback_query.message.chat.id, counter_id, preset, preset_title: presetTitles[preset] || preset, // если кода нет в словаре — оставим как есть date_from, date_to, attribution, attribution_title: attributionTitles[attribution] || attribution } }]; |
В настройках узла это будет выглядеть так:
Этот узел Code - подготовка данных после формы, до запроса к API отчетов Яндекс Метрики.
Выполните тестовый запуск, заполните данные по своему отчету и сформируйте его. Как только workflow дойдет до последнего узла, откройте вкладку Executions:
И посмотрите, какие данные пришли на выходе (Output):
Если кратко, то он:
- достает поля формы (counter_id, preset, даты, attribution);
- проверяет, что счетчик заполнен и даты в формате YYYY-MM-DD;
- добавляет понятные названия (preset_title, attribution_title);
- подставляет chat_id из триггера Telegram (чат, где нажали кнопку);
- отдает дальше один item.
Эти данные нам понадобятся на следующем узле HTTP Request, в котором мы будем заполнять все нужные данные по запросу к API отчетов Яндекс Метрики. chat_id и _title для самого API не нужны, но они пригодятся позже для HTML и отправки в Telegram.
Чтобы его правильно заполнить, вы должны уметь работать с API отчетов Яндекс Метрики и понимать, как собирается HTTP-запрос с query-параметрами, заголовками, токеном доступа и набором группировок и метрик (явно через dimensions/metrics или через preset).
Поскольку мы используем шаблоны (preset - предопределенный набор параметров и показателей в отчете с ), то тело запроса использовать не нужно. Раскройте настройки узла HTTP Request и укажите:
- Method - GET
- URL - https://api-metrika.yandex.net/stat/v1/data
- Send Query Parameters - включено
- Authentication - None
Затем нужно добавить несколько параметров, задав им имена (Name) ровно такие же, как этого требует сам Яндекс для запроса к API. А вот значения (Value) вам необходимо перетащить из входных данных предыдущего узла. Имена параметров такие:
- ids - идентификатор счетчика Яндекс Метрики
- date1 - дата начала периода выборки в формате YYYY-MM-DD
- date2 - дата окончания периода выборки в формате YYYY-MM-DD
- preset - шаблон отчета
- accuracy - full (размер выборки, используемой для отчета)
- attribution - модель атрибуции
- lang - ru (язык ответа)
В интерфейсе n8n узла HTTP Request это будет выглядеть так:
После заполнения параметров запроса активируйте опцию Send Headers и добавьте заголовок Authorization со значением:
|
1 |
OAuth token |
, где token - ваш токен доступа Яндекс Метрики, который вы получили на предыдущем шаге.
На этом настройка узла HTTP Request завершена. Запустите рабочий процесс, сформируйте отчет в форме, и в ответе Яндекса вы увидите данные по вашему счетчику Метрики согласно выбранному шаблону:
Однако, в таком формате мы не можем отправить данные в Telegram. Нам нужно их окончательно преобразовать. Для этого используется еще один узел Code - JavaScript.
Добавьте его на предпоследнем шаге и вставьте нижеприведенный скрипт:
|
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
// Параметры отчета из предыдущего узла const p = $input.first().json; // Ответ HTTP-запроса к API Яндекс Метрики const resp = $input.first().json; // Если Метрика вернула ошибку — останавливаем workflow с понятным текстом if (resp.errors || resp.message || resp.code) { throw new Error('Ошибка Метрики: ' + JSON.stringify(resp).slice(0, 400)); } // Из ответа достаём названия колонок и строки данных const query = resp.query || {}; const dimNames = query.dimensions || []; // группировки const metricNames = query.metrics || []; // метрики const rows = Array.isArray(resp.data) ? resp.data : []; // Экранирование HTML, чтобы спецсимволы в данных не ломали разметку const esc = (v) => String(v ?? '') .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>'); // Функция для получения читаемого значения из измерения const getDimensionValue = (d) => { if (d == null) return ''; if (typeof d !== 'object') return String(d); // Приоритет: name > id > favicon > url if (d.name) return d.name; if (d.id) return d.id; if (d.favicon) return d.favicon; if (d.url) return d.url; // Если все поля null или пустые, возвращаем пустую строку return ''; }; // Функция для получения заголовка измерения const getDimensionHeader = (d, index) => { if (!d) return `dimension_${index + 1}`; if (typeof d === 'string') return d; // Используем осмысленное название для заголовка if (d === 'ym:s:lastsignTrafficSource') return 'Источник трафика'; if (d === 'ym:s:lastsignSourceEngine') return 'Источник/движок'; if (d === 'ym:s:lastsignDirectPlatformType') return 'Тип платформы'; return d; }; // Заголовки таблицы: сначала измерения, потом метрики const headers = [ ...dimNames.map((d, i) => getDimensionHeader(d, i)), ...metricNames.map((m, i) => m || `metric_${i + 1}`) ]; const head = headers.map((h) => `<th>${esc(h)}</th>`).join(''); // Тело таблицы: каждая строка API → <tr>...</tr> const body = rows.length ? rows.map((row) => { // Обработка измерений с улучшенной логикой const dims = (row.dimensions || []).map((d) => getDimensionValue(d)); // Обработка метрик с округлением для читаемости const metrics = (row.metrics || []).map((m) => { if (typeof m === 'number') { // Округляем числа до 2 знаков, если это не целое return Number.isInteger(m) ? m : Math.round(m * 100) / 100; } return m; }); const cells = [...dims, ...metrics].map((c) => `<td>${esc(c)}</td>`).join(''); return `<tr>${cells}</tr>`; }).join('') : `<tr><td colspan="${Math.max(headers.length, 1)}">Нет данных за период</td></tr>`; // ВАЖНО: Укажите здесь ваш реальный chat_id // Получить можно у бота @userinfobot или через @BotFather const CHAT_ID = 'chat_id'; // Замените на ваш реальный chat_id // Собираем готовый HTML-файл отчёта const html = `<!doctype html> <html lang="ru"><head><meta charset="utf-8" /> <title>Отчёт Метрика</title> <style> body{font-family:Arial,sans-serif;margin:24px;background:#f7f7f7;color:#222} .card{background:#fff;border:1px solid #ddd;border-radius:10px;padding:16px} h1{margin:0 0 8px;font-size:20px} .meta{color:#666;margin:0 0 12px;line-height:1.5} table{border-collapse:collapse;width:100%;font-size:13px} th,td{border:1px solid #ddd;padding:8px;text-align:left} th{background:#111;color:#fff} tr:nth-child(even) td{background:#fafafa} td:not(:first-child):not(:nth-child(2)):not(:nth-child(3)) { text-align: right; } </style></head><body><div class="card"> <h1>Отчёт Яндекс Метрика</h1> <p class="meta"> Счётчик: <b>${esc(p.counter_id || query.ids?.[0] || 'не указан')}</b><br/> Шаблон: <b>${esc(p.preset_title || p.preset || query.preset || 'не указан')}</b><br/> Период: <b>${esc(p.date_from || query.date1 || 'не указан')}</b> → <b>${esc(p.date_to || query.date2 || 'не указан')}</b><br/> Атрибуция: <b>${esc(p.attribution_title || p.attribution || query.attribution || 'не указан')}</b><br/> Строк: <b>${rows.length}</b> </p> <table><thead><tr>${head}</tr></thead><tbody>${body}</tbody></table> </div></body></html>`; // Имя файла для отправки в Telegram const presetName = p.preset || query.preset || 'report'; const dateFrom = p.date_from || query.date1 || 'date1'; const dateTo = p.date_to || query.date2 || 'date2'; const fileName = `metrika-${presetName}-${dateFrom}_${dateTo}.html`; // HTML → binary для узла Telegram (sendDocument) const binary = await this.helpers.prepareBinaryData( Buffer.from(html, 'utf8'), fileName, 'text/html' ); // На выход: метаданные в json + файл в binary.data return [{ json: { chat_id: CHAT_ID, // Используем статический chat_id fileName, rows_count: rows.length, preset: presetName, date_from: dateFrom, date_to: dateTo, attribution: p.attribution || query.attribution || 'не указан' }, binary: { data: binary } }]; |
Найдите строку:
|
1 |
const CHAT_ID = 'chat_id'; |
И замените chat_id на ваш собственный идентификатор чата Telegram. Все остальное оставьте без изменений.
Этот код готовит данные после формы к запросу в Яндекс Метрику. Он достает из ответа формы counter_id, preset, даты и attribution, проверяет счетчик и формат дат, добавляет понятные названия (preset_title, attribution_title) и chat_id чата из Telegram. На выходе получается один аккуратный item.
Протестируйте этот шаг, нажав на кнопку Execute step. В выходных данных вы должны увидеть сформировать файл:
Это HTML-страница со статистикой вашего счетчика Яндекс Метрики. Вы можете скачать этот файл, нажав на кнопку Download, сохранить его на компьютере, а затем открыть как обычную вкладку браузера:
Таким образом, мы получили готовый файл HTML, который теперь необходимо отправить в нашего Telegram-бота. Для этого нажмите на иконку + у последнего узла Code и в строке поиска введите Telegram. Выберите Action - Send a document:
Настройки, которые вам нужно задать для финального узла-действия, следующие:
- Credential - ваши учетные данные Telegram-бота;
- Resource - Message;
- Operation - Send Document;
- Chat ID - ваш идентификатор чата (можете ввести вручную);
- Binary File - включено.
Чтобы передавать вместе с документом текстовую подпись (например, тип шаблона, диапазоны дат или какой-то комментарий), мы можем добавить дополнительную опцию Caption:
Например, такой текст:
|
1 2 3 4 5 6 |
Отчет по Яндекс Метрике готов ✅ Дата начала: Дата окончания: Шаблон: Модель атрибуции: Количество строк: |
Напротив каждого пункта подставьте свое поле из входных данных. При отправке значения подставятся динамически:
Он отобразится прямо под документом в чате Telegram.
Вы также можете добавить поле File Name и подставить для него поле fileName, в котором сохраняется название файла:
На этом настройка рабочего процесса в n8n для получения статистики из Яндекс Метрики завершена!
Запустите свой workflow и убедитесь, что HTML-документ с данными и подписью приходит в вашего бота Telegram:
В завершение активируйте (опубликуйте) workflow, чтобы он работал постоянно. Для этого в правом верхнем углу нажмите на кнопку Publish:
Теперь ваш Telegram-бот сможет в любой момент принимать команды и присылать статистику ваших счетчиков Яндекс Метрики:















































































