В этой статье
Собственный 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, в двух предложениях. Последовательность будет такой:
getUpdatesполучает сообщение от Telegram.answer_with_gptпередаёт его какinputвclient.responses.create.response.output_textизвлекает обычный текст без разбора внутренней структуры ответа.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-ботов. Перед оформлением проверьте на странице конкретную услугу и её условия; оплату через СБП используйте только по подтверждённым условиям выбранной карточки.
Источники
- Bots: An introduction for developersTelegram
- Telegram Bot APITelegram
- openai-python READMEOpenAI
- Verifying Communications from OpenAIOpenAI Help Center