Сначала отправьте человеком команду /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 со своими правилами. Для базовой диагностики достаточно сообщения от человека.
Проверьте бота и настройку через getMe
Следующие команды рассчитаны на Bash с curl: Linux, WSL или Git Bash. Используйте токен своего тестового бота. Ввод скрыт, URL передаётся curl через стандартный ввод. Не включайте shell tracing или подробный вывод curl: токен входит в URL.
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. В примере ниже оба числа нужно заменить.
telegram_check getChatMember '{"chat_id":-1001234567890,"user_id":987654321}'
member: бот участвует в группе, учитывайте Privacy Mode.
administrator: бот администрирует группу; проверьте, что Update не отбрасывает приложение.
restricted: изучите is_member и ограничения, включая возможность отправлять сообщения. Ограничение ответа не тождественно отсутствию входящего события.
left или kicked: бот не является действующим участником; владелец группы должен решить вопрос добавления или разблокировки.
getChatMember здесь запрашивает сведения о самом боте. Возможность надёжно получать информацию о других участниках зависит от прав бота; не расширяйте проверку до произвольных пользователей.
Когда отключать Privacy Mode
Боту, который отвечает на адресованные команды и предназначенные ему ответы, часто достаточно включённого режима. Отключение имеет смысл, когда функция действительно требует обычного текста группы: например, модерация или обработка заявок без команды.
В BotFather выберите /setprivacy, затем своего бота и Disable. По официальным правилам Telegram для применения изменения бота нужно заново добавить в группу. Проверьте это сначала в собственной тестовой группе; заранее учтите восстановление нужных прав после повторного добавления.
Согласуйте такую настройку с владельцем рабочей группы: бот начнёт получать больше сообщений. Затем отправьте новое сообщение человеком и проверьте его в обработчике. Старую историю чата изменение не загружает.
Если требуется получить ответ на конкретный вопрос, рассмотрите ForceReply: интерфейс предлагает пользователю ответить на сообщение бота. Это позволяет организовать диалог без чтения всей переписки.
Проверьте тип обновления и путь доставки
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.
Не потеряйте команду с @username в PHP
Обработчик, который сравнивает весь текст строго с /help, пропустит /help@DemoSupportBot и /help аргумент. Эта функция выделяет имя команды и проверяет адресата; передайте ей message.text из уже проверенного Update и username своего бота.
<?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, продолжайте диагностику в фильтрах приложения, очереди и обработчике команд.
Проверка результата
getMe подтвердил нужный username, а getChatMember — участие именно в этой группе.
Человек отправил новую адресованную команду; message.text проверен до фильтров приложения.
При необходимости чтения обычного текста режим изменён, бот повторно добавлен и проверено новое сообщение.
Обработчик принимает group/supergroup и корректно разбирает @username.
Получение события и успешность отправки ответа проверены отдельно.