
В экосистеме Discord сервера представляют собой отдельные пространства с собственными каналами, ролями и настройками. Для работы с ними через API требуется точный набор прав и корректная аутентификация пользователя. Получение списка серверов невозможно без использования токена и соответствующих OAuth2-разрешений.
Основной способ – применение метода /users/@me/guilds из официального Discord API. Этот эндпоинт возвращает JSON-массив с данными о серверах, где присутствует пользователь. Ответ содержит идентификатор сервера (id), его название (name), уровень прав пользователя (permissions) и статус владения (owner).
Для доступа необходимо запросить у пользователя разрешение guilds во время авторизации через OAuth2. Без этого параметра API вернет пустой результат или ошибку доступа. После успешного получения токена достаточно выполнить запрос с заголовком Authorization: Bearer <token>, чтобы получить актуальный список.
Практическое применение этих данных включает автоматизацию управления сообществами, настройку интеграций или отображение доступных серверов в пользовательском интерфейсе сторонних приложений. При этом важно учитывать ограничения Discord API: лимиты на запросы (rate limits) и требования безопасности при хранении токенов.
Регистрация и настройка приложения в Discord Developer Portal

Перейдите в Discord Developer Portal и авторизуйтесь под учетной записью. В разделе Applications нажмите кнопку New Application, задайте название и сохраните.
В созданном приложении откройте вкладку OAuth2. В блоке Client Information скопируйте Client ID и Client Secret – они понадобятся для авторизации. В разделе Redirects добавьте точный URL обратного вызова вашего приложения, иначе токен не будет выдан.
Во вкладке Bot создайте бота с помощью кнопки Add Bot. Скопируйте Token, храните его в защищённом месте. Здесь же можно задать права доступа (например, Guilds, Guild Members), включить флаг SERVER MEMBERS INTENT, если нужен список участников.
Для приглашения бота сформируйте ссылку на вкладке OAuth2 → URL Generator, выбрав bot и необходимые OAuth2 Scopes. Полученный URL откройте в браузере и подтвердите установку на сервер.
Получение токена доступа через OAuth2
Цель: получить пользовательский access_token с правами identify и guilds для запроса GET /users/@me/guilds. Работает только через пользовательский OAuth2 (не бот-токен).
Шаг 1 – ссылка авторизации. Направьте пользователя на https://discord.com/api/oauth2/authorize с параметрами: client_id=<ваш_id>, redirect_uri=<URL-encoded>, response_type=code, scope=identify%20guilds, state=<случайная_строка>, при необходимости prompt=consent. Пример: https://discord.com/api/oauth2/authorize?client_id=123&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback&response_type=code&scope=identify%20guilds&state=K1o9....
Шаг 2 – обмен кода на токен. На сервере (не в браузере) выполните POST https://discord.com/api/oauth2/token с заголовком Content-Type: application/x-www-form-urlencoded. Тело: grant_type=authorization_code, code=<из callback>, redirect_uri=<тот_же>, client_id, client_secret. Для публичных клиентов применяйте PKCE: вместо секрета – code_verifier/code_challenge (S256), а в шаге авторизации добавляйте code_challenge и code_challenge_method=S256.
Ответ токен-эндпоинта содержит поля: access_token, token_type=Bearer, expires_in (обычно ~604800 c), refresh_token, scope=identify guilds. Храните access_token краткоживущим способом (сессия/временное хранилище на сервере), refresh_token – в зашифрованном виде в БД.
Шаг 3 – запрос списка серверов. Используйте заголовок Authorization: Bearer <access_token> и обращайтесь к GET https://discord.com/api/users/@me/guilds. Добавляйте User-Agent с названием приложения и версией. Обрабатывайте ограничения: ответы 429 (rate limit) – повтор через интервал из заголовка X-RateLimit-Reset-After.
Обновление токена: при 401/expired выполните POST https://discord.com/api/oauth2/token с grant_type=refresh_token, refresh_token=<значение>, тем же client_id/client_secret (или PKCE). Старый refresh_token обычно становится недействительным – заменяйте на новый из ответа немедленно.
Безопасность: точное совпадение redirect_uri с настройками приложения; проверка state для защиты от CSRF; запрет передачи client_secret в фронтенде; CORS – запросы к токен-эндпоинту только с сервера; минимальный набор скоупов (identify guilds) и узкие сроки жизни сессии.
Отладка: логируйте только метаданные (время, путь, код ответа), не токены; проверяйте дату истечения и обновляйте за 1–5 минут до окончания; валидируйте, что поле scope в ответе действительно содержит оба скоупа – иначе повторяйте авторизацию с корректной ссылкой.
Типичные ошибки: неверный redirect_uri (400 invalid_grant), смешение PKCE и client_secret, повторное использование одноразового code, отсутствие URL-encoding у redirect_uri, пропуск заголовка Content-Type при обмене кода.
Выбор нужных OAuth2-прав для доступа к серверам

Для получения списка серверов, на которых присутствует пользователь, достаточно запросить минимальный набор прав: identify + guilds. scope guilds возвращает список частичных объектов «guild» (id, name, icon, owner, permissions и т.д.) через эндпойнт GET /users/@me/guilds, этого достаточно для отображения списка серверов и проверки наличия пользователя на конкретном сервере. :contentReference[oaicite:0]{index=0}
-
Если нужен только список серверов: запрашивайте
scope=identify%20guilds. Используйте серверный OAuth2-кодовый поток (Authorization Code) или PKCE в клиенте – токены чувствительны к компрометации. :contentReference[oaicite:1]{index=1} -
Если требуется информация о том, какие роли у пользователя на конкретном сервере: добавляйте
guilds.members.read. Этот scope позволяет вызватьGET /users/@me/guilds/{guild.id}/memberи получить member-представление (roles, joined_at и т.д.). Запрашивайте его только для конкретных серверов и объясняйте пользователю, зачем нужен доступ к ролям. :contentReference[oaicite:2]{index=2} -
Если нужно автоматически добавить пользователя в сервер (invite): добавляйте
guilds.joinи используйтеPUT /guilds/{guild.id}/members/{user.id}вместе с токеном пользователя. Применяйте этот scope экономно – массовое добавление вызывает повышенное внимание модерации и риск жалоб. :contentReference[oaicite:3]{index=3} -
Если вы интегрируете бота в интерфейсе (приглашение бота): используйте
scope=botи параметрpermissions(целое число – битовая маска). Подсчитывайте permissions целенаправленно: запросите только те биты, которые реально нужны (например,0x00000020для Manage Messages), и описывайте причины пользователю. :contentReference[oaicite:4]{index=4}
Практические рекомендации по UX и безопасности:
-
Запрашивайте минимальные scopes; объясняйте в экране согласия каждую запрашиваемую опцию (например, «доступ к списку серверов для показа серверов, где доступен ваш профиль»).
-
Если вам нужна только проверка членства в одном сервере – после получения
/users/@me/guildsфильтруйте по id сервера на серверной стороне, не запрашивайте дополнительные права. -
Для
guilds.members.readделайте запросы выборочно (по одному серверу за раз) и кэшируйте ответы короткое время; массовые запросы могут привести к ограничению API. -
Не запрашивайте
email,connectionsили другие чувствительные scopes без явной необходимости – лишние разрешения снижают конверсию и увеличивают риск блокировок/жалоб. :contentReference[oaicite:5]{index=5} -
Используйте серверный поток (authorization code) для получения refresh-token и храните токены в зашифрованном хранилище; при клиентских приложениях применяйте PKCE. Это стандартная рекомендация по безопасности OAuth2 у Discord. :contentReference[oaicite:6]{index=6}
Пример минимальной строки авторизации для получения списка серверов:
-
https://discord.com/api/oauth2/authorize?client_id=ВАШ_CLIENT_ID&redirect_uri=ВАШ_REDIRECT&response_type=code&scope=identify%20guilds
Краткий чек-лист перед публикацией интеграции:
-
Проверьте, что каждый запрошенный scope действительно нужен.
-
Подготовьте понятный текст на экране согласия, объясняющий именно запрошенные права.
-
Реализуйте обработку отказа пользователя (когда scope не предоставлен) и корректно объясняйте, какие функции будут недоступны.
-
Мониторьте ошибки API и лимиты для endpoints
/users/@me/guildsи member-эндпойнтов, чтобы избежать массовых повторных запросов. :contentReference[oaicite:7]{index=7}
Использование Discord API для запроса списка серверов

Типичный ответ – массив частичных объектов гильдии; полезные поля: id (строка), name, icon, owner (bool), permissions (битовая маска в виде строки/числа). Поле permissions – битовая маска прав пользователя в этой гильдии, её нужно интерпретировать через документы Discord или библиотечный парсер.
Обмен кода авторизации на access token (пример cURL):
curl -X POST https://discord.com/api/oauth2/token \
-d client_id=CLIENT_ID \
-d client_secret=CLIENT_SECRET \
-d grant_type=authorization_code \
-d code=AUTH_CODE \
-d redirect_uri=REDIRECT_URI
Пример запроса списка серверов (cURL):
curl -H "Authorization: Bearer <ACCESS_TOKEN>" \
"https://discord.com/api/users/@me/guilds"
Рекомендации по обработке ответов: проверяйте статус 401/403 (требуется повторная авторизация) и 429 (rate limit). Читайте заголовки ответа: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset и реализуйте экспоненциальную задержку при повторных запросах. Кэшируйте список серверов на серверной стороне не дольше, чем несколько минут, и инвалидацию запускайте при изменении авторизации.
Безопасность и UX: запрашивайте минимальные scopes (только guilds), храните refresh-токены в безопасном хранилище, используйте HTTPS и CSRF-защиту в flow. Для клиентских приложений предпочитайте PKCE; для серверных – храните client_secret только на сервере.
Обработка ответа API и извлечение данных о серверах

Проверяйте код ответа и тело: 200 – массив объектов гильдий; 401/403 – токен/права; 429 – учитывать заголовки rate-limit (Retry-After). Всегда парсите JSON и валидируйте типы полей перед использованием.
Извлекаемые поля (типичные для ответа OAuth2 `/users/@me/guilds`):
| Поле | Тип | Назначение |
|---|---|---|
| id | string (snowflake) | Идентификатор сервера; используется для запросов и вычисления времени создания. |
| name | string | Отображаемое имя сервера. |
| icon | string|null | Хэш иконки (формирует URL: `https://cdn.discordapp.com/icons/{id}/{icon}.png`). |
| owner | boolean | Показывает, является ли пользователь владельцем сервера. |
| permissions | string (целое) | Права пользователя на сервере в виде битовой маски; парсите в big integer. |
| features | array | Список флагов сервера (например, PARTNERED, VERIFIED). |
Рекомендации по преобразованию `id` (snowflake → дата): используйте 64-битную арифметику, сдвиньте вправо на 22 бита и прибавьте Epoch Discord: 1420070400000 ms. Пример (JavaScript):
function snowflakeToDate(id){
const DISCORD_EPOCH = 1420070400000n;
const ts = (BigInt(id) >> 22n) + DISCORD_EPOCH;
return new Date(Number(ts));
}
Парсинг permissions: преобразуйте строку в BigInt (или int в Python), затем проверяйте биты маски. Совет: заранее составьте словарь важных прав, чтобы фильтровать только те, что нужны приложению (например, ADMINISTRATOR, MANAGE_GUILD, VIEW_AUDIT_LOG).
// JS: получить набор прав по именам
const PERM_FLAGS = {
ADMINISTRATOR: 0x00000008n,
MANAGE_GUILD: 0x00000020n,
KICK_MEMBERS: 0x00000002n,
BAN_MEMBERS: 0x00000004n
};
function parsePermissions(permString){
const p = BigInt(permString);
return Object.keys(PERM_FLAGS).filter(k => (p & PERM_FLAGS[k]) !== 0n);
}
Безопасность и надёжность: проверяйте наличие полей (`icon`, `permissions`) перед использованием; кешируйте ответ на короткое время (TTL 60–300 с) и уважайте заголовки `X-RateLimit-*`. При 429 – используйте `Retry-After` и экспоненциальную паузу для повторов.
Советы по отображению: формируйте URL иконки только при наличии хэша; аккуратно показывайте `owner` и расшифрованные права; для длинных списков гильдий используйте пагинацию или ленивую загрузку интерфейса.
Для получения списка серверов пользователя Discord потребуется библиотека discord.py и токен бота или пользовательский токен (учтите ограничения Discord по использованию пользовательских токенов).
Пример кода с использованием бота:
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.guilds = True # Необходимо для доступа к списку серверов
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.event
async def on_ready():
print(f'Бот {bot.user} подключен')
for guild in bot.guilds:
print(f'Название сервера: {guild.name}, ID сервера: {guild.id}')
bot.run('ВАШ_ТОКЕН')
Рекомендации по работе с кодом:
- Токен храните в переменных окружения или отдельном файле, чтобы не раскрывать его публично.
- Для получения информации о серверах требуется разрешение Guilds Intent, которое включается в настройках приложения на портале Discord Developer.
- Метод
bot.guildsвозвращает объектGuildс атрибутамиname,id,member_count,owner_idи другими. - Если требуется фильтровать серверы по определенным критериям, используйте списковые включения:
active_guilds = [g for g in bot.guilds if g.member_count > 50]
for guild in active_guilds:
print(guild.name, guild.member_count)
Для отладки можно включить логирование событий библиотеки:
import logging
logging.basicConfig(level=logging.INFO)
Это позволит отслеживать, какие сервера загружаются, и выявлять ошибки подключения.
Вопрос-ответ:
Можно ли получить список всех серверов, на которых я состою в Discord через бота?
Да, это возможно, если у бота есть соответствующие права. Бот должен быть добавлен на все серверы, где вы состоите, и иметь доступ к информации о гильдиях (guilds). Через Discord API можно использовать метод получения списка гильдий, к которым подключен бот, и сопоставить их с пользователем, если бот имеет доступ к членству на сервере.
Какой способ безопаснее для получения списка серверов пользователя: через токен или через OAuth2?
Использование OAuth2 является безопасным и официальным методом. Запрос через токен пользователя нарушает правила Discord и может привести к блокировке аккаунта. OAuth2 позволяет получить доступ к информации о сервере только с согласия пользователя и в рамках предоставленных разрешений, что делает этот способ легальным и безопасным для разработки приложений.
Можно ли узнать список серверов другого пользователя в Discord?
Нет, прямого способа получить список серверов другого пользователя не существует. Discord ограничивает доступ к этой информации для защиты приватности. Разработчик может получить данные о серверах только для тех пользователей, которые авторизовались через его приложение с использованием OAuth2 и дали соответствующее разрешение.
Какие библиотеки или инструменты помогают работать с гильдиями Discord для получения информации о серверах?
Среди популярных библиотек для взаимодействия с Discord API можно выделить discord.py, Discord.js и Eris. Они предоставляют методы для получения информации о серверах, участниках и каналах, если у бота есть соответствующие права. С их помощью можно программно получать список серверов, но только для бота и пользователей, которые предоставили разрешение через OAuth2.
