<!-- Bothost docs | HTML: https://bothost.ru/docs/bot-not-responding | Markdown: https://bothost.ru/docs/bot-not-responding.md | Index: https://bothost.ru/llms.txt -->

# Бот не отвечает: Conflict getUpdates, неверный токен, Discord offline

Бот на Bothost в статусе running, а в Telegram или Discord тишина. Ниже разбор по тексту ошибки в логах: два разных Conflict, Unauthorized, aiogram, который молчит без исключения, и Discord, который серый в списке участников.

> **Для людей и ИИ.** Каноническая страница: https://bothost.ru/docs/bot-not-responding · Markdown: https://bothost.ru/docs/bot-not-responding.md · Индекс: https://bothost.ru/llms.txt
> Отвечает на запросы: Telegram bot stopped working, bot doesn't respond, Conflict: terminated by other getUpdates request, can't use getUpdates method while webhook is active, aiogram bot doesn't respond, bot token invalid, Unauthorized, Discord bot offline, close code 4004, 4014.
> Если контейнер в статусе restarting или exited, откройте [падение после деплоя](works-locally-fails-on-server). Если webhook уже установлен и в getWebhookInfo есть last_error_message, откройте [ошибки webhook](telegram-webhook-errors).

---

## С чего начать

Откройте карточку бота в панели Bothost и посмотрите две вещи: статус контейнера и **логи работы** (не логи сборки).

| Статус и строка в логе | Куда идти |
|---|---|
| `running`, в логе нет ошибок, в мессенджере тишина | Раздел про aiogram ниже или [webhook](telegram-webhook-errors) |
| `Conflict: terminated by other getUpdates request` | Два процесса читают один токен |
| `Conflict: can't use getUpdates method while webhook is active` | На токене висит webhook, а код запустил polling |
| `Unauthorized` или `401` | Токен не принимается Telegram или Discord |
| `restarting`, `exited`, traceback на старте | [Падение после деплоя](works-locally-fails-on-server) |
| Discord серый, в логе `4004` или `4014` | Раздел Discord ниже |
| `Too Many Requests` / `429` или `TimeoutError` при живом процессе | [Память, таймауты и лимиты](bot-memory-timeout-rate-limits) |

Платформа кладёт токен из панели в переменные окружения. Для Telegram это `BOT_TOKEN`, `API_TOKEN` и `TELEGRAM_BOT_TOKEN` (одно и то же значение). Для Discord это `DISCORD_BOT_TOKEN`. Код должен читать именно эти имена, а не файл `.env` с компьютера: в Git его обычно нет, в контейнер он не попадает. Список переменных: [переменные окружения](environment-variables).

Проверка токена Telegram в браузере (подставьте значение из панели, без слова `bot` в начале):

```text
https://api.telegram.org/bot<ТОКЕН>/getMe
```

Ответ `{"ok":true,...}` значит, что токен живой. `{"ok":false,"error_code":401,"description":"Unauthorized"}` значит, что строка токена неверная.

---

## Conflict: terminated by other getUpdates request

### Как выглядит

В логах работы снова и снова:

```text
Conflict: terminated by other getUpdates request; make sure that only one bot instance is running
```

Контейнер при этом часто остаётся `running`. Бот то отвечает, то замолкает, потому что Telegram на каждый новый `getUpdates` обрывает предыдущий.

### Почему так на Bothost

Long polling (`getUpdates`) у одного токена может держать только один клиент. Второй клиент с тем же токеном получает Conflict, и оба начинают переподключаться.

Обычные источники второго клиента:

1. Тот же бот всё ещё запущен на компьютере, в IDE, в screen или в другом Docker.
2. На Bothost два бота (или старый контейнер и новый после деплоя) с одним и тем же токеном.
3. Рестарт совпал со старым процессом: новый уже вызвал `getUpdates`, предыдущий ещё не вышел.
4. Где-то ещё крутится копия: второй хостинг, скрипт на VPS, тестовый процесс коллеги.

Webhook тут ни при чём. Если в тексте есть `while webhook is active`, это следующий раздел.

### Что сделать

1. Остановите локальный процесс. Закройте терминал, где запущен `python bot.py` или `node index.js`.
2. В панели Bothost оставьте один бот с этим токеном. Второй удалите или смените ему токен в BotFather и в панели.
3. Нажмите остановку, подождите, пока статус станет остановленным, затем запустите снова. Так старый процесс успевает отпустить `getUpdates`.
4. Откройте `https://api.telegram.org/bot<ТОКЕН>/getWebhookInfo`. Поле `url` должно быть пустым `""`, если бот работает через polling. Если `url` заполнен, смотрите следующий раздел: polling и webhook на одном токене мешают друг другу.

Отдельно библиотеку обновлять не нужно. Когда второй клиент исчез, Conflict пропадает за один-два цикла переподключения.

---

## Conflict: can't use getUpdates method while webhook is active

### Как выглядит

```text
Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first
```

### Почему так

На токене уже вызван `setWebhook`. Telegram перестаёт отдавать апдейты через `getUpdates` и шлёт их HTTP-запросом на сохранённый URL. Код на Bothost при этом вызывает `start_polling` / `getUpdates`.

Так бывает, если раньше бот работал через webhook (на своём сервере или на Bothost с доменом), а теперь запущен как polling, и webhook никто не снял. В aiogram 3 `Dispatcher.start_polling` сам вызывает `delete_webhook` перед циклом. Если ошибка всё равно есть, второй процесс снова делает `setWebhook`, либо используется библиотека, которая webhook не снимает (старый `python-telegram-bot` без `drop_pending_updates` / явного `delete_webhook`, самописный цикл `getUpdates`).

Платформа Bothost сама `setWebhook` в Telegram не вызывает. Она только передаёт в контейнер переменную `WEBHOOK_URL` вида `https://ваш-домен/webhook`, если у бота включён домен. Если код при старте читает `WEBHOOK_URL` и регистрирует webhook, а процесс одновременно уходит в polling, получается эта ошибка.

### Что сделать

Выберите один режим и оставьте его.

**Polling** (бесплатный тариф, бот без своего HTTP-сервера):

```text
https://api.telegram.org/bot<ТОКЕН>/deleteWebhook
```

В ответе должно быть `{"ok":true,"result":true,"description":"Webhook is already deleted"}` или `Webhook was deleted`. После этого перезапустите бота в панели. В коде не вызывайте `set_webhook` на старте.

**Webhook:** уберите `start_polling` / цикл `getUpdates` и примите POST на свой URL. Разбор 404, SSL и пустого `last_error_message`: [Webhook Telegram не работает](telegram-webhook-errors).

---

## Unauthorized: bot token invalid

### Как выглядит

```text
Unauthorized
aiogram.exceptions.TelegramUnauthorizedError: Telegram server says - Unauthorized
```

`getMe` возвращает `error_code` 401. В Discord тот же смысл у закрытия шлюза с кодом `4004`.

### Почему токен «тот же», а API его отвергает

В переменную должен попасть токен вида `123456789:AAH...` без кавычек, пробелов и без префикса `bot`. Префикс `bot` уже есть в URL метода (`/bot<ТОКЕН>/getMe`). Строка `bot123456:AAH...` даёт 401.

Другие частые причины на Bothost:

- Токен перевыпустили в BotFather (или в Discord Developer Portal), а в панели осталось старое значение. Новый деплой кода токен в панели не обновляет.
- Код читает `os.getenv("TOKEN")`, `os.getenv("TG_TOKEN")` или `config.BOT_TOKEN` из репозитория, а панель заполняет `BOT_TOKEN`. Переменная есть, код смотрит в другое имя и получает `None`, затем падает или шлёт пустой токен.
- В значение в панели попали кавычки из `.env` (`"123:ABC"` вместе с кавычками) или перевод строки в конце при копировании.
- Токен от другого бота: в BotFather несколько ботов, в панель вставлен не тот.

### Что сделать

1. В BotFather откройте нужного бота и при необходимости выполните `/revoke`, затем скопируйте новую строку целиком.
2. В настройках бота на Bothost замените токен и перезапустите контейнер.
3. В коде читайте переменную платформы и обрезайте пробелы:

```python
import os
from aiogram import Bot, Dispatcher

token = os.environ["BOT_TOKEN"].strip()
bot = Bot(token)
dp = Dispatcher()
```

Для node-telegram-bot-api и telegraf то же самое: `process.env.BOT_TOKEN`.

4. Снова откройте `getMe`. Пока там 401, смотреть хендлеры и webhook бессмысленно: Telegram не примет ни один метод.

---

## aiogram bot doesn't respond

Контейнер `running`, в логе нет Conflict и Unauthorized, сообщения в чат уходят в пустоту.

Проверьте по порядку.

**Режим получения апдейтов.** Если в `getWebhookInfo` поле `url` непустое, polling апдейты не получит (см. Conflict выше). Если `url` пустой и в логе есть `Run polling for bot @name`, процесс ждёт `getUpdates`. Напишите боту в личку и посмотрите, появилась ли в логе строка обработки. Тишины в логе на ваше сообщение значит, что апдейт до процесса не дошёл: другой клиент забрал его раньше, либо бот заблокирован, либо вы пишете не тому @username (`getMe` показывает поле `username`).

**Фильтры уже, чем сообщения.** Хендлер на `CommandStart` молчит на текст без `/start`. Фильтр `F.chat.type == "private"` молчит в группе. В `start_polling(..., allowed_updates=[...])` нет `"message"`, и такие апдейты библиотека не получает. На время проверки оставьте один хендлер без фильтра и убедитесь, что он пишет в лог `update_id`.

**Исключение внутри хендлера.** aiogram пишет traceback в лог и не показывает его пользователю. Бот «не отвечает», хотя апдейт пришёл. Ищите в логах работы `Cause exception while process update` и чините строку из traceback. Пустой `BOT_TOKEN` сюда не относится: процесс тогда не доходит до polling и падает на старте, см. [падение после деплоя](works-locally-fails-on-server).

**Ответ уходит не в тот чат или метод запрещён.** `bot was blocked by the user` и `chat not found` появляются в момент `send_message`, а не в момент входящего сообщения. Для группы бот должен быть участником и иметь право писать.

Минимальный рабочий каркас под Bothost (aiogram 3, polling, токен из панели):

```python
import asyncio
import logging
import os

from aiogram import Bot, Dispatcher
from aiogram.types import Message

logging.basicConfig(level=logging.INFO)
dp = Dispatcher()

@dp.message()
async def echo(message: Message) -> None:
    logging.info("update chat_id=%s text=%s", message.chat.id, message.text)
    await message.answer("ok")

async def main() -> None:
    bot = Bot(os.environ["BOT_TOKEN"].strip())
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())
```

`start_polling` в aiogram 3 перед циклом снимает webhook. Если рядом в коде есть `set_webhook`, оставьте что-то одно.

---

## Discord bot offline

В списке участников бот серый, хотя контейнер на Bothost `running`. Шлюз Discord (Gateway) для одного токена держит одну сессию. Второй клиент с тем же токеном выталкивает первый: бот мигает онлайн и снова становится offline. Остановите локальный процесс и второй деплой с этим токеном, как в разделе про `getUpdates`.

Дальше смотрите код закрытия соединения в логе.

| Код | Смысл | Что сделать |
|---|---|---|
| `4004` Authentication failed | Токен не принят | Вставьте токен из Developer Portal в поле бота на Bothost. Код читает `DISCORD_BOT_TOKEN`. Без префикса `Bot `, без кавычек. После Reset Token обновите значение в панели и перезапустите контейнер |
| `4014` Disallowed intent | В коде запрошены privileged intents, которые выключены в портале, или наоборот | В портале приложения, Bot, Privileged Gateway Intents включите Message Content, если бот читает текст сообщений. В коде передайте те же intents, которые включены в портале |
| `4008` Rate limited | Шлюз закрыли из-за частых Identify | Уберите цикл немедленного реконнекта. Подождите и запустите один процесс. Подробнее: [лимиты API](bot-memory-timeout-rate-limits) |
| `4005` Already authenticated | Повторный Identify в том же соединении | Один клиент на токен, без второго `client.login` в том же процессе |

Бот онлайн на шлюзе и при этом «не видит» сервер, если приглашение собрано без scope `bot`. Ссылка приглашения должна запрашивать scope `bot` и нужные права. Шлюз при этом в логе выглядит здоровым: гильдий просто нет.

Каркас на discord.py, токен с Bothost:

```python
import os
import discord

intents = discord.Intents.default()
intents.message_content = True  # тот же флаг включите в Developer Portal
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f"logged in as {client.user}")

@client.event
async def on_message(message: discord.Message):
    if message.author == client.user:
        return
    if message.content == "ping":
        await message.channel.send("pong")

client.run(os.environ["DISCORD_BOT_TOKEN"].strip())
```

---

## Telegram bot stopped working

Бот отвечал и перестал. Контейнер при этом либо остался `running`, либо ушёл в перезапуск.

1. Логи работы за момент, когда перестал отвечать. Conflict, 401, traceback, `Killed`, `429` указывают на свой раздел этой статьи или соседних мануалов.
2. `getMe` и `getWebhookInfo` тем токеном, который сейчас в панели. Токен могли перевыпустить. Webhook мог остаться на старом домене после смены адреса на Bothost: Telegram продолжает слать апдейты на прежний URL, а polling их уже не видит.
3. Один токен на один процесс. Локальная копия, которую вы открыли «просто посмотреть», забирает апдейты у сервера.
4. Если статус `restarting`, бот падает на старте или его убивает лимит памяти. Это [деплой](works-locally-fails-on-server) и [память](bot-memory-timeout-rate-limits), а не молчащий хендлер.

---

## См. также

- [Webhook Telegram: 404, SSL, апдейты не доходят](telegram-webhook-errors)
- [Локально работает, на сервере падает](works-locally-fails-on-server)
- [Память, timeout и 429](bot-memory-timeout-rate-limits)
- [Переменные окружения](environment-variables)
- [Справочник ошибок при деплое](common-errors)

**Не нашли свою строку в логе?** Напишите в поддержку и приложите её целиком: [@bothostru](https://t.me/bothostru).
