Bir discord doğrulama botu, sunucuna katılan her yeni üyenin gerçek bir insan olduğunu kanıtlamadan kanallara erişmesini engelleyen küçük ama hayati bir güvenlik katmanıdır. Tek bir tıkla ya da kısa bir captcha koduyla kapıyı geçen üyeler içeri alınır; bot hesapları, raid betikleri ve spam sürüleri ise dışarıda kalır. Bu yazıda discord.js ile sıfırdan, butonla başlayıp captcha ile güçlenen bir doğrulama sistemi kuracağız; rol ve izin modelini, otomatik rol atamayı ve gerçek dünyada işe yarayan güvenlik ipuçlarını adım adım göreceksin.
Neden doğrulama sistemi gerekir?
Açık bir sunucu, davet bağlantısı eline geçen herkesin doğrudan içeri girip yazabildiği bir yerdir. Bu, iki tür saldırıya davetiye çıkarır:
- Bot/self-bot akınları: Otomatik hesaplar dakikalar içinde yüzlerce davet kabul edip reklam veya zararlı link yağdırır.
- Raid'ler: Koordineli gruplar aynı anda girip kanalları flood'lar, üyeleri taciz eder ve sunucuyu kullanılmaz hale getirir.
Doğrulama, aradaki bu sürtünmeyi tam da olması gereken yere koyar: insan için birkaç saniye, otomasyon için ise aşılması zahmetli bir engel. Captcha eklemek, basit "butona tıkla" akışlarını taklit eden gelişmiş botlara karşı da bir kademe daha koruma sağlar.
İzin ve rol modelini kurmak
Kod yazmadan önce sunucunun yapısını doğru kurmak gerekir. Mantık basittir: doğrulanmamış üye hiçbir şey görmemeli, doğrulandığında erişim açılmalı. Bunun iki yaygın deseni var:
- Verified rolüyle açma:
@everyonerolünden tüm kanalları gizlersin; yalnızca bir#dogrulamakanalı görünür kalır. "Verified" adında bir rol oluşturup asıl kanallarda bu role Kanalı Gör izni verirsin. Üye doğrulanınca bot bu rolü ekler ve sunucu açılır. - Unverified rolüyle kısıtlama: Katılan herkese otomatik "Unverified" rolü verip bu rolün her yeri görmesini engellersin; doğrulamada rolü kaldırırsın.
İlk yöntem genelde daha temizdir çünkü varsayılan durum "kapalı"dır ve yanlışlıkla açık kalan bir kanal riski azalır. Hangisini seçersen seç iki kuralı unutma: botun Rolleri Yönet (Manage Roles) iznine sahip olması ve botun kendi rolünün, atayacağı rolün üstünde bulunması gerekir. Aksi halde Discord rol eklemeyi reddeder.
Üye katıldığında otomatik işlem
Yeni üyeleri yakalamak için GuildMemberAdd olayını dinleriz. Bu olayın gelmesi için botun Server Members Intent'ini hem geliştirici portalında hem de istemci ayarlarında açman şarttır.
const { Client, GatewayIntentBits, Events } = require('discord.js');
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
});
client.on(Events.GuildMemberAdd, async (member) => {
// Unverified deseni kullanıyorsan girişte rolü ata:
await member.roles.add(process.env.UNVERIFIED_ROLE_ID);
});
client.login(process.env.TOKEN);
Verified deseninde bu adıma gerek yoktur; üye zaten varsayılan olarak hiçbir şey göremez ve sadece doğrulama kanalını görür.
discord doğrulama botu: buton ile doğrulama
En basit ve en hızlı yöntem buton tabanlı doğrulamadır. Önce doğrulama kanalına kalıcı bir panel mesajı gönderirsin:
const { ButtonBuilder, ButtonStyle, ActionRowBuilder } = require('discord.js');
const row = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('verify')
.setLabel('Hesabımı doğrula')
.setEmoji('✅')
.setStyle(ButtonStyle.Success),
);
await channel.send({
content: 'Sunucuya erişmek için aşağıdaki butona tıkla.',
components: [row],
});
Buradaki customId alanı kritik: tıklama olayını tanımana yarayan benzersiz kimliktir. Şimdi bu butona gelen tıklamaları dinleyelim. Yanıtları flags: MessageFlags.Ephemeral ile gizli gönderiyoruz ki kanal "doğrulandın" mesajlarıyla dolmasın:
const { Events, MessageFlags } = require('discord.js');
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isButton() || interaction.customId !== 'verify') return;
const role = interaction.guild.roles.cache.get(process.env.VERIFIED_ROLE_ID);
if (interaction.member.roles.cache.has(role.id)) {
return interaction.reply({
content: 'Zaten doğrulanmışsın.',
flags: MessageFlags.Ephemeral,
});
}
await interaction.member.roles.add(role);
await interaction.reply({
content: 'Doğrulandın, aramıza hoş geldin!',
flags: MessageFlags.Ephemeral,
});
});
Bu kadarı çoğu küçük topluluk için yeterlidir. Ancak butona programatik tıklayan botlara karşı bir adım daha atmak istersen captcha devreye girer.
Captcha ile gelişmiş doğrulama
Captcha akışında üye butona bastığında ona rastgele bir kod gösterip bunu bir modal form'a yazmasını isteriz. Kodu hafızada tutmak için basit bir Map yeterlidir (büyük sunucularda Redis tercih edilir). Önce butona basınca modalı açalım:
const {
Events,
ModalBuilder,
TextInputBuilder,
TextInputStyle,
ActionRowBuilder,
} = require('discord.js');
const pending = new Map();
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isButton() || interaction.customId !== 'verify') return;
const code = Math.random().toString(36).slice(2, 8).toUpperCase();
pending.set(interaction.user.id, code);
const input = new TextInputBuilder()
.setCustomId('captcha_input')
.setLabel(`Bu kodu birebir yaz: ${code}`)
.setStyle(TextInputStyle.Short)
.setRequired(true);
const modal = new ModalBuilder()
.setCustomId('captcha_modal')
.setTitle('Doğrulama')
.addComponents(new ActionRowBuilder().addComponents(input));
await interaction.showModal(modal);
});
Üye formu gönderince ModalSubmit etkileşimi gelir. Girilen değeri beklenen kodla karşılaştırıp eşleşirse rolü veririz:
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isModalSubmit() || interaction.customId !== 'captcha_modal') return;
const expected = pending.get(interaction.user.id);
const given = interaction.fields
.getTextInputValue('captcha_input')
.trim()
.toUpperCase();
if (!expected || given !== expected) {
return interaction.reply({
content: 'Kod hatalı. Lütfen butona tekrar tıkla.',
flags: MessageFlags.Ephemeral,
});
}
pending.delete(interaction.user.id);
const role = interaction.guild.roles.cache.get(process.env.VERIFIED_ROLE_ID);
await interaction.member.roles.add(role);
await interaction.reply({
content: 'Doğrulandın, hoş geldin! 🎉',
flags: MessageFlags.Ephemeral,
});
});
Kodu metin yerine bir resme gömmek istersen canvas gibi bir kütüphaneyle görsel üretip modal yerine DM ya da ephemeral mesajla gönderebilirsin; mantık aynı kalır, yalnızca kodu okumayı insan gözüne özel hale getirirsin.
Güvenlik ipuçları ve iyi pratikler
- Zaman aşımı koy:
pendingkayıtlarını birkaç dakika sonrasetTimeoutile temizle ki eski kodlar bellekte birikmesin. - Hız sınırı uygula: Aynı kullanıcının kısa sürede çok deneme yapmasını engelle; sürekli yanlış girenleri otomatik kick'le.
- Log tut: Başarılı ve başarısız doğrulamaları bir log kanalına webhook ile yaz; raid anında kimin geçtiğini görmek paha biçilmezdir.
- Hesap yaşı filtresi: Çok yeni oluşturulmuş hesapları (örn. 7 günden genç) doğrulamadan otomatik kick'leyerek bot dalgalarını daha kapıda durdur.
- Token'ı sakla: Bot token'ını asla koda gömme;
process.envve.envdosyası kullan, dosyayı.gitignore'a ekle.
Sık Sorulan Sorular
Doğrulama botu için hangi izinler gerekir?
Botun en azından Rolleri Yönet iznine ihtiyacı vardır ve botun rolü, vereceği "Verified" rolünün üstünde olmalıdır. Üye katılımını yakalamak için ayrıca Server Members Intent açık olmalıdır.
Captcha mı yoksa buton mu daha iyi?
Küçük, sakin sunucular için tek tıklık buton genelde yeterlidir. Sık raid yiyen ya da büyük sunucularda captcha, panele otomatik tıklayan botları eleyerek belirgin bir ek koruma sağlar. İkisini birleştirmek en güçlü çözümdür.
Kodu Map yerine veritabanında mı tutmalıyım?
Tek süreç çalışan küçük botlarda Map yeterli ve hızlıdır. Bot yeniden başladığında bekleyen kodlar silinir ki bu da sorun değildir. Sharding kullanıyorsan ya da kalıcılık istiyorsan Redis gibi paylaşımlı bir depo tercih et.
Sunucun için güvenilir bir doğrulama sistemine mi ihtiyacın var? Buton, captcha, anti-raid ve loglama özellikleriyle topluluğuna özel bir Discord botu tasarlayıp kurabilirim. Benimle iletişime geç ve projeni konuşalım.