В этой статье
Собственный GPT-бот в Telegram — это связка из двух API: Telegram принимает сообщение и показывает ответ, а OpenAI обрабатывает текст. Такой бот не становится официальным ChatGPT и не копирует его интерфейс или тариф. Зато вы управляете кодом, выбранной моделью и тем, что происходит с сообщением.
Ниже — минимальный запуск на Python 3.11+ и ветке python-telegram-bot 22.x. Для первого теста используется long polling: программа сама получает новые сообщения через Bot API, поэтому локально не нужны домен и HTTPS.
Что понадобится
Подготовьте Python 3.11 или новее и отдельный каталог проекта. Создайте виртуальное окружение:
python -m venv .venv
В Windows активируйте его командой .\.venv\Scripts\Activate.ps1 (PowerShell), в macOS и Linux — source .venv/bin/activate. Установите зависимости:
python -m pip install "python-telegram-bot>=22,<23" openai
Модель в примере намеренно не зашита. Список доступных моделей, стоимость и лимиты меняются, а доступность зависит от проекта API. Перед запуском выберите модель в актуальной документации OpenAI и укажите её имя в OPENAI_MODEL.
Создайте бота в BotFather
Откройте в Telegram @BotFather, отправьте /newbot и пройдите два шага: задайте имя для отображения и username, который заканчивается на bot. В ответ BotFather выдаст токен.
Токен Telegram — это пароль для управления ботом. Не вставляйте его в Python-файл, Git, скриншот или сообщение. Если токен уже утёк, отзовите его через BotFather и выпустите новый. Такой порядок создания и отзыва описан в инструкции Telegram.
Сохраните username, чтобы найти своего бота в Telegram. Сам токен понадобится только как значение переменной окружения.
Задайте секреты в окружении
В той же сессии терминала задайте TELEGRAM_BOT_TOKEN, OPENAI_API_KEY и OPENAI_MODEL. Последняя переменная содержит название доступной вам модели.
В macOS и Linux:
export TELEGRAM_BOT_TOKEN='токен-от-BotFather'
export OPENAI_API_KEY='ключ-OpenAI'
export OPENAI_MODEL='модель-из-актуальной-документации'
В PowerShell:
$env:TELEGRAM_BOT_TOKEN = 'токен-от-BotFather'
$env:OPENAI_API_KEY = 'ключ-OpenAI'
$env:OPENAI_MODEL = 'модель-из-актуальной-документации'
Это значения-заполнители. Не добавляйте реальные ключи в репозиторий. Если храните настройки в .env, подключите библиотеку для его загрузки и внесите .env в .gitignore; для первого запуска достаточно переменных текущей сессии.
Напишите минимальный обработчик
Создайте файл bot.py:
import asyncio
import os
from openai import OpenAI
from telegram import Update
from telegram.ext import (
Application,
ApplicationBuilder,
CommandHandler,
ContextTypes,
MessageHandler,
filters,
)
TELEGRAM_BOT_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
OPENAI_MODEL = os.environ["OPENAI_MODEL"]
openai_client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
async def on_startup(application: Application) -> None:
me = await application.bot.get_me()
print(f"Telegram connection: @{me.username}")
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if update.message:
await update.message.reply_text(
"Готово. Напишите вопрос, и я передам его модели."
)
def split_text(text: str, size: int = 4000) -> list[str]:
return [text[i : i + size] for i in range(0, len(text), size)]
async def answer(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if not update.message or not update.message.text:
return
try:
response = await asyncio.to_thread(
openai_client.responses.create,
model=OPENAI_MODEL,
input=update.message.text,
)
text = (response.output_text or "").strip()
except Exception as error:
# В лог попадает только тип ошибки, без секретов и текста ключей.
print(f"OpenAI request failed: {type(error).__name__}")
await update.message.reply_text(
"Не удалось получить ответ модели. Проверьте ключ, модель и лимит API."
)
return
if not text:
await update.message.reply_text("Модель вернула пустой ответ.")
return
for part in split_text(text):
await update.message.reply_text(part)
def main() -> None:
application = (
ApplicationBuilder()
.token(TELEGRAM_BOT_TOKEN)
.post_init(on_startup)
.build()
)
application.add_handler(CommandHandler("start", start))
application.add_handler(
MessageHandler(filters.TEXT & ~filters.COMMAND, answer)
)
application.run_polling()
if __name__ == "__main__":
main()
После запуска в терминале появится только username, полученный через getMe, и безопасное имя типа ошибки. Токены в коде не печатаются. Официальный Python SDK OpenAI использует вызов client.responses.create, а готовый текст берётся из response.output_text; этот маршрут показан в официальном quickstart OpenAI. ApplicationBuilder относится к актуальной документации python-telegram-bot 22.x.
Вызов OpenAI вынесен в asyncio.to_thread, поэтому ожидание ответа не блокирует цикл Telegram. split_text отправляет длинный ответ частями с запасом до ограничения Telegram в 4096 символов после разбора entities.
Запустите и отправьте первое сообщение
В активном окружении выполните:
python bot.py
В терминале должна появиться строка вида Telegram connection: @имя_бота. Это успешный вызов getMe. Найдите бота по username, нажмите Start или отправьте /start: бот должен ответить приветствием.
Затем отправьте: Объясни в двух предложениях, что такое long polling. Текст попадёт в answer, уйдёт в Responses API, а непустой output_text вернётся в тот же chat_id. Так выглядит первый рабочий цикл «Telegram → OpenAI → Telegram».
Если ответа нет
Сначала посмотрите на окно, где запущен bot.py.
- Ошибка о переменной окружения означает, что одна из трёх переменных не задана в этой же сессии терминала.
- Ошибка авторизации OpenAI обычно указывает на неверный или отозванный ключ. Проверьте его в кабинете API, не вставляя ключ в переписку или лог.
- Ошибка о модели означает, что значение
OPENAI_MODELнедоступно вашему проекту. Сверьте точное имя и доступность в текущей документации OpenAI. - Если
/startне приходит, проверьте username бота и убедитесь, что вторая копия программы не запущена.
Telegram получает обновления либо через getUpdates (long polling), либо через webhook — эти режимы взаимоисключающие. Если для бота уже настроен webhook, удалите его перед локальным тестом:
curl "https://api.telegram.org/bot<TELEGRAM_BOT_TOKEN>/deleteWebhook"
Подставляйте токен только в локальную команду и не сохраняйте её в истории или скриншотах. Для webhook позже понадобится HTTPS-адрес. О режимах получения обновлений и ограничении длины sendMessage можно свериться с Telegram Bot API.
Свой бот или готовый сервис
Этот пример подходит, если вы хотите владеть интеграцией: создать бота, оплачивать запросы OpenAI API и менять код под свою задачу. Он не превращает посредника в официальный ChatGPT.
Если нужен готовый доступ к ChatGPT без разработки Telegram-интеграции, отдельно посмотрите каталог AI-сервисов и подписок Amber Market. В нём есть карточка ChatGPT с вариантами Go, Plus и Pro — это подписка ChatGPT, а не пополнение OpenAI API и не созданный по этой инструкции Telegram-бот. Перед заказом проверьте актуальные условия и итоговую сумму; магазин подтверждает оплату через СБП.
Для расширенного рабочего варианта интеграции можно открыть подробную инструкцию по Telegram-боту на Python.
Что добавить следующим этапом
Когда минимальный бот стабильно отвечает, добавьте хранение контекста диалога, обработку ошибок и ограничение частоты запросов. Затем пригодятся webhook и HTTPS для постоянного запуска на сервере. База данных, платежи, группы, голосовые сообщения и изображения — отдельные задачи: подключайте их после проверки базового текстового сценария.
Источники
- Telegram Bot APITelegram
- From BotFather to Hello WorldTelegram
- python-telegram-bot documentationpython-telegram-bot project
- Developer quickstart — OpenAI APIOpenAI