botdepobotdepoВсе статьи

2 октября 2026 г.

Conflict: terminated by other getUpdates request — что это и как исправить

Бот то отвечает, то замолкает, а в логах — telegram.error.Conflict: terminated by other getUpdates request (или просто "error_code": 409 в ответе API). Код не менялся, токен тот же, но что-то мешает боту забирать обновления.

Что значит эта ошибка

Telegram Bot API разрешает только одному процессу одновременно держать активный long-polling (getUpdates) на один и тот же токен. Как только появляется второй процесс с тем же токеном, Telegram обрывает более раннее соединение и отдаёт ему 409 Conflict — а не делит обновления между обоими. В логе это обычно видит именно «проигравший» процесс, так что эффект выглядит случайным: то работает, то нет, в зависимости от того, какой из двух процессов успел опросить API последним.

Быстрая диагностика

Сначала убедитесь, что вебхук не включён параллельно с polling — это тоже даёт конфликт того же рода:

curl "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"

Пустой url в ответе значит, что бот работает через polling — тогда ищите второй polling-процесс. Непустой — значит, где-то в коде всё ещё вызывается getUpdates при включённом вебхуке, и конфликтуют они друг с другом.

Дальше — найти, где именно запущен второй процесс с тем же токеном:

ps aux | grep -i <имя_вашего_скрипта>

Причины по убыванию вероятности

  1. Бот одновременно крутится локально для отладки и на сервере — самый частый случай.
  2. Старый деплой не остановлен перед запуском нового: два контейнера/процесса с одним токеном какое-то время работают параллельно.
  3. Включён вебхук, и в коде одновременно где-то остался вызов getUpdates (или наоборот).
  4. Второй участник команды запустил бота с тем же токеном у себя для теста.

Как исправить руками

  1. Проверьте getWebhookInfo (команда выше) — определите, polling у вас или вебхук.
  2. Остановите все процессы бота — локальные, на сервере, тестовые — и запустите только один.
  3. Если переключаетесь с polling на вебхук, явно снимите старый режим: curl "https://api.telegram.org/bot<TOKEN>/deleteWebhook" перед тем, как снова включать polling.
  4. При деплое следите, чтобы процесс останавливался до запуска нового, а не после — иначе на несколько секунд всегда будут жить оба.
  5. Заведите разработчикам отдельные тестовые токены через @BotFather — тестовый бот не должен делить токен с продовым.

Или без всего этого

В botdepo это решено на уровне деплоя и супервизора: перед запуском нового контейнера старый гарантированно останавливается, а если конфликт всё же возникает (например, вы сами запустили бота локально с тем же токеном), супервизор отличает его от обычного падения, помечает бота статусом «конфликт» и сразу присылает алерт в Телеграм с объяснением — вместо того, чтобы тихо дёргать рестарт, который здесь не поможет. Задеплоить бота.

Частые вопросы

Поможет ли просто перезапустить бота?

Нет, пока жив второй процесс с тем же токеном — конфликт вернётся при следующем опросе API.

Можно ли на один токен держать два процесса специально, для отказоустойчивости?

Нет — Bot API так не работает ни для polling, ни для webhook. Отказоустойчивость нужно строить на уровне супервизора/оркестратора, который держит ровно один активный процесс, а не на дублировании.