Разработка ботов
ChatGPT API для Telegram-бота: сервер, ключ и контролируемые ответы
ChatGPT API для Telegram-бота следует подключать через собственный серверный маршрут, а не напрямую из клиента или «секретного» URL. Telegram доставляет событие, ваш backend проверяет его, ограничивает ввод и пользователя, а затем при необходимости вызывает RussiaAPI собственным ключом. Такая схема не обещает доступность конкретной модели и не обходит правила Telegram, производителей моделей, платёжных систем или применимое право. Зато она позволяет контролировать секреты, очередь, стоимость и ошибки.
RUSSIAAPI_API_KEY на сервере. Не передавайте внешние ключи, cookie, пароли, коды подтверждения или персональные данные и соблюдайте применимые требования и правила поставщиков.Разделите Telegram, backend и AI API
Бот — это интерфейс доставки сообщений, а не место для ключа AI API. Telegram webhook принимает только ваш backend; backend проверяет секрет маршрута, извлекает безопасный текст, применяет лимит, создаёт внутреннюю операцию и уже затем вызывает RussiaAPI. Пользователь получает краткий результат или честное сообщение о задержке. Ключ RussiaAPI не должен попадать в JavaScript страницы, код бота на устройстве, текст чата, логи webhook или репозиторий.
Не путайте bot token Telegram и ключ AI API: это разные секреты с разными рисками и ротацией. Не передавайте ни один из них в поддержку, таблицу или скриншот. Для диагностики храните безопасный event ID, внутренний operation ID, статус и длительность. Если нужно сравнить ключи по средам и владельцам, используйте практику из статьи о командных API-ключах.
Выберите webhook и обработайте повтор доставки
Webhook обычно удобнее polling для production-бота: сервер получает событие, когда оно появилось, и может быстро подтвердить приём. Но webhook может быть доставлен повторно или прийти после сетевой задержки. Поэтому обработчик должен быть идемпотентным по устойчивому идентификатору события: сначала запишите факт приёма, затем создайте одну операцию. Повторное событие должно вернуть безопасный успех без второго вызова AI API.
Ответ боту не обязан ждать генерацию в том же HTTP-запросе. Если задача занимает время, быстро подтвердите webhook, положите работу в очередь и обновите сообщение, когда результат готов. Для видео или других асинхронных операций не создавайте дубликат по тайм-ауту: сначала сохраните task ID и проверьте статус. Общие правила очереди есть в материале о задачах и callback.
Ограничьте вход до вызова модели
Определите допустимые команды, максимальную длину сообщения, типы вложений, язык ошибок и отдельные лимиты для пользователя и чата. Не отправляйте в модель весь update от Telegram: в нём есть метаданные, которые не нужны для ответа. Извлекайте только нужный текст, нормализуйте пробелы, отклоняйте пустые и слишком большие сообщения, а вложения обрабатывайте отдельным явным маршрутом.
Пользовательский текст и пересланный контент — недоверенный ввод. Он может содержать инструкции «игнорировать правила», ссылки, персональные данные или попытку вызвать инструмент. Системная политика backend-а должна быть сильнее содержимого сообщения. Если бот вызывает инструменты, сервер валидирует каждый аргумент и никогда не исполняет произвольный код, URL, SQL или команду, предложенную моделью.
Пример безопасного серверного обработчика
Пример ниже показывает порядок действий: минимальная проверка event ID, короткий текст, собственный ключ только из окружения и явный тайм-аут. Он не содержит реальный ключ и не является готовой библиотекой Telegram. В production добавьте проверку webhook secret по документации Telegram, постоянное хранилище идемпотентности, аутентификацию администраторов и политику данных.
const seenEvents = new Set(); // Replace with durable storage in production.
export async function handleTelegramUpdate(update, sendMessage) {
const eventId = String(update.update_id || '');
const text = String(update.message?.text || '').trim();
if (!eventId || seenEvents.has(eventId)) return { duplicate: true };
seenEvents.add(eventId);
if (!text || text.length > 2000) return sendMessage('Отправьте текст до 2000 символов.');
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 15_000);
try {
const response = await fetch('https://russiaapi.com/v1/chat/completions', {
method: 'POST', signal: controller.signal,
headers: { 'content-type': 'application/json', authorization: `Bearer ${process.env.RUSSIAAPI_API_KEY}` },
body: JSON.stringify({ model: process.env.RUSSIAAPI_BOT_MODEL, messages: [{ role: 'user', content: text }] })
});
if (!response.ok) throw new Error(`ai_api_${response.status}`);
const data = await response.json();
return sendMessage(String(data.choices?.[0]?.message?.content || 'Нет текстового ответа.'));
} finally { clearTimeout(timer); }
}Не логируйте заголовки, токен бота или body целиком. Если запрос к AI API завершается ошибкой, пользователю достаточно нейтрального сообщения и внутреннего operation ID для поддержки. Не показывайте ему upstream-детали, ключ, полный prompt или конфигурацию маршрута.
Лимиты, очередь и стоимость
Ограничение частоты — часть продукта, а не наказание. Разделите короткий burst-лимит, лимит одновременных операций и общий дневной бюджет. При перегрузке сначала поставьте работу в очередь либо предложите повторить позднее, а не запускайте бесконечные параллельные вызовы. HTTP 429 означает, что клиенту следует замедлиться и применить ограниченный backoff; он не даёт права менять ключ, URL или пытаться обходить ограничения.
Считайте расход по успешной операции бота: один пользовательский вопрос может породить retry, отмену или невалидный ответ. Сохраняйте только агрегированные usage-поля, статус и модель из разрешённой конфигурации. Практика очереди и 429 описана в руководстве о лимитах параллельных запросов, а бюджет — в материале о мониторинге стоимости.
Память диалога и персональные данные
Не храните всю переписку «на всякий случай». Для каждого сценария определите, нужна ли память, какова минимальная длина истории, кто имеет доступ и когда данные удаляются. Если достаточно контекста нескольких реплик, не добавляйте профиль пользователя, список чатов или пересланные сообщения. Перед обработкой чувствительных данных оцените применимые требования и собственную политику; эта статья не заменяет юридическую консультацию.
Логи и аналитика часто создают большую утечку, чем сама модель. Маскируйте идентификаторы, исключайте токены, ключи, текст сообщений и вложения, ограничивайте retention. Для поиска ошибки связывайте события через безопасный operation ID и request ID при наличии. Подробный список полей — в руководстве по логам без утечек.
Проверка перед запуском
Сначала протестируйте бота на тестовом чате и синтетических сообщениях: обычный вопрос, пустой ввод, превышение длины, повтор webhook, timeout, 429, отмена и невалидный формат ответа. Проверьте, что при перезапуске воркера задача не исчезает и не отправляется дважды. Если модель недоступна для проекта, покажите понятную ошибку вместо фиктивного ответа.
В production включайте новую функцию постепенно и измеряйте долю успешных операций, время ожидания, ошибки и бюджет. Не обещайте пользователям «всегда доступный ChatGPT» или официальную интеграцию. RussiaAPI — сторонний gateway; доступность и функции нужно сверять в текущем каталоге и документации до каждой значимой смены конфигурации.
Чек-лист Telegram-бота
- Webhook принимает backend, а не клиент; event ID защищает от повторной доставки.
- Bot token и ключ RussiaAPI разделены, хранятся server-side и не попадают в логи.
- В модель отправляется минимальный нормализованный ввод с лимитом длины.
- Очередь, timeout, 429 и отмена имеют явное поведение без бесконечных retry.
- История и телеметрия минимизированы, а пользователю не раскрываются секреты и детали upstream.
Такой бот остаётся управляемым при росте нагрузки и не делает непроверяемых обещаний о моделях, правилах или доступности.
Проверьте сценарий в RussiaAPI
Создайте собственный тестовый ключ в консоли, сверьте текущий каталог моделей и начните с обезличенного server-side smoke test. Расширяйте доступ и нагрузку только после измеримой проверки.
FAQ
Можно ли подключить ключ AI API прямо в Telegram-бот?
Нет. Ключ AI API и token Telegram должны храниться только на сервере или в защищённом runtime-хранилище. Клиентский код, чат, репозиторий и логи webhook не подходят для секретов. Для обычной интеграции используйте собственный ключ RussiaAPI; не запрашивайте ключи, cookie, пароли или коды других сервисов.
Зачем нужна идемпотентность webhook?
Доставка события может повториться после сетевой проблемы или перезапуска. Без устойчивого event ID бот способен дважды вызвать модель, списать бюджет и отправить два ответа. Сохраните факт обработки в надёжном хранилище, создайте одну внутреннюю операцию и безопасно игнорируйте повторную доставку.
Нужно ли сохранять всю историю переписки бота?
Не обязательно и часто нежелательно. Храните только минимальный контекст, который нужен конкретному сценарию, с определённым сроком и доступом. Не используйте логи как бесконечную память: исключайте текст сообщений, ключи, токены и лишние персональные данные, если они не требуются для безопасной работы.