Пишем AI‑бота в Telegram, даже если вы не программист
Создадим настоящего бота: пользователь пишет вопрос, программа получает сообщение, отправляет текст AI‑модели и возвращает ответ в Telegram.
Как всё связано
Telegram хранит интерфейс и доставляет сообщения. Наша Python‑программа постоянно спрашивает Telegram о новых событиях — это называется long polling. Полученный текст программа передаёт через API модели и отправляет результат обратно.
1. Регистрируем бота
- В Telegram найдите официальный аккаунт @BotFather.
- Отправьте
/newbot. - Введите отображаемое имя.
- Придумайте username, который заканчивается на
bot. - Скопируйте токен вида
123456:ABC....
Токен работает как пароль. Если он попал в чужие руки, выполните в BotFather команду /revoke и получите новый.
2. Создаём папку и окружение
cd ~/ai-telegram-bot
python3 -m venv .venv
source .venv/bin/activate
pip install aiogram python-dotenv openai
Виртуальное окружение .venv изолирует библиотеки проекта от системы. После активации в начале строки терминала появится (.venv).
3. Сохраняем секреты
AI_API_KEY=ключ_провайдера_модели
Без кавычек и пробелов вокруг =. Затем создайте .gitignore:
.venv/
__pycache__/
4. Пишем программу
import logging
import os
from aiogram import Bot, Dispatcher, F, types
from aiogram.filters import CommandStart
from dotenv import load_dotenv
from openai import AsyncOpenAI
load_dotenv()
logging.basicConfig(level=logging.INFO)
bot = Bot(os.environ["BOT_TOKEN"])
dp = Dispatcher()
ai = AsyncOpenAI(api_key=os.environ["AI_API_KEY"])
@dp.message(CommandStart())
async def start(message: types.Message):
await message.answer("Привет! Напишите вопрос.")
@dp.message(F.text)
async def answer(message: types.Message):
status = await message.answer("Думаю…")
try:
response = await ai.responses.create(
model="gpt-4.1-mini",
instructions="Отвечай кратко и по-русски.",
input=message.text,
)
await status.edit_text(response.output_text[:4000])
except Exception:
logging.exception("AI request failed")
await status.edit_text("Не получилось ответить. Попробуйте позже.")
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
5. Что делает код
@dp.message(CommandStart()) связывает команду /start с функцией приветствия. Обработчик F.text получает обычные текстовые сообщения. await позволяет программе не зависать во время сетевого запроса. Блок try/except показывает пользователю понятную ошибку, а подробность оставляет в журнале.
6. Первый запуск
Откройте бота, нажмите Start и задайте вопрос. В терминале должны появиться информационные сообщения. Остановка — Ctrl+C.
Что может сломаться
Unauthorized— неверный токен Telegram.AuthenticationError— неверный ключ AI API.ModuleNotFoundError— окружение не активировано или пакет не установлен.Conflict: terminated by other getUpdates— этот же бот уже запущен в другом месте.
7. Что добавить перед публичным запуском
- лимит сообщений на пользователя;
- белый список пользователей для личного бота;
- базу для истории диалога;
- контроль длины запроса;
- предел расходов в кабинете AI‑провайдера.
Локальный бот остановится вместе с терминалом. Чтобы он работал постоянно, упакуем проект и разместим на VPS →