Владелец другой школы, знакомый «Кодиума», говорит на созвоне: «Хочу так же, но тексты уведомлений я буду менять сам, а сервер держать не хочу». Для него тот же поток собирается в 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 и пробел перед токеном обязательны.

Шаг 2. Импорт готового сценария
Сценарий из прогона уже лежит в файле. В нём 13 узлов со всеми настройками, но без токенов и без твоего chat_id: их ты добавишь сам. Скачай файл сценария kodium-zayavka-n8n.json.
Честно о прогоне: сценарий собирали через программный интерфейс n8n, импорт этого файла даёт тот же сценарий. Сам импорт мышкой в прогоне не проходили: если пункт меню называется чуть иначе, ищи слово Import.
- В n8n создай пустой сценарий. В меню сценария (кнопка с тремя точками вверху справа) выбери Import from File (импорт из файла) и укажи скачанный файл. На схеме появятся 13 узлов.
- Открой узел «Владельцу в Telegram». В поле Credential (учётные данные) выбери «T1 бот Кодиум». В поле Chat ID вместо заглушки впиши свой chat_id: это число ADMIN_ID из .env бота.
- Открой узлы «Ссылка на скачивание» и «Ссылка на загрузку». В каждом выбери учётные данные «T1 Яндекс Диск» (тип Header Auth). У «Скачать файл» и «Загрузить файл» учётных данных в прогоне не было: им адрес выдаёт сам Диск.
- Сохрани сценарий.
Что настроено в каждом узле, по порядку цепочки. Сверяй с этим списком, если что-то не работает:
- Webhook «Заявка с формы». HTTP Method: POST. Path (путь):
kodium-forma. Respond (как отвечать): Using ‘Respond to Webhook’ node, то есть ответ форме даст отдельный узел. - Code «Разбор». Достаёт поля из params (JSON-RPC) или из тела, проверяет согласие, убирает «/» из имени, ставит московское время.
- IF «Согласие есть?» Условие:
{{ $json.ok }}равно true. Две ветки. - Respond to Webhook «Ответ: принято» на ветке «да»: JSON-RPC «ok». Форма получает ответ сразу, файл пишется дальше.
- Respond to Webhook «Ответ: отказ» на ветке «нет»: код ответа 400.
- Telegram «Владельцу в Telegram». Учётные данные «T1 бот Кодиум», Chat ID твой, Text: имя, курс, телефон и время из узла «Разбор».
- 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. - HTTP Request «Ссылка на скачивание». GET
https://cloud-api.yandex.net/v1/disk/resources/download, Header Auth «T1 Яндекс Диск», Query:path=disk:/Кодиум/zayavki.xlsx. - HTTP Request «Скачать файл». GET, URL
{{ $json.href }}. Options → Response → Response Format: File (формат ответа: файл). - Extract From File «Прочитать xlsx». Operation: XLSX, файл превращается в строки.
- Code «Дописать строку». Добавляет заявку с источником «сайт (n8n)», старым строкам без источника ставит «бот».
- Convert to File «Собрать xlsx». Обратно в XLSX, имя файла zayavki.xlsx.
- HTTP Request «Загрузить файл». Method PUT, URL
{{ $('Ссылка на загрузку').first().json.href }}. Send Body включён, Body Content Type: n8n Binary File (файл n8n), Input Data Field Name:data.

Ловушка: файл теряется между узлами
Логично было бы сначала собрать новый файл, а потом спросить у Диска, куда его загрузить. В прогоне так не работает: узел HTTP Request не передаёт дальше файл предыдущего шага. Спросил ссылку после сборки, и к узлу загрузки файл уже не доходит.
Поэтому порядок такой, как в списке: ссылку на загрузку берём в начале, до скачивания и сборки файла. А в узле «Загрузить файл» адрес не берём из соседнего узла, а пишем выражением (формулой n8n), которое достаёт его из узла «Ссылка на загрузку»:
{{ $('Ссылка на загрузку').first().json.href }}
Шаг 3. Проверка тестовым адресом
У Webhook два адреса. Тестовый, с /webhook-test/kodium-forma, работает, только пока сценарий ждёт: нажми «Execute workflow», и n8n начнёт слушать. Рабочий, с /webhook/kodium-forma, работает только у включённого сценария.
- Нажми «Execute workflow» (выполнить сценарий).
- Отправь на тестовый адрес заявку: временно впиши его в настройки своей Яндекс Формы (как в уроке 3.3, с четырьмя параметрами) и отправь форму. Или попроси Claude Code отправить POST-запрос в формате JSON-RPC на
/webhook-test/kodium-formaс латинским именем, например Test. - Посмотри на схему: каждый узел, через который прошли данные, отмечается зелёным. Нажми на узел, чтобы увидеть, что он получил и отдал.
В прогоне тестовый запрос получил ответ {"jsonrpc":"2.0","result":"ok","id":"t1"}, исполнение завершилось успешно, в общем zayavki.xlsx появилась строка с источником «сайт (n8n)», а старые 8 строк остались целы. Проверь последнее обязательно: ошибка в узле «Дописать строку» может перезаписать файл одной новой строкой.

Шаг 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 → узнать ссылку на загрузку → загрузить. Узел загрузки получает пустоту. Как починить?
Подсказка: Что узел HTTP Request делает с файлом, который пришёл в него от предыдущего шага?
На курсе задания проверяются автоматически. Решить первое задание бесплатно → · Подобрать курс
Контрольный вопрос. Тест через «Execute workflow» прошёл. Ты вписал в форму тот же адрес /webhook-test/kodium-forma и ушёл. Утром владелец говорит, что заявок с сайта не было. Почему?
Подсказка: Чем отличаются два адреса узла 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 через выражение;
• тестовый адрес для проверки, рабочий только у включённого сценария.
