Если Discord-бот подключен к серверу, отвечает на команды, но не видит участников, проблема обычно связана не с токеном. Нужно проверить Guild Members Intent, набор intents в коде, способ получения участников, кеш библиотеки и область OAuth-установки приложения.
Discord не обязан заранее передавать боту полный список участников. Для крупных серверов и некоторых сценариев данные нужно запрашивать явно, а привилегированный intent — включить одновременно в Developer Portal и в коде клиента.
Как проявляется проблема
- Список guild.members пустой или содержит только самого бота.
- Поиск пользователя по имени работает только после его сообщения в чате.
- События входа и выхода участников не приходят.
- Команда назначения роли сообщает, что участник не найден, хотя он есть на сервере.
- На маленьком тестовом сервере код работает, а на крупном — возвращает неполные данные.
Что такое Guild Members Intent
Guild Members Intent относится к привилегированным gateway intents. Он нужен для событий о присоединении, выходе и обновлении участников, а также для полноценной загрузки member-данных через gateway. Одного переключателя в панели недостаточно: библиотека должна запросить этот intent при подключении.
- В Developer Portal откройте приложение, затем раздел Bot и Privileged Gateway Intents.
- Включите Server Members Intent, если функции бота действительно требуют данных участников.
- Добавьте соответствующий intent в конфигурацию клиента вашей библиотеки.
- Перезапустите процесс: действующее gateway-соединение не изменит intents само.
Проверьте intents в коде
Названия зависят от библиотеки и версии: GuildMembers, GUILD_MEMBERS или аналогичное значение. После крупных обновлений discord.js, discord.py и других SDK формат конфигурации мог измениться.
- Выведите безопасный список запрошенных intents при запуске.
- Проверьте документацию именно установленной версии библиотеки.
- Убедитесь, что не создается второй Client с сокращенным набором intents.
- Посмотрите gateway close code: Discord может закрыть соединение при запрещенном intent.
Кеш участников не равен полному списку
Коллекция members в памяти обычно является кешем, а не гарантированно полным каталогом. Она может содержать только участников, которых библиотека уже получила через события, команды или явные запросы.
- Не используйте размер кеша как точное число участников сервера.
- Для одного известного пользователя запрашивайте member по стабильному Discord user id.
- Для массовой операции используйте штатный fetch или chunking библиотеки и учитывайте ограничения.
- Не ищите пользователя только по display name: имена могут совпадать и изменяться.
Проверьте OAuth-установку и сервер
Бот должен быть установлен именно в тот guild, данные которого запрашивает код. Ошибка часто возникает, когда в конфигурации остался id тестового сервера или приложение было переустановлено с другой ссылкой.
- Сверьте application id, bot user id и guild id в событии ready.
- Проверьте, что команда выполняется в ожидаемом guild, а не в личном сообщении.
- Для slash-команд проверьте корректные scopes bot и applications.commands.
- После изменения установки не используйте старые жестко записанные channel и guild id.
Нужны ли боту права администратора
Для чтения member-данных не следует автоматически выдавать Administrator. Intents управляют тем, какие события и данные доступны через gateway, а права сервера — какие действия бот может выполнять. Это разные уровни.
- Выдайте только права, необходимые конкретным командам.
- Для назначения ролей проверьте иерархию ролей: роль бота должна находиться выше целевой.
- Для доступа к закрытым каналам отдельно проверьте channel overwrites.
- Не маскируйте ошибку отсутствующего intent выдачей полного Administrator.
Пошаговая диагностика
- Подтвердите, что бот получает ready и видит нужный guild.
- Запишите версию Discord-библиотеки и фактический набор intents.
- Проверьте Server Members Intent в Developer Portal.
- Перезапустите единственный экземпляр бота и посмотрите gateway ошибки.
- Запросите одного участника по user id через штатный API библиотеки.
- Сравните результат прямого fetch и содержимое локального кеша.
- Для полного списка проверьте chunking, pagination, rate limits и завершение загрузки.
- Отдельно протестируйте события присоединения, выхода и обновления участника.
Как исправить
- Включите привилегированный intent только при реальной необходимости функций бота.
- Запросите тот же intent при создании клиента и полностью перезапустите процесс.
- Замените поиск по имени на работу со стабильным user id.
- Для единичных операций используйте прямой fetch вместо предположения, что кеш полный.
- Для массовых задач загружайте участников контролируемо и обрабатывайте rate limit.
- Не храните полный список бесконечно: обновляйте данные событиями или по сроку актуальности.
Если сервер крупный
Для верифицированных приложений Discord может требовать отдельное одобрение привилегированного intent. На крупных серверах нельзя рассчитывать, что весь список мгновенно появится в памяти после ready.
- Проверьте статус privileged intent для приложения в Developer Portal.
- Не запускайте тяжелую обработку списка до завершения штатной загрузки.
- Разделяйте единичный поиск участника и массовую синхронизацию.
- Храните checkpoint массовой задачи и не повторяйте обработку уже завершенных страниц.
Как проверить результат
- Бот находит контрольного участника по user id без предварительного сообщения в чат.
- Событие нового участника приходит один раз и содержит ожидаемый guild id.
- Выход участника корректно обновляет локальные данные.
- На крупном сервере загрузка завершается без timeout и бесконечных повторов.
- После рестарта бот не зависит от случайно сохранившегося кеша предыдущего процесса.
- Команды не получают лишние административные права.
Типичные ошибки
- Включить intent в панели, но забыть добавить его при создании клиента.
- Добавить intent в код, но не включить его в Developer Portal.
- Считать guild.members полным списком сразу после ready.
- Искать пользователя по отображаемому имени вместо id.
- Запрашивать весь сервер для каждой команды и быстро получать rate limit.
- Выдать Administrator, хотя проблема находится в gateway intents.
- Запустить несколько экземпляров бота с разной конфигурацией и сравнивать их кеши.
Как не допустить повторения
- Зафиксируйте intents и версии библиотеки в конфигурации проекта.
- Добавьте smoke test поиска контрольного участника после запуска.
- Логируйте guild id, user id, тип операции и результат без токена и личных данных.
- Мониторьте gateway disconnect, rate limit и ошибки массовой загрузки.
- Проверяйте привилегированные intents после переноса приложения или обновления SDK.
Итог
Если Discord-бот не видит участников, сначала проверьте Guild Members Intent в двух местах: Developer Portal и коде клиента. Затем отделите локальный кеш от прямого API-запроса и убедитесь, что бот работает с правильным guild и стабильными user id.
Если проблема остается, я могу проверить конфигурацию Discord-приложения, intents, версию библиотеки и логи gateway, затем исправить загрузку участников без выдачи боту лишних прав.