ChatGPT в Telegram: как создать своего бота на Python

В этой статье

Если нужен именно свой Telegram-бот с ответами модели, готовый бот из каталога не решит задачу. Здесь нужно связать три вещи: аккаунт бота в Telegram, программу на Python и OpenAI API. Пользователь пишет сообщение, Telegram передаёт его вашему процессу, а программа отправляет текст модели и возвращает ответ в тот же чат.

Ниже — минимальный запуск через long polling. Он удобен для проверки на компьютере: отдельный HTTPS-сервер не нужен, а программа сама забирает новые сообщения из Telegram.

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

Нужны Python 3.11 или новее, аккаунт Telegram и ключ OpenAI API. Для примера используется ветка python-telegram-bot 22.x и официальный пакет openai. Установите зависимости в виртуальное окружение:

python -m venv .venv
source .venv/bin/activate
python -m pip install "python-telegram-bot>=22,<23" openai

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

.\.venv\Scripts\Activate.ps1
python -m pip install "python-telegram-bot>=22,<23" openai

Если команда активации PowerShell заблокирована политикой системы, можно запускать .venv\Scripts\python.exe напрямую. Важно, чтобы pip и python относились к одному окружению.

Создайте бота в BotFather

  1. Откройте в Telegram @BotFather и отправьте /newbot.
  2. Задайте отображаемое имя, затем username, который заканчивается на bot.
  3. Скопируйте выданный токен в защищённое место.

Токен Telegram — это пароль от управления ботом. Его нельзя вставлять в исходный код, коммитить в Git или пересылать в чат. Если токен уже попал в публичное место, в BotFather отзовите его и выпустите новый. Такая мера описана и в руководстве Telegram от BotFather до первого сообщения.

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

export TELEGRAM_BOT_TOKEN="токен_из_BotFather"
export OPENAI_API_KEY="ключ_OpenAI"
export OPENAI_MODEL="gpt-4.1-mini"

В PowerShell:

$env:TELEGRAM_BOT_TOKEN = "токен_из_BotFather"
$env:OPENAI_API_KEY = "ключ_OpenAI"
$env:OPENAI_MODEL = "gpt-4.1-mini"

OPENAI_MODEL оставляет выбор модели настройкой, а не частью логики бота. Перед запуском проверьте в актуальном списке моделей OpenAI, к каким моделям у вашего API есть доступ и какие условия действуют сейчас. При необходимости замените значение переменной, не меняя Python-файл.

Минимальная программа

Сохраните код в файл bot.py:

import asyncio
import logging
import os

from openai import OpenAI
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes, MessageHandler, filters


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

TELEGRAM_BOT_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
MODEL = os.getenv("OPENAI_MODEL", "gpt-4.1-mini")
client = OpenAI()


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text(
        "Привет! Напишите вопрос, и я передам его модели OpenAI."
    )


async def answer(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    question = update.message.text

    try:
        response = await asyncio.to_thread(
            client.responses.create,
            model=MODEL,
            input=question,
        )
        text = response.output_text
        await update.message.reply_text(text or "Модель не вернула текстовый ответ.")
    except Exception:
        logging.exception("OpenAI request failed")
        await update.message.reply_text(
            "Не удалось получить ответ. Проверьте ключ OpenAI, модель и журнал программы."
        )


def main() -> None:
    application = Application.builder().token(TELEGRAM_BOT_TOKEN).build()
    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, answer))
    application.run_polling()


if __name__ == "__main__":
    main()

Здесь OpenAI() сам берёт OPENAI_API_KEY из окружения. В обработчике answer текст сообщения попадает в input, а response.output_text возвращается через reply_text. Вызов API обёрнут в asyncio.to_thread: сетевой запрос не удерживает цикл обработки Telegram, пока модель формирует ответ.

Синтаксис Application.builder(), асинхронных обработчиков и фильтра filters.TEXT & ~filters.COMMAND относится к актуальной ветке python-telegram-bot 22.x; не переносите в этот пример обработчики из старых инструкций для версии 13.x. Вызов client.responses.create и свойство output_text относятся к Responses API; их формы показаны в официальном quickstart OpenAI.

Запуск и проверка

Запустите программу из той же консоли, где заданы переменные:

python bot.py

Перед первым сообщением удобно проверить сам токен Telegram через метод getMe. В Linux или macOS:

curl "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe"

В PowerShell:

curl.exe "https://api.telegram.org/bot$($env:TELEGRAM_BOT_TOKEN)/getMe"

В ответе должен быть JSON с "ok":true, именем и username вашего бота. Не сохраняйте эту команду вместе с токеном в историю команд или скриншот.

Откройте найденного бота в Telegram и пройдите проверку по порядку:

  1. Отправьте /start. Бот должен ответить приветствием.
  2. Отправьте контрольный вопрос, например Назови одну столицу Европы одним словом.
  3. Убедитесь, что в консоли нет traceback, а ответ пришёл в тот же чат.
  4. Если ответ не пришёл, посмотрите журнал процесса: ошибка ключа или доступа к модели относится к OpenAI, а ошибка токена и отсутствие обновлений — к Telegram.

При long polling программа использует getUpdates: пока процесс запущен, он забирает новые обновления сам. Не настраивайте одновременно webhook. По документации Telegram Bot API, при активном webhook getUpdates не работает; webhook — отдельный вариант для сервера с HTTPS, а не второй способ подключения к тому же потоку.

Что важно не перепутать

Этот проект создаёт вашего посредника между Telegram и OpenAI API. Его нельзя называть официальным ChatGPT, обещать ему интерфейс ChatGPT или приписывать тариф ChatGPT: Telegram-бот, код и API оплачиваются и настраиваются отдельно.

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

Следующий этап для рабочего сервиса — вынести процесс на сервер, выбрать webhook или оставить polling с менеджером процессов, добавить ограничения запросов, хранение контекста и обработку мультимедиа. В минимальной проверке это намеренно не используется: сначала убедитесь, что getMe, /start, запрос к Responses API и ответ в Telegram работают по отдельности.

Источники

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