Половина ботов в Telegram раздражают уже первым сообщением. «Привет! Я бот-помощник 🤖 Выбери команду из меню!» — и дальше кнопки, которые никто не нажимает. Я хотел другого: бота, с которым можно говорить нормально, который помнит контекст и не требует плясок с /командами.
Сделал такого за вечер. Расскажу как — со всеми граблями, на которые наступил.
Зачем вообще свой бот
Можно же пользоваться ChatGPT в браузере или официальным приложением. Но я открываю Telegram сотню раз за день — он уже на автомате. Переключаться в браузер или другое приложение для вопроса ИИ — лишнее движение. А ещё хочется контроля: какую модель использовать, сколько контекста хранить, можно ли добавить свои инструкции.
Плюс я заметил странную вещь. Когда ИИ живёт в отдельном чате Telegram, к нему проще обращаться для мелочей. «Переведи это», «объясни термин», «помоги с формулировкой» — прямо в процессе общения с людьми. Не нужно держать в голове, что «это серьёзный инструмент, надо сформулировать запрос».
Что нужно для запуска
Я пошёл по простому пути: свой Telegram-бот плюс API какой-нибудь LLM. Не самое дешёвое решение, но работает стабильно и настраивается как хочешь.
Понадобилось:
- Токен бота от @BotFather (бесплатно, делается за минуту)
- API-ключ от OpenAI, Anthropic или другого провайдера (платно, но стартовые $5 хватит надолго)
- Python 3.9+ и пара библиотек
- Место, где бот будет крутиться (для начала можно на своём компе)
Сначала я попробовал VPS за $5 в месяц — но оказалось, что для теста хватит и ноутбука. Главное — чтобы он был онлайн, пока ты пишешь боту.
Создаём бота
Открываешь @BotFather в Telegram, отправляешь /newbot. Он спросит имя (как бот будет отображаться) и username (должен заканчиваться на bot). Я назвал своего zero_helper_bot — в итоге получил что-то вроде @zero_helper_bot.
BotFather выдаёт токен — длинную строку типа 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz. Это ключ доступа к боту, береги его. Я сразу скопировал в менеджер паролей.
Дальше нужен API-ключ от LLM. Я использую OpenAI (GPT-4), но можно взять Anthropic Claude, Google Gemini или вообще локальную модель через Ollama. Принцип тот же — главное, чтобы был HTTP API.
Регистрируешься на platform.openai.com, идёшь в раздел API keys, создаёшь новый ключ. Он начинается с sk-. Тоже сохраняешь в надёжное место.
Пишем код
Я взял aiogram для Telegram и openai для GPT. Можно было python-telegram-bot, но aiogram показался чуть удобнее для асинхронного кода.
Ставишь зависимости:
pip install aiogram openai
Создаёшь файл bot.py и начинаешь с базовой структуры. Я потратил первый час на то, чтобы бот хотя бы отвечал «Привет» — банально не понял, как работают хэндлеры в aiogram. Документация подробная, но примеров с последней версией (3.x) было мало.
Ключевая логика простая:
- Бот получает сообщение от пользователя
- Отправляет его в OpenAI API вместе с историей последних N сообщений
- Получает ответ
- Отправляет обратно в Telegram
Самая интересная часть — управление контекстом. GPT помнит только то, что ты передаёшь в запросе. Значит, нужно хранить историю диалога. Я сделал словарь в памяти: {chat_id: [список сообщений]}. Для каждого чата храню последние 20 сообщений (10 пар вопрос-ответ). Когда накапливается больше — удаляю самые старые.
Первая версия упала через пять минут. Оказалось, я забыл обработать ошибки от OpenAI API — кончились деньги на счёте или сработал rate limit. Добавил try-except и вменяемое сообщение пользователю.
Граблями по лицу
Запустил бота, написал «Привет». Он ответил через 8 секунд. Проблема: GPT-4 медленный, а в Telegram принято отвечать быстро. Добавил индикатор «печатает...» пока ждём ответ от API, но это не сильно помогло.
Решение: переключился на GPT-4-turbo для большинства запросов. Быстрее в 2–3 раза и дешевле. GPT-4 оставил для сложных задач — добавил команду /deep, которая форсит полную модель.
Вторая проблема: бот тупил на длинных сообщениях. Отправлял ему код на 200 строк — он отвечал обрывками или вообще молчал. Дело в лимитах токенов. Пришлось добавить проверку: если сообщение больше 3000 токенов, бот предупреждает и просит разбить на части.
Третья засада: бот забывал контекст после перезапуска. Вся история в памяти, перезагрузил скрипт — всё пропало. Добавил сохранение в JSON-файл каждые 5 минут. Не идеально, но для личного использования хватает.
Что ещё прикрутил
Базовый бот работал, но хотелось удобства. Добавил несколько команд:
/clear — очистить историю диалога. Использую, когда переключаюсь на другую тему.
/system — изменить системный промпт. Например, /system Ты опытный Python-разработчик настраивает бота под код-ревью.
/model — переключить модель (gpt-4, gpt-4-turbo, gpt-3.5-turbo). Для простых вопросов 3.5 достаточно и в разы дешевле.
Голосовые сообщения (распознавать через Whisper API) хотел добавить, но пока не дошли руки. Может быть, в следующей версии.
Деплой
Для теста запускал на ноутбуке через python bot.py. Работает, но стоит закрыть крышку — бот падает. Перенёс на дешёвый VPS (подойдёт любой — Hetzner, DigitalOcean, Selectel).
На сервере поставил Python, скопировал код, создал systemd-сервис, чтобы бот автоматически поднимался после перезагрузки. Заняло минут 15 — на StackOverflow есть готовые примеры unit-файлов.
Если возиться с сервером не хочется, можно использовать Railway, Render или Heroku. Бесплатные тарифы (с ограничениями) и деплой из GitHub в пару кликов. Пробовал Railway — работает нормально, но бесплатный план даёт 500 часов в месяц, а мне нужно 24/7.
Сколько это стоит
VPS: $5 в месяц (минимальная конфигурация с 1 ГБ RAM)
OpenAI API: зависит от использования. Я трачу примерно $3–5 в месяц при активном использовании (50–100 сообщений в день). GPT-3.5-turbo стоит копейки, GPT-4 дороже раз в 20. Если использовать только 3.5 — выйдет меньше доллара.
Можно вообще бесплатно: локальная модель через Ollama (LLaMA 3, Mistral) плюс бесплатный хостинг на своём компе. Качество ниже, чем у GPT-4, но для базовых задач хватает.
В итоге
Получился персональный ассистент, который живёт в Telegram, помнит контекст и настраивается под мои задачи. Перевод, генерация идей, проверка текстов, быстрые вопросы по коду — всё в одном чате.
Главный плюс — контроль. Я точно знаю, какая модель отвечает, сколько контекста она видит, и мои данные не уходят в сторонние сервисы (кроме OpenAI API, но там можно отключить использование данных для обучения).
Код у меня получился на 200 строк. Если интересно — могу выложить на GitHub шаблон, который можно форкнуть и запустить за 10 минут.
