Мини-CRM в Telegram за 0 ₽: лид-бот на Python и Yandex Cloud Functions

Мини-CRM в Telegram за 0 ₽: лид-бот на Python и Yandex Cloud Functions

Мне нужна была CRM. Bitrix24 — от 2000₽/мес. AmoCRM — от 1500₽/мес. Для 5–10 лидов в месяц это абсурд.

Я посмотрел на свой Telegram. Групповые чаты с топиками — это по сути тикет-система: один топик = один лид, вся переписка в одном месте, есть поиск и уведомления на телефон. Оставалось добавить только входную точку — бота, который квалифицирует лид и создаёт топик автоматически.

Я написал такого бота на Python и задеплоил его на Yandex Cloud Functions. Получилась мини-CRM, которая обходится в 0 ₽ в месяц.

Важно: это не замена Bitrix или AmoCRM. Нет воронок, дашбордов и автоматических напоминаний. Решение подойдёт соло-предпринимателям и небольшим командам, которые обрабатывают до 20 лидов в месяц и не хотят платить за CRM, которую используют на 10%.

Что получится

Схема работы:

Пользователь нажимает CTA на сайте → переходит в бота → отвечает на два вопроса кнопками → бот создаёт топик в админской группе с карточкой лида → далее переписка ведётся через бота, а вся история хранится в топике.

Стоимость:

Cloud Function: 0 ₽ (1 млн вызовов в месяц бесплатно)

Object Storage: 0 ₽ (1 ГБ бесплатно)

DNS + SSL-сертификат: не нужны — API Gateway не требуется, функция доступна по HTTPS напрямую через allow-unauthenticated-invoke. Этого достаточно для Telegram webhook.

Как написать бота для приёма заявок в Telegram на Python

Почему без фреймворков

Такие библиотеки, как aiogram и python-telegram-bot, отлично подходят для сложных ботов. Но для Yandex Cloud Functions они избыточны:

  • Cold start. Тяжёлые фреймворки добавляют 1–3 секунды к первому вызову. httpx импортируется почти мгновенно.
  • Polling не нужен. Cloud Functions работают по webhook — бот с polling-режимом просто не запустится.
  • Роутинг не нужен. У нас одна точка входа и два типа апдейтов. if/elif хватает.

Весь API-слой — всего 57 строк кода. Это лёгкая обёртка над Telegram Bot API.

Почему copy_message, а не forward_message? При пересылке Telegram добавляет надпись «Переслано от…» — выглядит неряшливо. copy_message отправляет чистое сообщение без маркера.

Точка входа: webhook-хендлер

Cloud Function получает HTTP-запрос от Telegram. Первое — валидация секретного токена.

Параметр secret_token задаётся при установке webhook. Telegram присылает его в каждом запросе. Без проверки любой может отправлять фейковые апдейты на URL вашей функции.

Квалификация лида: inline-кнопки

По команде /start бот задаёт два вопроса. Первый — о сфере бизнеса.

Есть защита от дублей: если пользователь уже оставлял заявку, бот не создаёт новый топик, а предлагает писать в существующий. Один топик — один клиент.

Трюк с callback data: stateless-квалификация

Cloud Functions — stateless. Каждый вызов начинается с чистого листа. Чтобы не обращаться к хранилищу при каждом клике, я кодирую ответ Q1 прямо в callback data Q2.

Когда пользователь нажимает кнопку Q2, callback приходит в виде q2:sales:ecommerce — оба ответа в одной строке. На «счастливом пути» нет обращений к хранилищу.

Ограничение: callback data — максимум 64 байта. Этого хватает для предустановленных вариантов. Но для опции «Другое» (свободный ввод) приходится использовать Object Storage: временный файл state/{chat_id}.json, который удаляется после завершения.

Финализация: создание топика

После двух ответов бот создаёт топик в админской группе.

Двусторонний relay

Самая CRM-подобная функция. Вы отвечаете в топике — бот пересылает сообщение клиенту. Клиент отвечает боту — бот пересылает в топик.

Клиент видит обычный чат с ботом. Вы — организованный список лидов в группе. Каждый диалог — в своём топике, с историей и поиском.

Бонус: трекинг источника через /start

Команда /start поддерживает deep link: t.me/your_bot?start=website, ?start=habr, ?start=instagram. Бот получает это как /start website. Сейчас источник захардкожен как «website», но распарсить параметр и добавить в карточку лида — три строчки кода.

Мини-CRM на базе Telegram: возможности и ограничения

Настройка группы

  1. Создайте supergroup в Telegram.
  2. Включите Топики (режим форума) в настройках группы.
  3. Добавьте бота как администратора с правами: Управление темами и Отправка сообщений.

Что вы получаете

  • Один топик = один лид: вся переписка в одном месте.
  • Поиск по лидам: Telegram ищет по тексту во всех топиках.
  • Закреплённые сообщения: закрепите карточку лида в начале топика.
  • Уведомления на телефон: не нужно отдельное приложение.
  • Двусторонний relay: отвечаете в топике — клиент получает в боте, и наоборот.

Bitrix и AmoCRM стоят от 1500 ₽/мес. Для соло-основателей с 0–20 лидами в месяц мини-CRM на Telegram достаточно. Когда понадобятся воронки или командная работа — пора переезжать на полноценную CRM.

Claude Code: от идеи до работающего бота за одну сессию

Весь бот — от первой строки до работающего webhook — был написан и задеплоен за одну сессию с Claude Code. Я описал задачу: «Нужен Telegram-бот для квалификации лидов, деплой на Yandex Cloud Functions». Дальше Claude Code:

  1. Написал код бота (handler, API-обёртку, storage).
  2. Собрал zip-пакет с зависимостями.
  3. Задеплоил через yc CLI на Cloud Functions.
  4. Настроил webhook с secret token.

Claude Code использует кастомный навык для Yandex Cloud — набор команд yc CLI для работы с Object Storage, Cloud Functions, DNS и сертификатами. Навык открыт — его можно подключить к своему Claude Code и деплоить на Yandex Cloud голосом.

Как задеплоить Telegram-бота на Yandex Cloud Functions бесплатно

Что нужно заранее

  • Аккаунт Yandex Cloud (free tier).
  • Сервис-аккаунт с ролью storage.editor.
  • Статические ключи доступа: yc iam access-key create --service-account-name <sa>.
  • Приватный бакет Object Storage для состояния бота.
  • Токен бота от @BotFather.
  • Chat ID группы и ваш Telegram user ID.

Шаги:

  1. Собрать пакет.
  2. Загрузить в Object Storage.
  3. Создать функцию.
  4. Задеплоить версию.
  5. Открыть публичный доступ.
  6. Установить webhook.
  7. Протестировать: откройте бота в Telegram, отправьте /start.

Подводные камни: что пошло не так

1. «Not enough rights to create a topic»

Бот добавлен как админ, но не создаёт топики. Причина: нужно явное разрешение «Управление темами». Добавить в админы — недостаточно. Проверьте каждое право отдельно.

2. Privacy mode блокирует relay

По умолчанию боты в группах видят только команды (сообщения с /). Для relay нужно видеть все сообщения. Решение: @BotFather → /setprivacy → Disable.

3. Лимит 128 символов на название топика

Telegram молча обрезает длинные названия. Если Q1 и Q2 содержат много текста, название топика станет неинформативным. Решение — обрезать явно в коде.

4. Callback data — максимум 64 байта

Паттерн q2:sales:ecommerce влезает. Но при свободном вводе callback не подходит. Поэтому «Другое» переключается на Object Storage для хранения промежуточного состояния.

5. Cold start ~2 секунды

Первый вызов после простоя — медленный. httpx импортируется быстро, но boto3 весит ~30 МБ и тормозит. Не критично: Telegram ждёт ответ 60 секунд. Для ускорения можно заменить boto3 на прямые HTTP-запросы к S3 API.

6. Безопасность: секреты в переменных окружения

В статье секреты передаются через --environment. Это просто, но нужно понимать риски.

Что хранится:

  • BOT_TOKEN: полный контроль над ботом — чтение и отправка сообщений.
  • WEBHOOK_SECRET: возможность слать фейковые апдейты на функцию.
  • AWS_ACCESS_KEY_ID + SECRET: доступ к бакету с маппингами (chat_id пользователей).
  • ADMIN_GROUP_ID, ADMIN_USER_ID: не секреты — просто числа, без токена бесполезны.

Единственный критичный секрет — BOT_TOKEN. Остальное без токена бесполезно: webhook secret проверяется только через бота, а S3-ключи дают доступ к файлам с chat_id.

Кто может увидеть env vars:

  1. Пользователи Yandex Cloud с ролью functions.editor или admin на вашу папку.
  2. Те, у кого доступ к вашей машине — команда попадает в ~/.zsh_history.

Если вы единственный пользователь в облаке и работаете на своём устройстве — реальный вектор атаки отсутствует. Для соло-проекта это приемлемый компромисс.

Когда стоит перейти на Yandex Lockbox:

  • В проекте появились другие люди с доступом к облаку.
  • Бот обрабатывает чувствительные данные (платежи, персональные данные).
  • Вы используете CI/CD, где логи команд могут сохраняться.

Lockbox бесплатен для первых 3 секретов. Но для соло-бота с 5 лидами в месяц --environment достаточно.

Мини-CRM в Telegram: бот для квалификации лидов + группа с топиками для переписки. 0 ₽ в месяц, 0 инфраструктуры, работает с телефона.

Приём лидов: Telegram-бот с inline-кнопками.

Хранение и переписка: топики в Telegram-группе.

Связь: двусторонний relay через бота.

Инфраструктура: Yandex Cloud Functions (бесплатно), Object Storage (бесплатно).

Читать оригинал