В этой статье
Если нужен именно свой 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
- Откройте в Telegram @BotFather и отправьте
/newbot. - Задайте отображаемое имя, затем username, который заканчивается на
bot. - Скопируйте выданный токен в защищённое место.
Токен 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 и пройдите проверку по порядку:
- Отправьте
/start. Бот должен ответить приветствием. - Отправьте контрольный вопрос, например
Назови одну столицу Европы одним словом. - Убедитесь, что в консоли нет traceback, а ответ пришёл в тот же чат.
- Если ответ не пришёл, посмотрите журнал процесса: ошибка ключа или доступа к модели относится к 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 Bot APITelegram
- From BotFather to Hello WorldTelegram
- python-telegram-bot documentationpython-telegram-bot project
- Developer quickstart — OpenAI APIOpenAI