В этой статье
Собственный 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 попросит:
- название, которое увидят пользователи;
- 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.
Источники
- Bots: An introduction for developersTelegram
- Telegram Bot APITelegram
- Developer quickstart — OpenAI APIOpenAI
- python-telegram-bot documentationpython-telegram-bot