Нейросеть-чат-бот GPT в Telegram: как подключить на Python

В этой статье

Собственный GPT-бот в Telegram работает по простой цепочке: пользователь пишет сообщение, Python получает его через Telegram Bot API, отправляет текст в OpenAI API и возвращает ответ в тот же чат. Для первого запуска достаточно long polling — программа сама запрашивает новые сообщения, поэтому публичный сервер и webhook не нужны.

Ниже — минимальный вариант для локальной проверки. В нём нет базы данных, памяти диалога, платежей и production-развёртывания.

Что понадобится

Подготовьте:

  • аккаунт Telegram для регистрации бота;
  • API-ключ OpenAI и доступ к биллингу API-проекта, если он требуется для запросов;
  • Python 3.10 или новее и терминал.

Подписка ChatGPT и доступ к OpenAI API — разные вещи. Подписка в ChatGPT сама по себе не создаёт API-ключ и не гарантирует доступ к нужной модели. Ключ создаётся в настройках API-платформы и должен храниться как секрет.

Если программная интеграция вам не нужна и вы ищете отдельные услуги оплаты зарубежных сервисов, их можно посмотреть в каталоге Amber Market. Для этого бота каталог не требуется: ниже используется прямой вызов API из Python.

Зарегистрируйте бота через BotFather

Откройте в Telegram чат @BotFather и отправьте команду /newbot. BotFather попросит:

  1. название, которое увидят пользователи;
  2. username, заканчивающийся на bot, например my_gpt_demo_bot.

После регистрации Telegram покажет токен — длинную строку для доступа к боту. Скопируйте его во временное защищённое место. Не вставляйте токен в статью, Git-репозиторий, скриншот или исходный код. Если он случайно опубликован, отзовите его через BotFather и выпустите новый. Общая схема регистрации описана в документации Telegram для разработчиков.

Создайте проект и установите библиотеки

В пустой папке создайте виртуальное окружение:

python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install "python-telegram-bot==22.8" openai

В Linux или macOS активация выглядит так:

source .venv/bin/activate

Пример рассчитан на python-telegram-bot 22.8: в нём используется ApplicationBuilder. Если ставите другую версию, сверяйте синтаксис с официальной документацией библиотеки.

Передайте ключи через переменные окружения

Не записывайте токены в bot.py. Задайте их в том же окне терминала, из которого будете запускать программу.

В PowerShell:

$env:TELEGRAM_BOT_TOKEN = "токен-от-BotFather"
$env:OPENAI_API_KEY = "ваш-api-ключ-openai"
$env:OPENAI_MODEL = "gpt-4o-mini"

В Linux или macOS:

export TELEGRAM_BOT_TOKEN='токен-от-BotFather'
export OPENAI_API_KEY='ваш-api-ключ-openai'
export OPENAI_MODEL='gpt-4o-mini'

gpt-4o-mini здесь только пример. Доступность модели, её точное имя и биллинг зависят от API-проекта. Проверьте список доступных моделей в своём проекте; если этого идентификатора нет, укажите разрешённую модель. Имя читается из OPENAI_MODEL, поэтому исходник менять не придётся. Формат первого запроса показан в официальном quickstart OpenAI.

Напишите минимальный бот

Создайте файл bot.py и вставьте код:

import logging
import os

from openai import AsyncOpenAI
from telegram import Update
from telegram.ext import (
    ApplicationBuilder,
    ContextTypes,
    MessageHandler,
    filters,
)


logging.basicConfig(
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    level=logging.INFO,
)
logger = logging.getLogger(__name__)


TELEGRAM_BOT_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
OPENAI_MODEL = os.environ["OPENAI_MODEL"]

openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY)


async def handle_message(
    update: Update,
    context: ContextTypes.DEFAULT_TYPE,
) -> None:
    if update.message is None or not update.message.text:
        return

    try:
        response = await openai_client.responses.create(
            model=OPENAI_MODEL,
            input=update.message.text,
        )
        answer = response.output_text.strip()
        if not answer:
            answer = "Модель не вернула текстовый ответ."
        await update.message.reply_text(answer)
    except Exception:
        logger.exception("Ошибка запроса к OpenAI API")
        await update.message.reply_text(
            "Не удалось получить ответ. Проверьте ключи, модель и логи программы."
        )


def main() -> None:
    application = ApplicationBuilder().token(TELEGRAM_BOT_TOKEN).build()
    application.add_handler(
        MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)
    )
    application.run_polling()


if __name__ == "__main__":
    main()

handle_message получает обычное текстовое сообщение. Вызов responses.create передаёт его в Responses API, response.output_text достаёт готовый текст, а reply_text отправляет его обратно в тот же чат Telegram.

История в примере не хранится: каждое сообщение — самостоятельный запрос. Поэтому бот не знает, что пользователь писал ему минуту назад. Это сознательное ограничение минимальной версии; память диалога потребует отдельного решения и контроля размера контекста.

Запустите polling и проверьте ответ

В активированном окружении выполните:

python bot.py

Процесс останется запущенным, а в терминале появятся служебные записи. Найдите бота по username, нажмите Start и отправьте:

Объясни в двух предложениях, что такое polling в Telegram.

При доступных ключе и модели бот вернёт текстовый ответ в тот же чат. Закрытие терминала остановит программу: polling работает, пока запущен этот процесс.

В этом режиме бот получает обновления через getUpdates. Telegram также поддерживает webhook, при котором обновления отправляются на публичный HTTPS-адрес, но для локального учебного запуска он не нужен. Оба варианта описаны в Telegram Bot API.

Если ответа нет

Проверяйте ошибку по месту её возникновения.

  • Если программа завершается из-за отсутствующей переменной окружения, задайте TELEGRAM_BOT_TOKEN, OPENAI_API_KEY и OPENAI_MODEL в том же окне, откуда запускаете python bot.py. Переменная из другого окна не переносится.
  • Если Telegram не отвечает, проверьте токен BotFather и убедитесь, что запущен именно тот bot.py, где зарегистрирован MessageHandler. Остановите старый экземпляр: два процесса могут конкурировать за один polling-поток.
  • Если в логе появляется ошибка OpenAI, проверьте, не перепутаны ли API-ключ и Telegram-токен, есть ли у API-проекта нужный биллинг и разрешена ли модель из OPENAI_MODEL. Не подставляйте модель вслепую по чужому примеру.

После первой успешной проверки у вас есть рабочая связка «сообщение Telegram → Responses API → ответ в чат». Webhook, база данных, память диалога, ограничения доступа и развёртывание на сервере — следующие самостоятельные задачи, которые лучше добавлять по одной. Для отдельной проверки самого вызова OpenAI API до подключения Telegram пригодится базовый пример первого запроса из Python.

Источники

Есть следующая задача?Ещё по теме «Telegram-боты» →