Перейти к содержанию
9 минут чтения
Тема: Диагностика Telegram Bot API · PHP · Группы

Telegram-бот не видит сообщения в группе: Privacy Mode, команды и права

В личном чате бот отвечает на /help, а после добавления в группу не реагирует ни на команду, ни на обычный текст. Начнём с проверки, какое сообщение Telegram должен передать именно этому боту, и проследим его до обработчика.

Сначала отправьте человеком команду /help@username_вашего_бота в своей тестовой группе. Проверьте получение message.text до фильтров приложения. Обычный текст при включённом Privacy Mode может не поступать — это штатное поведение Telegram.

Начните с команды, адресованной боту

Уточните username через getMe или профиль бота. В группе отправьте /help@DemoSupportBot, подставив настоящий username без лишнего @. Имя команды должно поддерживаться вашим приложением; /help здесь служит примером.

Отправляйте сообщение со своего пользовательского аккаунта. В проверенном обработчике временно фиксируйте update_id, message.chat.id и наличие message.text. Не записывайте токен, весь Update или содержимое переписки в публичный журнал.

Если адресованная команда дошла, транспорт уже передал этот тип события: дальше проверяйте маршрутизацию и ответ приложения. Если бот получил сообщение, но не отправил ответ, это отдельная проблема; проверьте результат sendMessage и право писать в чат.

Команда /help без @username — менее надёжный диагностический тест: при Privacy Mode получение общих команд зависит от контекста, в том числе от того, какой бот последним отправлял сообщение. Служебное сообщение о добавлении участника тоже не доказывает получение обычного текста.

Какие сообщения доступны при Privacy Mode

Privacy Mode ограничивает входящие сообщения в группах. При включённом режиме Telegram передаёт боту адресованные команды, предназначенные ему ответы и другие предусмотренные режимом события. Обычный разговор участников целиком боту не передаётся.

Бот с правами администратора получает сообщения группы шире, чем обычный участник с включённым Privacy Mode. Отключённый режим также позволяет получать обычные сообщения. Выдавать административные права только ради проверки не требуется.

Сообщения от других ботов проверяйте отдельно: у Telegram есть опциональный Bot-to-Bot Communication Mode со своими правилами. Для базовой диагностики достаточно сообщения от человека.

Официальные правила Privacy Mode и общения ботов

Проверьте бота и настройку через getMe

Следующие команды рассчитаны на Bash с curl: Linux, WSL или Git Bash. Используйте токен своего тестового бота. Ввод скрыт, URL передаётся curl через стандартный ввод. Не включайте shell tracing или подробный вывод curl: токен входит в URL.

group-check.sh
read -r -s -p 'Токен вашего тестового бота: ' TELEGRAM_BOT_TOKEN
printf '\n'

telegram_check() {
  curl --silent --show-error --connect-timeout 5 --max-time 15 \
    --request POST --header 'Content-Type: application/json' \
    --data "$2" --config - <<EOF
url = "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/$1"
EOF
  printf '\n'
}

telegram_check getMe '{}'

В успешном ответе ok=true сохраните result.id и result.username. can_read_all_group_messages=true означает, что Privacy Mode отключён. Отсутствие этого необязательного поля не подтверждает отключение режима.

Поле описывает настройку бота, а не членство и административные права в конкретной группе. Даже при отсутствии can_read_all_group_messages бот может быть администратором группы.

Проверьте участие и права в конкретной группе

Возьмите chat_id из настоящего обновления своей группы. В user_id подставьте ID самого бота из getMe; это не ID вашего аккаунта и не публичный ID BotGate. В примере ниже оба числа нужно заменить.

Bash: после определения telegram_check
telegram_check getChatMember '{"chat_id":-1001234567890,"user_id":987654321}'
  • member: бот участвует в группе, учитывайте Privacy Mode.

  • administrator: бот администрирует группу; проверьте, что Update не отбрасывает приложение.

  • restricted: изучите is_member и ограничения, включая возможность отправлять сообщения. Ограничение ответа не тождественно отсутствию входящего события.

  • left или kicked: бот не является действующим участником; владелец группы должен решить вопрос добавления или разблокировки.

getChatMember здесь запрашивает сведения о самом боте. Возможность надёжно получать информацию о других участниках зависит от прав бота; не расширяйте проверку до произвольных пользователей.

Если API возвращает chat not found

Когда отключать Privacy Mode

Боту, который отвечает на адресованные команды и предназначенные ему ответы, часто достаточно включённого режима. Отключение имеет смысл, когда функция действительно требует обычного текста группы: например, модерация или обработка заявок без команды.

В BotFather выберите /setprivacy, затем своего бота и Disable. По официальным правилам Telegram для применения изменения бота нужно заново добавить в группу. Проверьте это сначала в собственной тестовой группе; заранее учтите восстановление нужных прав после повторного добавления.

Согласуйте такую настройку с владельцем рабочей группы: бот начнёт получать больше сообщений. Затем отправьте новое сообщение человеком и проверьте его в обработчике. Старую историю чата изменение не загружает.

Если требуется получить ответ на конкретный вопрос, рассмотрите ForceReply: интерфейс предлагает пользователю ответить на сообщение бота. Это позволяет организовать диалог без чтения всей переписки.

Параметр ForceReply

Проверьте тип обновления и путь доставки

Bash: проверка без изменения webhook
telegram_check getWebhookInfo '{}'

Если webhook настроен, посмотрите result.url, pending_update_count и сообщения о последних ошибках. Если allowed_updates задан явно, для новых сообщений группы должен быть разрешён тип message. Отсутствие поля allowed_updates само по себе не означает, что message отключён.

Изменение фильтра не превращает ранее созданные события в новые и не отменяет правила Privacy Mode. Проверяйте новым сообщением. Не удаляйте webhook и не сбрасывайте ожидающие обновления ради этой диагностики.

В группе событие обычно находится в update.message. Публикация канала приходит в channel_post — это другой сценарий. Успешный ответ бота в личке не доказывает, что ваш код обрабатывает group и supergroup: проверьте фильтр chat.type.

Подробная диагностика доставки webhook

Ответы в темах группы и message_thread_id

Не потеряйте команду с @username в PHP

Обработчик, который сравнивает весь текст строго с /help, пропустит /help@DemoSupportBot и /help аргумент. Эта функция выделяет имя команды и проверяет адресата; передайте ей message.text из уже проверенного Update и username своего бота.

group-command.php
<?php
declare(strict_types=1);

function commandForBot(string $text, string $botUsername): ?string
{
    if (preg_match('~^/([a-z0-9_]+)(?:@([a-z0-9_]+))?(?:\s|$)~i', $text, $matches) !== 1) {
        return null;
    }
    $target = $matches[2] ?? '';
    if ($target !== '' && strcasecmp($target, $botUsername) !== 0) {
        return null;
    }
    return strtolower($matches[1]);
}

// После проверки подлинности webhook и чтения message.text:
// commandForBot('/help@DemoSupportBot вопрос', 'DemoSupportBot') вернёт 'help'.
// Дальше приложение проверяет доступ и вызывает обработчик команды.

Функция вернёт help для /help, /help@DemoSupportBot и команды с аргументами. Для команды другому боту она вернёт null. Это только разбор текста: получение webhook, проверка подлинности и отправка ответа остаются в вашем существующем обработчике.

Если обычный текст теперь приходит, но обработчик реагирует только на команды, отключение Privacy Mode эту логику не меняет. Проверьте условия обработки и ограничения чата, прежде чем менять настройки Telegram.

Если бот подключён через BotGate

BotGate передаёт полученные от Telegram обновления, но не меняет Privacy Mode и не добавляет ботам права в группе. Сначала проверьте настройки и участие того же Telegram-бота, который привязан к выбранному публичному ID BotGate.

Для read-only проверок SDK используйте call('getMe') и call('getChatMember', параметры). Telegram-токен не заменяйте API-ключом BotGate в прямых curl-командах: это разные способы авторизации.

Проверяйте X-BotGate-Signature по исходному телу webhook до разбора JSON. getWebhookInfo у управляемого бота показывает адрес доставки Telegram в BotGate; это не URL обработчика вашего приложения. Для пользовательского webhook проверяйте его настройки и фактические входящие события отдельно.

Не вызывайте getUpdates параллельно с управляемым webhook. Если message есть в принятом Update, продолжайте диагностику в фильтрах приложения, очереди и обработчике команд.

PHP SDK и получение обновлений

Кнопки и callback_query: отдельный тип события

Проверка результата

  • getMe подтвердил нужный username, а getChatMember — участие именно в этой группе.

  • Человек отправил новую адресованную команду; message.text проверен до фильтров приложения.

  • При необходимости чтения обычного текста режим изменён, бот повторно добавлен и проверено новое сообщение.

  • Обработчик принимает group/supergroup и корректно разбирает @username.

  • Получение события и успешность отправки ответа проверены отдельно.

getMe и поле can_read_all_group_messages

getChatMember

getWebhookInfo