Интеграция Discord API с сайтом (уведомления, боты)
Discord — популярная платформа для игровых и технических сообществ. Интеграция с сайтом позволяет: уведомлять сообщество о новых материалах, верифицировать владельцев NFT или лицензий, создавать закрытые каналы для платных подписчиков.
Discord Webhooks (уведомления)
class DiscordNotifier
{
public function send(string $webhookUrl, array $embeds): void
{
Http::post($webhookUrl, [
'embeds' => $embeds,
]);
}
public function announceNewArticle(Article $article): void
{
$this->send(config('services.discord.news_webhook'), [[
'title' => $article->title,
'description' => $article->excerpt,
'url' => route('articles.show', $article->slug),
'color' => 0x5865F2, // Discord Blurple
'image' => ['url' => $article->cover_url],
'timestamp' => $article->published_at->toIso8601String(),
'footer' => ['text' => 'example.com'],
]]);
}
}
OAuth2: авторизация через Discord
Для доступа к закрытым разделам сайта — авторизация через Discord-аккаунт:
Route::get('/auth/discord/redirect', function () {
return redirect(
'https://discord.com/api/oauth2/authorize?' .
http_build_query([
'client_id' => config('services.discord.client_id'),
'redirect_uri' => route('auth.discord.callback'),
'response_type' => 'code',
'scope' => 'identify guilds.members.read',
])
);
});
Route::get('/auth/discord/callback', function (Request $request) {
// Обмен кода на токен
$tokenResp = Http::post('https://discord.com/api/oauth2/token', [
'client_id' => config('services.discord.client_id'),
'client_secret' => config('services.discord.client_secret'),
'code' => $request->code,
'grant_type' => 'authorization_code',
'redirect_uri' => route('auth.discord.callback'),
])->json();
// Получение данных пользователя
$user = Http::withToken($tokenResp['access_token'])
->get('https://discord.com/api/users/@me')
->json();
// Проверка членства в сервере
$member = Http::withToken($tokenResp['access_token'])
->get("https://discord.com/api/users/@me/guilds/{$guildId}/member")
->json();
return redirect('/dashboard');
});
Роль-гейтинг: доступ по роли в Discord-сервере
class DiscordRoleGate
{
public function hasAccess(string $userId, string $accessToken): bool
{
$member = Http::withToken($accessToken)
->get("https://discord.com/api/users/@me/guilds/{$this->guildId}/member")
->json();
$requiredRoles = config('services.discord.premium_role_ids');
return !empty(array_intersect($member['roles'] ?? [], $requiredRoles));
}
}
Сроки
Уведомления через Webhooks: 1 день. OAuth2 + role-gating: 3–4 дня.







