NetrunНа главную

Если что-то не работает

Ошибка terminated by other getUpdates request: что делать

· 5 мин чтения

Коротко

Ошибка terminated by other getUpdates request означает, что за сообщениями бота одновременно пришли две копии с одним и тем же токеном. Telegram отдаёт очередь сообщений только одному получателю, поэтому вторая копия забирает её себе, а первая получает эту ошибку — и наоборот, по кругу, из-за чего бот отвечает через раз или молчит. Чаще всего лишняя копия — это бот, оставшийся запущенным на ноутбуке или на старом сервере, либо проект, опубликованный дважды: нужно остановить все копии, кроме одной. Отдельный случай — когда у бота настроен вебхук, а код при этом опрашивает Telegram: тогда вебхук нужно удалить.

Бот работал, а теперь отвечает через раз или молчит, и в логах повторяется строка terminated by other getUpdates request. Рядом обычно стоит код 409 Conflict и просьба убедиться, что запущена только одна копия бота. Это не поломка вашего кода, не сбой у Telegram и не проблема хостинга: так выглядит спор двух копий одного и того же бота за общую очередь сообщений. Переезд на другой сервер сам по себе ничего не меняет — лишнюю копию всё равно придётся найти и остановить.

Telegram отдаёт новые сообщения только одному получателю. Когда за ними приходит вторая копия с тем же токеном, она забирает очередь себе, а первая получает эту ошибку. Потом первая приходит снова и выбивает вторую — и так по кругу, поэтому часть сообщений теряется и со стороны кажется, что бот отвечает случайно. Ниже — как найти лишнюю копию и что сделать, чтобы это не повторялось.

  1. Остановите бота, запущенного на вашем компьютере#

    Самая частая вторая копия — тот же бот, который остался работать в терминале, во вкладке редактора или в свёрнутом окне на ноутбуке. Закройте окно запуска и остановите процесс в редакторе, а заодно проверьте соседние проекты, открытые рядом: бот мог запуститься из любого из них. Если вы когда-то добавляли бота в автозапуск, он поднимается сам после включения компьютера, и об этом легко забыть.

  2. Проверьте старый сервер и другие места запуска#

    Вторая копия часто живёт там, откуда бота уже «переехали»: старый VPS, аккаунт на другом хостинге, рабочий компьютер, чужая машина, на которой вы показывали бота. Пока тот процесс жив, он продолжает забирать сообщения — сам он не остановится и про переезд не знает. Пройдитесь по всем местам, где бот когда-либо запускался, и выключите его везде, кроме одного.

  3. Убедитесь, что проект опубликован только один раз#

    Бывает, что бот случайно опубликован дважды: первый проект не удалили, а рядом создали второй с тем же токеном от BotFather. Откройте список проектов, найдите дубликат и остановите или удалите его — работать должен один. Если у хостинга есть живые логи и статус проекта, дубликат виден сразу: в логах лишней копии будет ровно та же строка terminated by other getUpdates request.

  4. Удалите вебхук, если бот работает опросом#

    Тот же конфликт возникает, когда у бота настроен вебхук (Telegram сам стучится на ваш адрес), а код при этом опрашивает Telegram методом getUpdates. Текст ошибки в этом случае другой, но код тот же — 409 Conflict. Посмотрите состояние вебхука методом getWebhookInfo и, если он есть, а работать вы хотите опросом, удалите его методом deleteWebhook. Многие библиотеки умеют снимать вебхук сами при старте — достаточно включить нужную настройку.

  5. Перезапустите бота и подождите минуту#

    Когда лишние копии выключены, перезапустите оставшегося бота и дайте ему около минуты. Прошлый запрос к Telegram живёт до своего таймаута, поэтому ошибка может мелькнуть ещё пару раз и пропасть сама — иногда конфликт рождается именно на перезапуске, когда новая копия уже поднялась, а старая ещё не успела остановиться. Если ошибка повторяется и через несколько минут, значит, где-то работает копия, которую вы не нашли, и стоит вернуться к предыдущим шагам.

  6. Заведите отдельного тестового бота для отладки#

    Практичное правило на будущее: рабочий бот живёт в одном месте, а на компьютере вы запускаете отдельного тестового бота со своим токеном. Создайте у BotFather второго бота, назовите его понятно, вроде «мой бот, тест», и держите его токен отдельно от рабочего. После этого локальные эксперименты перестанут выбивать рабочего бота, и конфликт просто некому будет создать.

Ошибка terminated by other getUpdates request почти всегда лечится одним и тем же: сделать так, чтобы за сообщениями приходила ровно одна копия бота. Проще всего этого добиться, когда бот живёт не на ноутбуке, который вы закрываете и открываете, а в одном постоянном месте: в Netrun вы загружаете код, указываете токен от BotFather, и бот работает сам — статус и логи видны в кабинете, поэтому лишнюю копию или перезапуск по кругу заметно сразу. На бесплатном тарифе боту даётся три дня работы, дальше проект выключается, а код, настройки и токен остаются на месте. Локальную отладку при этом переводите на тестового бота с другим токеном. Попробовать Netrun.

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

Что означает error 409 Conflict в ответе Telegram?

Это код, которым Telegram отвечает, когда за сообщениями бота пришли двое сразу. В сообщении рядом с ним написано, что запрос прерван другим запросом getUpdates, и предлагается убедиться, что запущена только одна копия бота. Тот же код 409 приходит и в другом случае — когда у бота настроен вебхук, а код пытается получать сообщения опросом.

Ошибка появилась сразу после публикации бота на хостинге — почему?

Потому что бот на компьютере обычно продолжает работать. Как только копия на сервере начинает получать сообщения, две копии сталкиваются, и в логах появляется terminated by other getUpdates request. Остановите запуск на своей машине — через минуту бот на сервере начнёт отвечать стабильно.

Почему бот отвечает через раз, а не на каждое сообщение?

Так выглядит конфликт двух копий: каждая по очереди забирает очередь сообщений себе, и часть сообщений достаётся той копии, которую вы уже не считаете рабочей. Со стороны это выглядит как случайные ответы и пропущенные команды. Как только останется одна копия, поведение станет ровным.

Можно ли запустить одного бота на двух серверах для надёжности?

Нет, при работе через опрос это не даёт запаса прочности, а ломает бота: копии будут выбивать друг друга и терять сообщения. Один токен — одна работающая копия. Надёжность лучше получать иначе: чтобы бот перезапускался при сбое, разместите его там, где за проектом присматривают и поднимают его обратно.

Как проверить, включён ли у бота вебхук?

У Telegram есть метод getWebhookInfo — он показывает, задан ли адрес для вебхука. Если адрес есть, а вы хотите работать опросом, вебхук снимается методом deleteWebhook. Если же вы, наоборот, хотите остаться на вебхуке, уберите из кода запуск опроса — работать должно что-то одно.

Поможет ли смена токена у BotFather?

Смена токена — крайняя мера, но она работает, когда лишнюю копию физически не достать: например, она осталась на сервере, доступа к которому у вас больше нет. После отзыва старый токен перестаёт действовать вместе со всеми копиями, которые им пользовались. Новый токен нужно будет указать в настройках проекта, иначе бот не запустится.

Можно ли разместить Telegram-бота?

Да. Загрузите код бота и укажите токен от BotFather (его выдаёт сам Telegram при создании бота) — Netrun запустит бота, VPS и ручная настройка не нужны. На бесплатном тарифе бот работает 3 дня, чтобы вы всё проверили; чтобы он работал круглосуточно, подключите тариф Pro.

Где посмотреть логи и статус проекта?

На странице проекта есть статус, логи и история событий — по ним видно, что происходит с проектом прямо сейчас. Лента логов показывает и более ранние строки: пролистайте её вверх, и они подгрузятся сами.

Что будет, если приложение упадёт?

Мы следим за проектами и перезапускаем их при сбое. Если что-то идёт не так, вы видите статус и логи в кабинете и получаете уведомление.

Запустите свой проект

Загрузите код, ответьте на пару вопросов — и получите рабочую ссылку. Есть бесплатный тариф

Попробовать Netrun
Все статьи блога