Как сделать GPT-бота в Telegram: пример на Python и OpenAI API

В этой статье

Собственный GPT-бот в Telegram — это не специальная настройка внутри ChatGPT. Здесь работают два отдельных сервиса: Telegram принимает сообщение через Bot API, а ваш Python-процесс передаёт текст в OpenAI API и возвращает ответ в тот же чат. Telegram описывает бота как приложение, которое работает на сервере владельца через HTTPS в документации для разработчиков.

Ниже соберём минимальный вариант с long polling. Он подходит для первого запуска на локальном компьютере или небольшом сервере: программа сама спрашивает Telegram о новых сообщениях, отправляет текст в Responses API и показывает результат пользователю.

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

Нужен Python 3.10 или новее. Официальный Python SDK OpenAI поддерживает эту версию Python и предоставляет вызов client.responses.create, а готовый текст ответа доступен в response.output_text (README SDK).

Также подготовьте:

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

Токен Telegram-бота и ключ OpenAI — пароли. Не вставляйте их в исходный код, не отправляйте в Telegram и не добавляйте файл с ними в Git. В примере ниже оба значения приходят из переменных окружения.

Создайте бота через BotFather

Откройте в Telegram чат с официальным @BotFather и отправьте команду /newbot. Сначала укажите отображаемое имя, затем username. Username должен оканчиваться на bot; например, my_gpt_test_bot.

В ответ BotFather выдаст HTTP API-токен. Сохраните его в менеджере секретов или в локальной переменной окружения. Если токен уже попал в репозиторий или переписку, в BotFather используйте перевыпуск токена: старое значение после этого нельзя считать безопасным.

Сам факт создания бота в Telegram не делает его официальным продуктом OpenAI. Telegram-бот и OpenAI API принадлежат к разным сервисам; официальные каналы OpenAI следует сверять с перечнем, который публикует OpenAI.

Подготовьте окружение и ключи

Создайте каталог проекта, виртуальное окружение и установите SDK:

python -m venv .venv

  # Linux и macOS
source .venv/bin/activate

  # Windows PowerShell
  # .venv\Scripts\Activate.ps1

python -m pip install --upgrade openai

В Linux или macOS переменные можно задать на время текущей сессии терминала:

export TELEGRAM_BOT_TOKEN='значение-из-BotFather'
export OPENAI_API_KEY='ключ-OpenAI'

В Windows PowerShell синтаксис другой:

$env:TELEGRAM_BOT_TOKEN = 'значение-из-BotFather'
$env:OPENAI_API_KEY = 'ключ-OpenAI'

Если закрыть терминал, эти временные переменные исчезнут — для проверки это удобно. Для постоянного запуска используйте защищённое хранилище секретов или настройки окружения сервиса, а не файл bot.py.

Минимальный бот на Python

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

import json
import os
import time
from urllib.parse import urlencode
from urllib.request import Request, urlopen

from openai import OpenAI


TELEGRAM_BOT_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
TELEGRAM_API = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}"
OPENAI_MODEL = "gpt-5.5"

client = OpenAI()


def telegram_call(method: str, **params):
    """Вызвать метод Telegram Bot API и вернуть его result."""
    body = urlencode(params).encode("utf-8")
    request = Request(
        f"{TELEGRAM_API}/{method}",
        data=body,
        headers={"Content-Type": "application/x-www-form-urlencoded"},
        method="POST",
    )
    with urlopen(request, timeout=70) as response:
        payload = json.load(response)

    if not payload.get("ok"):
        raise RuntimeError(f"Telegram API error: {payload}")
    return payload["result"]


def answer_with_gpt(text: str) -> str:
    response = client.responses.create(
        model=OPENAI_MODEL,
        input=text,
    )
    return response.output_text.strip()


def main() -> None:
    offset = None
    print("Бот запущен. Для остановки нажмите Ctrl+C.")

    while True:
        params = {"timeout": 50}
        if offset is not None:
            params["offset"] = offset

        try:
            updates = telegram_call("getUpdates", **params)
        except Exception as error:
            print(f"Ошибка получения обновлений: {error}")
            time.sleep(3)
            continue

        for update in updates:
            # Сначала сдвигаем offset: это не даст обработать обновление снова.
            offset = update["update_id"] + 1
            message = update.get("message") or {}
            chat = message.get("chat") or {}
            text = message.get("text")

            if not text or "id" not in chat:
                continue

            if text.strip() == "/start":
                reply = "Напишите вопрос, и я передам его GPT."
            else:
                try:
                    reply = answer_with_gpt(text)
                except Exception as error:
                    print(f"Ошибка OpenAI API: {error}")
                    reply = "Не удалось получить ответ. Проверьте журнал бота и настройки API."

            # Не отправляем пользователю содержимое исключения или секреты.
            telegram_call("sendMessage", chat_id=chat["id"], text=reply[:4096])


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("Бот остановлен.")

В строке OPENAI_MODEL стоит модель из примера README SDK, доступного на дату подготовки материала. Доступность моделей, их имена и условия использования меняются, поэтому перед запуском проверьте доступную модель в настройках своего API-проекта. Если gpt-5.5 недоступна, замените только это значение на модель, которая доступна вам; схема вызова Responses API останется той же.

Что происходит после первого сообщения

Запустите программу:

python bot.py

Теперь откройте своего бота по username и нажмите Start. Telegram отправит обновление, в котором есть message, chat и текст /start. Код узнает команду и ответит локальной фразой — это первая проверка, не затрагивающая OpenAI.

Затем отправьте, например, Объясни, что такое HTTPS, в двух предложениях. Последовательность будет такой:

  1. getUpdates получает сообщение от Telegram.
  2. answer_with_gpt передаёт его как input в client.responses.create.
  3. response.output_text извлекает обычный текст без разбора внутренней структуры ответа.
  4. sendMessage отправляет этот текст в исходный chat_id.

Смотрите на терминал: там не должен появиться сам ключ. В чате должен прийти ответ модели, а повторный вызов getUpdates не должен снова прислать то же сообщение. За это отвечает offset: после обработки обновления программа запоминает update_id + 1.

Если первый тест не прошёл

Сообщение KeyError: 'TELEGRAM_BOT_TOKEN' или KeyError: 'OPENAI_API_KEY' означает, что переменная не задана в том же терминале, из которого запускается Python. Проверьте имя и повторите команду установки переменной.

Если /start не отвечает, сначала посмотрите, появляется ли ошибка в терминале. Проверьте токен BotFather и убедитесь, что другой процесс не забирает обновления этого же бота. Два параллельных экземпляра с long polling мешают друг другу.

Если /start работает, а обычный текст приводит к сообщению об ошибке OpenAI, отдельно проверьте ключ, права проекта и выбранную модель. Не выводите ключ в журнал ради диагностики. В рабочем приложении полезно добавить ограничение частоты запросов, журналирование только технических идентификаторов и обработку сетевых тайм-аутов.

Этот пример намеренно не хранит историю диалога: каждый текст уходит в модель как отдельный запрос. Контекст, авторизация пользователей, лимиты и очередь запросов — следующий слой приложения, а не условие первого успешного ответа.

Собственный бот или готовый AI-сервис

Теперь видно, за что отвечает ваш код: он хранит секреты, принимает Telegram-обновления, вызывает API и поддерживает связь между чатом и выбранным проектом OpenAI. Если нужен именно такой контроль, можно развивать этот каркас.

Если самостоятельная интеграция и поддержка ключей не нужны, после проверки примера откройте каталог AI-сервисов Amber Market. Это отдельный каталог готового доступа к нейросетям и подпискам, а не каталог Telegram-ботов. Перед оформлением проверьте на странице конкретную услугу и её условия; оплату через СБП используйте только по подтверждённым условиям выбранной карточки.

Источники

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