Создание Telegram-бота для подписчиков на мой контент в Cursor

01 марта, 2026

История моего первого проекта в Cursor, который полностью создан с помощью ИИ для решения прикладной задачи, с подробными комментариями и этапами разработки.

Этим кейсом я открываю новую категорию статей - о том, как решать прикладные задачи с помощью LLM и ИИ-агентов. Я не буду дискутировать на тему выбора стека технологии, оптимизации кода, уходить в философские темы и опускаться до узкой терминологии программирования и отдельных инструментов. Я в этом не специалист и многие разделы знаю по отрывкам и каким-то разрозненным кускам.

Цель этой статьи другая - мотивировать вас больше времени уделять революционной технологии, которая уже вошла в каждый дом, не бояться экспериментировать и показать, что сегодня вы способны в одиночку реализовать идеи, которые раньше требовали команды или серьезных вложений. Если у вас есть задумка - знайте, теперь это возможно как никогда!

Не случайно ведущие эксперты в области ИИ не перестают повторять:

Сейчас - время соло-основателей, способных создавать компании-единороги (с рыночной оценкой более миллиарда долларов)!

Быть может, вы - один из них?

Предыстория

Благодаря развитию ИИ и больших языковых моделей мы можем простым запросом на естественном языке получать готовые документы, картинки, видео и даже рабочие приложения. Раньше для этого требовалась команда: разработчик, техзадание, бесконечные правки и контроль. Теперь достаточно оформить подписку за 20$ и получить в том же Cursor или Windsurf полностью рабочий прототип (MVP), а иногда и целый проект, который затем можно выпустить в продакшн.

То, что раньше создавали только опытные специалисты долго и дорого, теперь доступно и тем, кто далек от разработки. В смежных областях (как мы с вами) будет сложнее, но все реально. Главное - четко понимать, какой результат вы хотите получить на выходе, и уметь сформулировать это простыми словами. В этом и заключается искусство промпта. И это не так просто, как кажется. Навык приходит с ежедневной практикой и систематическими упражнениями. Я работаю с чат-ботами и ИИ-агентами каждый день с осени 2023 года и сегодня поделюсь наработками, которые в итоге превратились в пусть и небольшой, но законченный проект.

Для своего первого проекта с помощью ИИ-агента я поставил перед собой четкую задачу:

  1. это должно быть связано с osipenkov.ru, быть частью экосистемы и моими направлениями: онлайн-курсами, электронными руководствами, статьями, услугами digital-маркетинга;
  2. это должно решать вполне конкретную проблему;
  3. это должно быть популярно и востребовано пользователями (без нагромождений);
  4. это должно быть масштабируемо (чтобы можно было добавлять функционал и улучшения) и автоматизировано, без моего постоянного участия;
  5. это должно быть просто в реализации, потому что сразу же создавать сложные масштабируемые проекты я не был готов и не знал, как это правильно делать.

Недолго думая, я определился: решил создать Telegram-бота для автоматической отправки бесплатного контента подписчикам - книг, электронных руководств, чек-листов, видеоуроков и т.д.

Идея первого проекта

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

  • небольшие объемы. Поскольку я не занимаюсь лидогенерацией и мои книги/курсы находят и скачивают естественным путем (органически), то таких заявок приходит не больше 2-5 в день;
  • даже при таком потоке 30-40% обращений - это лиды с корпоративных почт, либо же домены, запрещенные в РФ (какие-нибудь ukr, до которых не доходят письма в принципе), или временные почты, живущие 5 минут. Автоматическая рассылка по такой базе приведет к спаму, низкой открываемости и куче не доставленных писем. А проверять валидность через почтовые сервисы - это дополнительные расходы. Проще и надежнее проверить почты перед отправкой самому;
  • раньше я пытался настраивать триггерные цепочки и воронки. Но когда всем занимаешься в одиночку, обновлять письма, менять год, описание и содержимое просто некогда. В какой-то момент это перестало приносить удовольствие. Когда все это превращается в «бизнес», мне становится неохота этим заниматься. А так ремесленный подход вполне работает, и я вполне доволен тем, как все складывалось.

Пример письма с бесплатной книгой «Google Tag Manager»

Но были и минусы:

  • прежде, чем получить письмо, вам приходилось ждать письмо от 24 часов до нескольких дней;
  • иногда письмо не доходило из-за блокировок почтовых сервисов (особенно на корпоративные адреса);
  • если вы оставляли невалидную почту или временный ящик - материал вы, конечно, не получали (здесь сами виноваты).

В какой-то момент база подписчиков перевалила за 10 000 человек. Я сказал себе: так больше продолжаться не может. Мне надоело каждый раз вручную отправлять письма на разные темы. И именно тогда я решил, что пора автоматизировать этот процесс - но не абы как, а использовать ИИ и вайб-кодинг.

Вайб-кодинг (англ. vibe coding) - метод программирования, использующий большие языковые модели (LLM) и искусственный интеллект (AI) для генерации программного кода на основе описания задачи на естественном языке. Вместо традиционного написания кода разработчик формулирует проблему или желаемую функциональность, а AI генерирует соответствующий программный код. Этот метод позволяет создавать программное обеспечение даже пользователям без глубоких знаний программирования. Термин был введен в феврале 2025 года ученым в области машинного обучения Андреем Карпатым, соучредителем OpenAI и бывшим руководителем AI-направления в Tesla.

Разработка

Я начал работать с Cursor (редактор кода с ИИ и агент для программирования) в середине 2025 года, но тогда это были просто попытки привыкнуть к интерфейсу, понять основной функционал и полезность данного редактора именно для себя. И я нашел ее тогда, когда начал работать с их встроенным ИИ-агентом, периодически прося его разработать мне какой-нибудь простой функционал для Яндекс Директа и счетчиков аналитики. В основном, это были задачи по MCP-серверам, которые я осваивал в то время.

Но мне хотелось большего - реализовать полноценный проект от А до Я с серверной (бэкенд) и клиентской частью. Идея создания Telegram-бота для подписчиков на контент показалась интересной, тем более что в нем можно было реализовать все задуманное. И я начал разработку.

Инструкцию, которую я написал агенту Composer (собственная языковая модель LLM в Cursor), выглядела так:

Моя инструкция в Cursor

Задача - разработать полноценный сайт sub.osipenkov.ru для рекламирования своей базы знаний и набора подписчиков в основной Telegram-канал с авторизацией через виджет Telegram, на котором будет размещен бесплатный контент (электронные книги, видеоуроки, чек-листы и другие виды информации) и анонсы платных онлайн-курсов.

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

  • Подписка в Telegram
  • Бесплатный контент

Первым шагом – пользователь должен подписаться на моего бота Telegram и разрешить отправлять ему уведомления через него. Это будет реализовано на вкладке Подписка на бота.

Второй шаг – это подписаться на мой основной Telegram канал @clicksider. Только после этого для пользователя откроется вкладка Бесплатный контент. После перехода на нее он будет видеть в обычной таблице название контента и рядом кнопку Отправить. То есть пока человек подписан на бота и мой канал, он сам может выбирать какой бесплатный контент хочет получить в Telegram. Для этого он как раз нажимает кнопку Отправить.

Но помимо самого бота, пользователь должен подписаться на мой основной Telegram-канал @clicksider. И пока он подписан на бота и мой основной телеграм, он может получать пуши и рассылки. Как только он отписывается от @clicksider (должна быть проверка), бот перестает отправлять ему сообщения и просит подписаться вновь. До того момента, пока он не подпишется обратно, кнопок Отправить не будет.

Каждая кнопка Отправить – это отдельный запрос с определенным постом (картинка, текст, видео, ссылка). Пользователь нажимает Отправить и ему в Telegram бот приходит все содержимое.

Сайт будет состоять из простых HTML-страниц и иметь левое меню + таблицу и кнопками Отправить для каждого контента в отдельности. Обязательно должна быть проверка на подписку на бота и мой канал Telegram перед отправкой, а также учитываться авторизация. Как только пользователь авторизуется на главной странице через виджет Telegram, его данные сохраняются в моей БД.

Все общение с агентом сводится к простым инструкциям и уточнениям в чате. Вы вводите запрос и просите ИИ реализовать это. Но перед тем, как начать выполнение проекта, я попросил Cursor еще раз описать функционал и предложить итоговый набор технологий, которые будут использоваться в проекте. Он сохранил все в отдельную инструкцию:

## 1. Архитектура и стек

  • Фронтенд - Next.js (React), страницы сайта;
  • Бэкенд - NestJS (Node.js), API;
  • База данных - PostgreSQL (в Docker);
  • Прокси - nginx в Docker (HTTP - HTTPS, проксирование);
  • Бот - тот же бэкенд обрабатывает вебхук Telegram;
  • Деплой - все в Docker Compose на VPS (Ubuntu).

В идеале вы должны хотя бы быть знакомы с тем набором инструментов, которые агент предлагает вам использовать. Потому что иногда он может предлагать не совсем оптимальные варианты. И нужно его править, корректировать. Опытный специалист в инструкции может конкретизировать стек технологий, тогда как новичок, скорее всего, будет использовать то, что предлагается ИИ изначально. Я выбрал второй подход, хотя был частично знаком с Node.js, PostgreSQL и Docker. И потому что это был мой первый проект с нуля от идеи до производства, я не собирался его «вылизывать».

Cursor отрисовал мне такую структуру проекта (упрощенно):

Затем описал основной функционал сервиса, который можно посмотреть по ссылке. Согласившись со всем этим, я просто стал следить за каждым его шагом. Вся работа была произведена в несколько этапов:

Этап 1. Проектирование и окружение

  • Выбор стека
  • Настройка репозитория (Git)
  • Базовая структура проекта (frontend + backend)
  • Создание БД (локально + на проде)
  • Подключение домена sub.osipenkov.ru, HTTPS

Результат: пустой проект, развернутый на dev/prod, с «Hello world»

Этап 2. Бэкенд: авторизация через Telegram и БД (1–2 недели)

  • Реализация API: POST /auth/telegram - обработка данных от Telegram Login Widget, валидация подписи, создание пользователя
  • Сессии/JWT
  • Модель пользователя в БД
  • Простейший endpoint /me для проверки авторизации

Результат: пользователь может авторизоваться через Telegram, его запись создаётся в БД, ЛК открывается только авторизованным.

Этап 3. Бот и проверка подписок

  • Поднять Telegram-бота (webhook или long polling)
  • Обработать /start, связать с БД, выставлять bot_subscribed = true
  • Реализовать серверную функцию проверки подписки на канал (getChatMember) и заполнение channel_subscribed
  • API для фронта: GET /subscription/status (вернуть статусы) и  POST /subscription/check (принудительно обновить статусы).

Результат: вкладка «Подписка в Telegram» может показать актуальные статусы и обновлять их.

Этап 4. Бесплатный контент

  • Модель контента в БД
  • API: GET /free-content/list и POST /free-content/send с content_id
  • Логика на сервере: проверять подписку и авторизацию, вызывать Bot API для отправки нужного контента
  • Фронтенд: Страница с таблицей, Кнопка Отправить и отображение статуса/ошибок

Результат: рабочая механика выдачи бесплатного контента.

Этап 5. Админ-часть и улучшения

  • Простейшая админка для управления контентом и пользователями
  • UI-полировка, адаптивность
  • Логи, мониторинг, базовая аналитика (сколько людей, что запрашивают и т.п.)

Результат: удобное управление системой и понимание статистики.

Вся работа осуществлялась в окне агента, где я писал уточняющие команды и корректировал его действия:

Окно программы Cursor

Далее агент сам планировал и выполнял работу: создавал файлы проекта, запускал команды в терминале, проводил отладку и многое другое. Весь рабочий код Cursor сохраняет прямо в ту папку, которую вы открываете.

Файлы проекта на компьютере

Вы в любой момент можете перейти в нее на своем компьютере и увидеть все, что получилось.

Проект на компьютере

Поскольку мой проект - это не локальная сборка, то необходим был свой сервер. И я арендовал его у хостинг-провайдера Beget, так как хорошо знаком с его интерфейсом и функционалом: на нем уже размещено множество сайтов, где слушатели моих онлайн-курсов выполняют домашние задания.

Конфигурация сервера для теста была выбрана самой простой - 1 ядро, 1 ГБ RAM и 10 ГБ дискового пространства, так как мой бот имел ограниченный функционал без всяких наворотов.

Панель управления облачным сервером

На нем был предустановлен Docker (платформа для разработки и запуска контейнерных приложений).

Разумеется, чтобы сайт открывался по безопасному соединению с SSL-сертификатом на поддомене sub.osipenkov.ru, необходимо:

  • прописать правильную A-запись, чтобы при переходе по доменному имени открывался сайт на арендованном сервере с определенным IP-адресом;

Добавление А-записи с публичным IP-адресом сервера

  • выпустить SSL-сертификат.

И вот здесь возникли сложности. Все дело в том, что установить бесплатный SSL-сертификат от Let’s Encrypt на VPS-сервер через панель управления хостинг-провайдера не получится (для обычного сайта на хостинге это можно сделать за пару кликов), так как он находится полностью под администрированием владельца сервера. Поэтому мне пришлось самостоятельно устанавливать SSL на своем сервере.

К счастью, у Beget были подробные инструкции по установке для различных панелей управления:

Если используется веб-сервер Apache или Nginx:

Для выпуска сертификата на BitrixVM - инструкция по ссылке. В других случаях для автоматического выпуска сертификатов Let’s Encrypt на VPS предлагается установить приложение Certbot.

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

Далее все шло как по маслу. Composer в Cursor сам настроил для меня все нужные сервисы: базу данных, секреты, сеть, порты, HTTPS/редирект после выпуска SSL-сертификата и назначил переменные окружения. Мне оставалось только подставлять циферки в нужные переменные.

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

Для подключения к серверу я использовал PowerShell и учетные данные, предоставленные хостинг-провайдером.

Пересборка Docker-образа с нуля

PowerShell – это кроссплатформенное решение для автоматизации задач, которое включает оболочку командной строки, скриптовый язык и платформу управления конфигурацией. PowerShell поддерживается в Windows, Linux и macOS. Если совсем просто: это программа на вашем компьютере, которая позволяет управлять системой и подключаться к серверам текстовыми командами, а не мышкой.

Запуск/перезапуск контейнера для сервиса в фоновом режиме

И таких контейнеров у меня было несколько. Команда docker compose ps позволяет отобразить статус всех контейнеров проекта и убедиться, что все службы работают как надо.

docker compose ps

Поскольку основной функционал моего проекта завязан на Telegram (авторизация на сайте и получение контента), без создания бота было не обойтись. Для работы приложения нужен был ключ API:

Токен доступа

И добавление поддомена sub.osipenkov.ru в специальное поле для виджета авторизации:

Добавление домена сайта для виджета авторизации Telegram

Далее была прописана следующая логика: как только пользователь авторизуется на сайте через виджет Telegram:

Войти через Telegram

Его данные сохраняются в базе данных в отдельной таблице с определенным набором полей:

  • telegram_id, username, first_name, photo_url,last_login_at - стандартные поля;
  • bot_subscribed, channel_subscribed - поля для определения статуса подписки пользователем на каналы.

Затем идет проверка - если пользователь подписан на бота в Telegram и мой личный канал @clicksider, он может получить бесплатный контент. Тогда значения в полях bot_subscribed и channel_subscribed обновляются и принимают true (t). Если пользователь на что-то не подписан (или на бота, или на мой канал, или на оба варианта), тогда данные в таблице обновляются и принимают значения false (f).

Проверка на подписку на бота и канал (true - подписан, false - нет)

Скриншот выше - это администраторская панель базы данных PostgreSQL на сервере, которую Cursor установил по моему запросу в отдельную директорию sub.osipenkov.ru. Для этого он использовал Adminer - программу, которая запускается на сервере и открывается в браузере, позволяя вам работать с базой данных (смотреть таблицы, редактировать записи, выполнять SQL-запросы) без необходимости подключаться к серверу через консоль.

Интерфейс Adminer

В этой базе данных была создана отдельная таблица free_content, в которой я могу добавлять отдельные типы контента (электронные книги, файлы, чек-листы, видеоуроки, курсы и т.д.) и отправлять их автоматически после того, как пользователь об этом попросит.

Например, вот так выглядит запись в базе данных об электронной книге Google Analytics 4: Веб-потоки.

Так выглядит запись о конкретном контенте в базе данных (серверная часть)

В этой строке определен заголовок (title) и описание контента (description), которые отображаются на сайте sub.osipenkov.ru для самого пользователя, а также системные поля type (тип контента) и payload (полезная нагрузка). Именно payload - это та часть сообщения или запроса, которая содержит фактическое содержание команды или данные, которые бот должен обработать.

А вот как эта запись выглядит в браузере пользователя:

Так выглядит запись в браузере пользователя с возможностью скачивания (клиентская часть)

При условии, что пользователь подписан на бота и мой канал, он может нажать на кнопку Отправить, и буквально через 1-2 секунды получить этот контент у себя в Telegram:

Отправленный контент в Telegram

Если пользователь отписывается от бота или канала, доступ к отправке файлов для него закрывается до тех пор, пока он не подпишется снова.

Чтобы отправлять бесплатный контент, нужно быть активным подписчиком

Причем в таблице free_content колонка type может принимать такие значения:

  • text (текстовое сообщение) - готовый HTML-текст (можно с <b>, <a href="..."> и т.п.);
  • link (то же, что text) - готовый HTML-текст (часто со ссылкой);
  • photo (картинка) - URL картинки или file_id из Telegram;
  • document (документ/файл) - URL файла или file_id;
  • video (видео) - URL видео или file_id.

Cursor все эти проверки реализовал самостоятельно, а также представил краткий порядок повторения всех этих действий на новом проекте, если я вдруг захочу это повторить где-нибудь еще:

  1. Создать репозиторий, структуру (api, web, infra/nginx), docker-compose с db, api, web, nginx
  2. Настроить API: health, БД, Auth (Telegram Login, JWT), User (GET /me), Subscription (status, check), Telegram webhook, Free-content (list, send)
  3. Настроить фронт: главная с виджетом и редиректом в ЛК, страница ЛК с меню и контентом, /terms, /privacy
  4. DNS: A-запись домена на IP сервера
  5. SSL: certbot standalone, подключить сертификаты в nginx, редирект HTTP → HTTPS
  6. BotFather: домен для виджета; setWebhook на https://домен/telegram/webhook
  7. Adminer: сервис в compose, location в nginx, htpasswd, volume на файл
  8. Проверить с телефона: адаптивность, отступы, кнопки

По ссылке представлен итоговый функционал моего первого проекта sub.osipenkov.ru, полностью реализованного в Cursor.

Дополнительно я еще сформировал dataLayer для определения User ID пользователя и настроил отправку этого значения как параметр посетителя в Яндекс Метрику вместе с именем пользователя Telegram (@username), чтобы знать, какой конкретно пользователь и что скачал.

Параметры посетителя - User ID и username Telegram

Проверка и отладка

Осталось только провести небольшой экскурс по клиентской части и показать вам, как сайт выглядит в браузере пользователя. При переходе на sub.osipenkov.ru пользователю необходимо авторизоваться через Telegram, нажав на соответствующую кнопку Войти:

Войти через Telegram

В открывшемся окне необходимо ввести свой номер телефона и нажать кнопку Далее:

Вводе телефона в окне виджета Telegram

После этого посетителю в Telegram придет уведомление на авторизацию:

Принять

Нажав Принять, в окне авторизации нужно разрешить боту писать сообщения.

Разрешить боту писать пользователю

После этого окно закроется, и пользователь автоматически попадет в свой личный кабинет:

Личный кабинет пользователя

Вкладка Подписка в Telegram содержит три кнопки:

  • Открыть чат с ботом - переход в бота Telegram, который будет отправлять сообщения пользователю с моим контентом;
  • Подписаться на канал @clicksider - переход в мой Telegram-канал, на который нужно обязательно подписаться (без этой проверки отправка бесплатного контента недоступна);
  • Проверить подписку - нажав на эту кнопку, можно обновить статусы подписок (отображаются на странице ниже).

Если пользователь не подписан ни на бота, ни на мой канал, оба статуса будут отображаться как Нет. Если подписка оформлена на оба Telegram, статусы покажут Да.

Статусы подписок

Как только пользователь подпишется на бота и канал, на вкладке Бесплатный контент появится возможность отправлять себе сообщения через бота по выбранным материалам:

Отправка бесплатного контента

Со временем база знаний будет пополняться, а доступ к материалам станет полностью автоматизированным. Пользователь просто выбирает то, что ему нужно, и сразу получает это.

Я также учел возможность отправки новых рассылок. Cursor для этого создал отдельную страницу в администраторской панели, на которой можно вводить:

  • текст сообщения;
  • загружать картинку;
  • добавить ссылку и текст для нее.

Рассылка подписчикам

И для этого не нужно использовать какие-то сторонние сервисы. Все выполняется на собственном сервере!

Даже если злоумышленник получит доступ к странице рассылки, он не сможет отправить сообщение подписчикам без знания ADMIN_SECRET (уникального ключа, известного только мне).

Итоги

На создание Telegram-бота на мой контент с использованием Cursor и агента Composer у меня ушло 8 часов чистого времени. Фактически, это один рабочий день. С 0 до 100% за 24 часа! Как вам такое!

Но важно понимать контекст: у меня уже была определенная база в веб-разработке. Я примерно представлял, какие сервисы и инструменты нужно использовать, как развернуть сервер, зарегистрировать домен, настроить DNS-записи, создать бота в Telegram, получить токен, подключить PostgreSQL и работать с базой данных. Я не изобретал архитектуру с нуля - я просто последовательно следовал инструкциям агента и корректировал процесс там, где это было необходимо.

Если бы у меня не было этого понимания, времени ушло бы значительно больше. Пришлось бы отдельно разбираться с инфраструктурой, хостингом, безопасностью, базами данных и логикой бэкенда. Без Cursor и ИИ я бы в принципе этого не сделал, так как не обладаю навыками программирования и бэкенд-разработки. Нет, сделал бы, но мне потребовалось несколько недель на то, чтобы разобраться с этим. Да и зачем? Если в 2026 году ИИ в разработке используют все, даже те, эти технологии создает. Экономия времени и повышение собственной продуктивности - вот ключ к новому миру и реальности!

На мой взгляд, главный навык в работе с ИИ - это умение формулировать мысли и четко понимать, какой результат вы хотите получить на выходе. Во время работы над проектом нужно максимально подробно описывать агенту свои задачи, требования и ограничения. Давать контекст. Делать итерации. Вносить правки. Уточнять. Переформулировать. Чем точнее запрос - тем качественнее результат.

Агент в какой-то момент может пойти не туда, начать повторяться, предлагать не самые оптимальные решения и даже галлюцинировать. Опытные разработчики быстро замечают такие моменты и корректируют направление. Мы же, как интернет-маркетологи, можем не всегда это распознать, и это нормально.

Здесь поможет только практика: ежедневная работа с ИИ, систематические упражнения, постоянные вопросы, эксперименты, ошибки и корректировки. Кстати, именно так мы работаем на моих онлайн-курсах. Все обучение и обратная связь проходят на платформе GetCourse в формате «вопрос-ответ». Когда человек формулирует задачу, прописывает ее текстом, структурирует мысли - у него постепенно формируется ключевой навык новой эпохи.

Умение ясно мыслить и точно выражать свои идеи на естественном языке - сегодня это, пожалуй, самый ценный метанавык. И ИИ лишь усиливает тех, кто таким навыком владеет.

Этим кейсом я хотел показать, что сегодня технологии доступны каждому. Вы больше не нуждаетесь в команде и миллионных вложениях, чтобы воплотить крутую идею. Достаточно ваших рук, головы и подписки в 20$ (бесплатный вариант для разработки такого проекта не подойдет, поскольку вы очень сильно ограничены в количестве запросов и окне контекста). Если у вас есть задумка, знайте: сейчас самое подходящее время, чтобы ее реализовать. Не бойтесь пробовать новое и менять свою жизнь к лучшему. Кремниевая долина ждет новых соло-единорогов!

P.S. Эта статья - 700-ая публикация в моем блоге!

×

Бизнес начал проседать?

Падает выручка? Растут расходы? Непонятно, что происходит?

Оставьте контакт — я разберу вашу ситуацию и попробую помочь