Путь «n8n»: тот же поток без кода

Владелец другой школы, знакомый «Кодиума», говорит на созвоне: «Хочу так же, но тексты уведомлений я буду менять сам, а сервер держать не хочу». Для него тот же поток собирается в n8n: форма → уведомление → строка в файле, только шаги видны на экране как схема, и поправить их можно мышкой. В прогоне курса этот путь собран и проверен на том же файле zayavki.xlsx.

Чему научишься в этом уроке:
• завести в n8n учётные данные для Telegram и Яндекс Диска, не показывая токены агенту;
• импортировать готовый сценарий из 13 узлов и понимать настройку каждого;
• обойти главную ловушку с файлом между узлами;
• проверить сценарий тестовым адресом и включить его.

Где живёт n8n

n8n (произносится «эн-эйт-эн») это конструктор сценариев: каждый шаг сценария называется узлом и выглядит как карточка на схеме, а стрелки показывают, куда идут данные. В курсе используем облако n8n: как зарегистрироваться и создать первый сценарий, показано в уроке трека 2 «n8n в облаке». Пройди его до пустого сценария и возвращайся.

Цены облака на 09.10.2026: Starter 20 € в месяц при оплате за год, 2 500 запусков; Pro 50 € в месяц при оплате за год, 10 000 запусков. Каждая заявка с формы это один запуск сценария, ежедневный отчёт из урока 3.5 ещё один запуск в день. Платит заказчик, и ему стоит знать это заранее. Есть ли пробный период, нужна ли карта и примут ли карту РФ, мы не проверяли: в прогоне работали в уже оплаченном облаке. Посмотри это на странице цен n8n до того, как выбирать путь.

Не подключай к боту «Кодиума» узел-триггер Telegram в n8n. Бот работает опросом на сервере, а у одного бота может быть только один способ получать сообщения: в треке 2 это заканчивалось ошибкой 409 Conflict. Отправлять сообщения через узел Telegram можно, это не мешает боту.

Шаг 1. Учётные данные

Учётные данные (credentials) это сейф n8n для токенов: ты кладёшь токен один раз, а узлы ссылаются на него по имени. Заводишь их сам, в браузере. Агенту токены не отдавай и не проси вставлять их в n8n.

  • Telegram API (доступ к боту), название «T1 бот Кодиум». В поле Access Token (ключ доступа) токен бота из .env.
  • Header Auth (проверка по заголовку запроса), название «T1 Яндекс Диск». Name: Authorization. Value: OAuth <твой токен>, где токен Яндекс Диска с правами чтения и записи из урока 2.4. Слово OAuth и пробел перед токеном обязательны.
Схема двух наборов учётных данных n8n: Telegram API «T1 бот Кодиум» с полем Access Token (значение скрыто) и Header Auth «T1 Яндекс Диск»: Name «Authorization», Value «OAuth ••••».

Шаг 2. Импорт готового сценария

Сценарий из прогона уже лежит в файле. В нём 13 узлов со всеми настройками, но без токенов и без твоего chat_id: их ты добавишь сам. Скачай файл сценария kodium-zayavka-n8n.json.

Честно о прогоне: сценарий собирали через программный интерфейс n8n, импорт этого файла даёт тот же сценарий. Сам импорт мышкой в прогоне не проходили: если пункт меню называется чуть иначе, ищи слово Import.
  1. В n8n создай пустой сценарий. В меню сценария (кнопка с тремя точками вверху справа) выбери Import from File (импорт из файла) и укажи скачанный файл. На схеме появятся 13 узлов.
  2. Открой узел «Владельцу в Telegram». В поле Credential (учётные данные) выбери «T1 бот Кодиум». В поле Chat ID вместо заглушки впиши свой chat_id: это число ADMIN_ID из .env бота.
  3. Открой узлы «Ссылка на скачивание» и «Ссылка на загрузку». В каждом выбери учётные данные «T1 Яндекс Диск» (тип Header Auth). У «Скачать файл» и «Загрузить файл» учётных данных в прогоне не было: им адрес выдаёт сам Диск.
  4. Сохрани сценарий.

Что настроено в каждом узле, по порядку цепочки. Сверяй с этим списком, если что-то не работает:

  1. Webhook «Заявка с формы». HTTP Method: POST. Path (путь): kodium-forma. Respond (как отвечать): Using ‘Respond to Webhook’ node, то есть ответ форме даст отдельный узел.
  2. Code «Разбор». Достаёт поля из params (JSON-RPC) или из тела, проверяет согласие, убирает «/» из имени, ставит московское время.
  3. IF «Согласие есть?» Условие: {{ $json.ok }} равно true. Две ветки.
  4. Respond to Webhook «Ответ: принято» на ветке «да»: JSON-RPC «ok». Форма получает ответ сразу, файл пишется дальше.
  5. Respond to Webhook «Ответ: отказ» на ветке «нет»: код ответа 400.
  6. Telegram «Владельцу в Telegram». Учётные данные «T1 бот Кодиум», Chat ID твой, Text: имя, курс, телефон и время из узла «Разбор».
  7. HTTP Request «Ссылка на загрузку». Method GET, URL https://cloud-api.yandex.net/v1/disk/resources/upload. Authentication: Generic Credential Type → Header Auth «T1 Яндекс Диск». Query Parameters: path = disk:/Кодиум/zayavki.xlsx, overwrite = true.
  8. HTTP Request «Ссылка на скачивание». GET https://cloud-api.yandex.net/v1/disk/resources/download, Header Auth «T1 Яндекс Диск», Query: path = disk:/Кодиум/zayavki.xlsx.
  9. HTTP Request «Скачать файл». GET, URL {{ $json.href }}. Options → Response → Response Format: File (формат ответа: файл).
  10. Extract From File «Прочитать xlsx». Operation: XLSX, файл превращается в строки.
  11. Code «Дописать строку». Добавляет заявку с источником «сайт (n8n)», старым строкам без источника ставит «бот».
  12. Convert to File «Собрать xlsx». Обратно в XLSX, имя файла zayavki.xlsx.
  13. HTTP Request «Загрузить файл». Method PUT, URL {{ $('Ссылка на загрузку').first().json.href }}. Send Body включён, Body Content Type: n8n Binary File (файл n8n), Input Data Field Name: data.
Снимок редактора n8n «Кодиум: заявка с формы (n8n, трек 1)»: Заявка с формы → Разбор → Согласие есть? → Ответ: принято → Владельцу в Telegram → Ссылка на скачивание → Скачать файл → Прочитать xlsx. Ниже схема всех 13 узлов по порядку связей: 1 Webhook, 2 Разбор, 3 IF, 4 Ответ: принято, 5 Telegram, 6 Ссылка на загрузку, 7 Ссылка на скачивание, 8 Скачать файл, 9 Прочитать xlsx, 10 Дописать строку, 11 Собрать xlsx, 12 Загрузить файл (PUT); ветка false — 13 Ответ: отказ (400).

Ловушка: файл теряется между узлами

Логично было бы сначала собрать новый файл, а потом спросить у Диска, куда его загрузить. В прогоне так не работает: узел HTTP Request не передаёт дальше файл предыдущего шага. Спросил ссылку после сборки, и к узлу загрузки файл уже не доходит.

Поэтому порядок такой, как в списке: ссылку на загрузку берём в начале, до скачивания и сборки файла. А в узле «Загрузить файл» адрес не берём из соседнего узла, а пишем выражением (формулой n8n), которое достаёт его из узла «Ссылка на загрузку»:

{{ $('Ссылка на загрузку').first().json.href }}

Шаг 3. Проверка тестовым адресом

У Webhook два адреса. Тестовый, с /webhook-test/kodium-forma, работает, только пока сценарий ждёт: нажми «Execute workflow», и n8n начнёт слушать. Рабочий, с /webhook/kodium-forma, работает только у включённого сценария.

  1. Нажми «Execute workflow» (выполнить сценарий).
  2. Отправь на тестовый адрес заявку: временно впиши его в настройки своей Яндекс Формы (как в уроке 3.3, с четырьмя параметрами) и отправь форму. Или попроси Claude Code отправить POST-запрос в формате JSON-RPC на /webhook-test/kodium-forma с латинским именем, например Test.
  3. Посмотри на схему: каждый узел, через который прошли данные, отмечается зелёным. Нажми на узел, чтобы увидеть, что он получил и отдал.

В прогоне тестовый запрос получил ответ {"jsonrpc":"2.0","result":"ok","id":"t1"}, исполнение завершилось успешно, в общем zayavki.xlsx появилась строка с источником «сайт (n8n)», а старые 8 строк остались целы. Проверь последнее обязательно: ошибка в узле «Дописать строку» может перезаписать файл одной новой строкой.

Схема проверки тестового исполнения по прогону: ответ {"jsonrpc":"2.0","result":"ok","id":"t1"}; исполнение Success; таблица zayavki.xlsx со старыми строками «бот» и новой последней строкой «сайт (n8n)», имя и телефон скрыты.

Шаг 4. Включение

Когда тест прошёл, включи сценарий: кнопка Publish (опубликовать, то есть включить). После этого начинает работать рабочий адрес /webhook/kodium-forma. Впиши в настройки формы именно его, тестовый оставлять нельзя: без нажатого «Execute workflow» он не ответит.

В прогоне путь вебхука был просто kodium-forma. В пути «код» в адресе стоял секрет, и здесь это тоже разумно: допиши к пути в узле Webhook случайную часть, чтобы адрес нельзя было угадать. Защиту секретом в n8n в прогоне не проверяли, поэтому проверь сам: запрос на путь без случайной части не должен дойти до сценария.

Импорт и настройка займут меньше времени, чем сборка с нуля. Сколько именно, мы честно не знаем: в прогоне оба сценария (приём и отчёт) агент собрал через программный интерфейс n8n примерно за 15 минут.

Если не получилось

  • Узел Telegram падает с ошибкой про chat → в Chat ID осталась заглушка из файла → впиши своё число ADMIN_ID.
  • HTTP-узел Диска пишет, что нет учётных данных → после импорта не выбран «T1 Яндекс Диск» → выбери его в узлах «Ссылка на скачивание» и «Ссылка на загрузку».
  • Тестовый адрес отвечает ошибкой, что вебхук не зарегистрирован → сценарий не ждёт запроса → нажми «Execute workflow» и сразу отправь заявку.
  • Рабочий адрес /webhook/… не отвечает → сценарий не включён → нажми Publish.
  • Узел «Загрузить файл» падает или загружает пустоту → ссылка на загрузку берётся после сборки файла → верни порядок из списка и адрес через выражение.
  • В файле осталась одна строка вместо всех → узел «Дописать строку» не получил старые строки → открой Extract From File и посмотри, что он отдал; не включай сценарий, пока тест не покажет старые строки целыми.
  • Яндекс Диск отвечает отказом в доступе → в Header Auth нет слова OAuth с пробелом или у токена нет права записи → проверь Value и права токена из урока 2.4.
  • Имя в уведомлении превратилось в знаки вопроса → в прогоне так было при отправке кириллицы из Git Bash, это особенность терминала → отправь тест из формы или с латинским именем.
  • Бот «Кодиума» перестал отвечать, в журнале 409 Conflict → к боту подключён триггер Telegram в n8n → удали этот триггер.

Контрольный вопрос. Ты собрал сценарий в порядке: скачать файл → дописать строку → собрать XLSX → узнать ссылку на загрузку → загрузить. Узел загрузки получает пустоту. Как починить?

АПоставить Response Format: JSON в узле скачивания
ББрать ссылку на загрузку в начале цепочки, а в узле загрузки указать её адрес выражением из узла «Ссылка на загрузку»
ВУдалить узел Convert to File
ГВключить сценарий кнопкой Publish

Подсказка: Что узел HTTP Request делает с файлом, который пришёл в него от предыдущего шага?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Контрольный вопрос. Тест через «Execute workflow» прошёл. Ты вписал в форму тот же адрес /webhook-test/kodium-forma и ушёл. Утром владелец говорит, что заявок с сайта не было. Почему?

АОблако n8n не работает ночью
БЗакончились 2 500 запусков
ВТестовый адрес слушает только во время ожидания; в форму нужен рабочий /webhook/… включённого сценария
ГЯндекс Форма не умеет отправлять запросы ночью

Подсказка: Чем отличаются два адреса узла Webhook?

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Задание. МИССИЯ «Тот же поток без кода». Обязательна одна из двух миссий, 3.3 или 3.4: та, путь которой ты выбрал в уроке 3.2. Вторая по желанию. 1. Заведи в облаке n8n учётные данные Telegram API и Header Auth для Диска. Токены вводишь сам. 2. Импортируй файл сценария, выбери учётные данные в узлах и впиши свой chat_id. 3. Проверь тестовым адресом, потом включи сценарий (Publish) и впиши рабочий адрес в свою форму. 4. Сломай и почини: отправь заявку без галочки согласия и найди в исполнениях, по какой ветке она прошла. Потом отправь нормальную заявку. Дополнительно, по желанию: собери такой же сценарий руками по списку настроек из урока, код для двух узлов Code попроси у Claude Code (в «Дописать строку» заявку бери из $(‘Разбор’).first().json). Принято, если: приложены снимок схемы сценария; снимок успешного исполнения и исполнения с отказом 400; снимок zayavki.xlsx, где есть строка «сайт (n8n)» и видны старые строки; снимок уведомления в Telegram. Токены, телефоны и путь вебхука на снимках закрыты.

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

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Решить первое задание бесплатно →  ·  Подобрать курс

Что дальше

Теперь «Кодиум» умеет принимать заявки с формы двумя путями. Осталось научить оба пути присылать владельцу отчёт в 9:00 по Москве и аккуратно добавить колонку «Источник» в файл, где она ещё не появилась.

Итог:
• токены живут в учётных данных n8n, вводишь их сам;
• сценарий из 13 узлов импортируется из файла: приём, разбор, развилка по согласию, ответ форме, уведомление и работа с файлом на Диске;
• ссылку на загрузку берём до сборки файла, адрес в PUT через выражение;
• тестовый адрес для проверки, рабочий только у включённого сценария.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева