Как создать Telegram-бота с AI за 30 минут
Пошаговый гайд: создаём Telegram-бота с GPT-4o на Python. От регистрации до деплоя — с рабочим кодом и объяснениями.
Представьте: у вас есть личный AI-ассистент в Telegram, который отвечает на вопросы, генерирует тексты и помогает с рутиной — и вы собрали его сами за полчаса. Это не фантастика, а реальный проект на Python с OpenAI API. В этом гайде мы пройдём путь от пустого файла до работающего бота с искусственным интеллектом.
Что мы будем строить
Наш бот будет принимать текстовые сообщения от пользователя, отправлять их в OpenAI API (модель GPT-4o-mini) и возвращать ответ прямо в чат Telegram. Дополнительно реализуем хранение контекста диалога — бот будет помнить, о чём вы говорили.
graph LR
A[Пользователь] -->|Сообщение| B[Telegram API]
B -->|Webhook / Polling| C[Python-бот]
C -->|Запрос| D[OpenAI API]
D -->|Ответ GPT| C
C -->|Ответ| B
B -->|Сообщение| A
Telegram-бот с AI — это не просто игрушка. Это полноценный инструмент, который можно адаптировать под поддержку клиентов, личного помощника или корпоративную базу знаний.
Шаг 1. Подготовка — что понадобится
Прежде чем писать код, нужно получить два ключа: токен Telegram-бота и API-ключ OpenAI.
Создание бота в Telegram
- Откройте Telegram и найдите @BotFather
- Отправьте команду
/newbot - Укажите отображаемое имя бота (например, «Мой AI Помощник»)
- Укажите username бота (должен заканчиваться на
bot, напримерmy_ai_helper_bot) - Скопируйте полученный токен — строку вида
7123456789:AAHx...
Получение OpenAI API Key
- Зарегистрируйтесь на platform.openai.com
- Перейдите в раздел API Keys → Create new secret key
- Скопируйте ключ — он показывается только один раз
.env файл. Если ключ утёк в публичный репозиторий — немедленно отзовите его.Стоимость OpenAI API
Актуальные цены на апрель 2026:
| Модель | Ввод (за 1M токенов) | Вывод (за 1M токенов) | Контекст |
|---|---|---|---|
| GPT-4o-mini | $0.15 | $0.60 | 128K токенов |
| GPT-4o | $2.50 | $10.00 | 128K токенов |
Для бота с умеренной нагрузкой (100 сообщений в день) GPT-4o-mini обойдётся в менее $1 в месяц. Это оптимальный выбор для начала.
Шаг 2. Настройка проекта
Создайте папку проекта и установите зависимости.
mkdir ai-telegram-bot && cd ai-telegram-bot
python -m venv venv
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
pip install aiogram openai python-dotenv
Мы используем aiogram 3.x (актуальная версия — 3.27.0) — это современный асинхронный фреймворк для Telegram Bot API на Python. Альтернатива — python-telegram-bot (v22.7), но aiogram лучше подходит для асинхронной работы с внешними API.
| Критерий | aiogram 3.x | python-telegram-bot 22.x |
|---|---|---|
| Асинхронность | Нативная (asyncio) | Нативная (с v20+) |
| Роутинг | Встроенные роутеры | Handlers |
| Middleware | Да | Нет |
| Документация на русском | Хорошая (автор из СНГ) | Средняя |
| Популярность | Популярен в РФ/СНГ | Популярен глобально |
Создайте файл .env в корне проекта:
TELEGRAM_BOT_TOKEN=7123456789:AAHxВашТокенЗдесь
OPENAI_API_KEY=sk-proj-ВашКлючЗдесь
Шаг 3. Пишем бота — основной код
Создайте файл bot.py:
import asyncio
import os
from dotenv import load_dotenv
from aiogram import Bot, Dispatcher, Router, F
from aiogram.types import Message
from aiogram.filters import CommandStart
from openai import AsyncOpenAI
load_dotenv()
bot = Bot(token=os.getenv("TELEGRAM_BOT_TOKEN"))
dp = Dispatcher()
router = Router()
dp.include_router(router)
# Клиент OpenAI (асинхронный)
client = AsyncOpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# Хранение истории диалогов: {user_id: [messages]}
conversations: dict[int, list[dict]] = {}
SYSTEM_PROMPT = (
"Ты — полезный AI-ассистент. Отвечай кратко, по делу, на русском языке. "
"Если не знаешь ответа — честно скажи об этом."
)
@router.message(CommandStart())
async def cmd_start(message: Message):
user_id = message.from_user.id
conversations[user_id] = [] # Сброс истории
await message.answer(
"Привет! Я AI-ассистент на базе GPT-4o-mini.\n"
"Задайте мне любой вопрос, и я постараюсь помочь.\n\n"
"Команды:\n"
"/start — начать заново\n"
"/clear — очистить контекст диалога"
)
@router.message(F.text == "/clear")
async def cmd_clear(message: Message):
conversations[message.from_user.id] = []
await message.answer("Контекст очищен. Начнём с чистого листа!")
@router.message(F.text)
async def handle_message(message: Message):
user_id = message.from_user.id
# Инициализация истории, если её нет
if user_id not in conversations:
conversations[user_id] = []
# Добавляем сообщение пользователя в историю
conversations[user_id].append({
"role": "user",
"content": message.text
})
# Ограничиваем историю последними 20 сообщениями
if len(conversations[user_id]) > 20:
conversations[user_id] = conversations[user_id][-20:]
# Отправляем индикатор "печатает..."
await bot.send_chat_action(chat_id=message.chat.id, action="typing")
try:
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
*conversations[user_id]
],
max_tokens=1024,
temperature=0.7,
)
assistant_message = response.choices[0].message.content
# Сохраняем ответ в историю
conversations[user_id].append({
"role": "assistant",
"content": assistant_message
})
await message.answer(assistant_message)
except Exception as e:
await message.answer(f"Произошла ошибка: {str(e)}")
async def main():
print("Бот запущен!")
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
conversations хранит последние 20 сообщений для каждого пользователя. Это позволяет боту помнить контекст диалога, но не раздувать запросы к API. При 20 сообщениях стоимость одного запроса к GPT-4o-mini — доли цента.Шаг 4. Запускаем и тестируем
python bot.py
Если всё настроено верно, вы увидите Бот запущен! в консоли. Откройте Telegram, найдите вашего бота по username и отправьте /start.
sequenceDiagram
participant U as Пользователь
participant T as Telegram
participant B as bot.py
participant O as OpenAI API
U->>T: /start
T->>B: Update (command)
B->>T: "Привет! Я AI-ассистент..."
T->>U: Приветственное сообщение
U->>T: "Объясни квантовые вычисления"
T->>B: Update (text)
B->>B: Сохранить в conversations
B->>T: typing...
B->>O: chat.completions.create()
O->>B: Ответ модели
B->>B: Сохранить ответ
B->>T: Текст ответа
T->>U: Объяснение от GPT
Что проверить
- Бот отвечает на
/startприветствием - На текстовые сообщения приходит осмысленный ответ
/clearсбрасывает контекст — бот «забывает» предыдущий разговор- Бот помнит контекст в рамках диалога (спросите «а подробнее?» после первого вопроса)
sk-) и наличие средств на балансе OpenAI. Логи ошибок выводятся в консоль.Шаг 5. Улучшения для продакшена
Базовый бот работает, но для реального использования стоит добавить несколько улучшений.
Rate limiting — защита от спама
from datetime import datetime, timedelta
user_last_message: dict[int, datetime] = {}
RATE_LIMIT_SECONDS = 3
@router.message(F.text)
async def handle_message(message: Message):
user_id = message.from_user.id
now = datetime.now()
# Проверяем rate limit
if user_id in user_last_message:
diff = now - user_last_message[user_id]
if diff < timedelta(seconds=RATE_LIMIT_SECONDS):
await message.answer("Подождите немного перед следующим сообщением.")
return
user_last_message[user_id] = now
# ... остальная логика
Стриминг ответов
Для длинных ответов полезно отправлять текст по частям, чтобы пользователь не ждал:
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[...],
stream=True,
)
chunks = []
async for chunk in response:
if chunk.choices[0].delta.content:
chunks.append(chunk.choices[0].delta.content)
full_response = "".join(chunks)
await message.answer(full_response)
Варианты деплоя
| Платформа | Бесплатный план | Подходит для |
|---|---|---|
| Railway | $5 кредит/мес | Быстрый старт |
| Render | 750 часов/мес | Хобби-проекты |
| VPS (Timeweb, Selectel) | от 150 ₽/мес | Полный контроль |
| Docker + свой сервер | — | Продакшен |
Для деплоя на VPS достаточно:
# На сервере
git clone <ваш-репозиторий>
cd ai-telegram-bot
pip install -r requirements.txt
# Запуск через systemd или screen
nohup python bot.py &
— Подключите генерацию изображений через DALL-E
— Реализуйте систему ролей: «переводчик», «копирайтер», «код-ревьюер»
— Сохраняйте историю в SQLite или Redis вместо словаря в памяти
— Добавьте инлайн-кнопки для выбора модели (GPT-4o-mini / GPT-4o)
Заключение
Мы прошли полный путь от идеи до работающего Telegram-бота с AI: зарегистрировали бота, подключили OpenAI API, написали обработку сообщений с хранением контекста и разобрали улучшения для продакшена.
Ключевые выводы:
- Порог входа минимален — 50 строк кода на Python для рабочего прототипа
- Стоимость низкая — GPT-4o-mini стоит $0.15 за миллион входных токенов, для личного бота это копейки
- aiogram 3.x — лучший выбор для асинхронных ботов, особенно если вы из русскоязычного сообщества
- Главное — безопасность — храните ключи в
.env, ограничивайте rate limit, не давайте боту доступ к чувствительным данным
Лучший способ разобраться в AI — не читать о нём, а построить что-то работающее. Telegram-бот — идеальный первый проект: результат виден сразу, а дальше его можно развивать бесконечно.