Шаг 4 · Python + AI · 40 минут

Пишем AI‑бота в Telegram, даже если вы не программист

Создадим настоящего бота: пользователь пишет вопрос, программа получает сообщение, отправляет текст AI‑модели и возвращает ответ в Telegram.

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

Как всё связано

Telegram хранит интерфейс и доставляет сообщения. Наша Python‑программа постоянно спрашивает Telegram о новых событиях — это называется long polling. Полученный текст программа передаёт через API модели и отправляет результат обратно.

1. Регистрируем бота

  1. В Telegram найдите официальный аккаунт @BotFather.
  2. Отправьте /newbot.
  3. Введите отображаемое имя.
  4. Придумайте username, который заканчивается на bot.
  5. Скопируйте токен вида 123456:ABC....

Токен работает как пароль. Если он попал в чужие руки, выполните в BotFather команду /revoke и получите новый.

2. Создаём папку и окружение

mkdir -p ~/ai-telegram-bot
cd ~/ai-telegram-bot
python3 -m venv .venv
source .venv/bin/activate
pip install aiogram python-dotenv openai

Виртуальное окружение .venv изолирует библиотеки проекта от системы. После активации в начале строки терминала появится (.venv).

3. Сохраняем секреты

nano .env
BOT_TOKEN=токен_от_BotFather
AI_API_KEY=ключ_провайдера_модели

Без кавычек и пробелов вокруг =. Затем создайте .gitignore:

.env
.venv/
__pycache__/

4. Пишем программу

nano bot.py
import asyncio
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. Первый запуск

python bot.py

Откройте бота, нажмите Start и задайте вопрос. В терминале должны появиться информационные сообщения. Остановка — Ctrl+C.

Что может сломаться

  • Unauthorized — неверный токен Telegram.
  • AuthenticationError — неверный ключ AI API.
  • ModuleNotFoundError — окружение не активировано или пакет не установлен.
  • Conflict: terminated by other getUpdates — этот же бот уже запущен в другом месте.

7. Что добавить перед публичным запуском

  • лимит сообщений на пользователя;
  • белый список пользователей для личного бота;
  • базу для истории диалога;
  • контроль длины запроса;
  • предел расходов в кабинете AI‑провайдера.

Локальный бот остановится вместе с терминалом. Чтобы он работал постоянно, упакуем проект и разместим на VPS →