echidna
Topluluk yöneticileri için tasarlanmış pasif gözlem aracı. Throwaway bir Discord hesabı sunuculara katılır, Telegram'dan bir ID gönderdiğinizde sistem o kullanıcının halka açık çapraz-sunucu izini iki HTML rapor halinde teslim eder.
A passive observation tool for community admins. A throwaway Discord account sits in servers; when you send an ID via Telegram, the system returns the user's publicly visible cross-server footprint as two HTML reports.
1.Hızlı kurulumQuickstart
Önceden: Debian/Ubuntu çalışan bir VM veya Raspberry Pi, Discord throwaway hesabı (≥30 günlük, 2FA açık), Telegram bot tokeni.
Prerequisites: a Debian/Ubuntu VM or Raspberry Pi, a throwaway Discord account (≥30 days, 2FA on), and a Telegram bot token.
-
Node.js 22 LTS kur (tek seferlik)
Install Node.js 22 LTS (one-time)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt install -y nodejs git -
Repo'yu klonla ve bağımlılıkları kur
Clone the repo and install dependencies
git clone https://github.com/Algolagnia/echidna-dc.git echidna cd echidna npm ci --include=dev npm run build -
.env dosyasını doldur
Fill in
.envcp .env.example .env nano .env # DISCORD_TOKEN, TELEGRAM_BOT_TOKEN, ADMIN_CHAT_IDS chmod 600 .envToken nasıl alınır — aşağıda Yapılandırma bölümünde.
How to obtain the tokens — see Configuration below.
-
Testleri çalıştır (opsiyonel ama önerilen)
Run the tests (optional but recommended)
npm test # 70 test, hepsi yeşil / all green -
Başlat
Run
npm startİlk başlangıçta
discord_readylog'unu bekle. Sonra Telegram'da botuna/helpgönder.Wait for the
discord_readylog on first boot, then send/helpto your bot on Telegram.
Yukarıdaki adımlar geliştirme için yeterli. 7/24 çalışma için deploy/echidna.service systemd birimini kullan — bakım bölümüne bak.
The steps above suffice for development. For 24/7 operation, use the systemd unit at deploy/echidna.service — see the Maintenance section.
Host makinende git clone ile çek, klasörü tar czf echidna.tar.gz --exclude=node_modules --exclude=dist --exclude=.git echidna/ şeklinde paketle, scp ile VM'e at, VM içinde tar xzf ile aç ve adım 1'den (Node kurulumu) devam et.
On a connected host, git clone the repo, package with tar czf echidna.tar.gz --exclude=node_modules --exclude=dist --exclude=.git echidna/, transfer with scp, extract with tar xzf inside the VM, and continue from step 1 (Node install).
2.Sistem nasıl çalışırHow it works
Throwaway Discord hesabı (echidna) çok sayıda topluluk sunucusuna katılır ve pasif gözlemci
olarak durur — mesaj yazmaz, ses kanalına girmez, hiç eylem yapmaz. Gateway üzerinden aldığı
mesaj ve presence olayları sürecin RAM'inde tutulur. Admin Telegram'dan /lookup <id>
gönderdiğinde sistem:
A throwaway Discord account (echidna) joins many community servers as a passive
observer — it does not send messages, join voice, or take any action. Messages and
presence events delivered via the gateway live in process RAM. When the admin sends
/lookup <id> from Telegram, the system:
- Mutual sunucularda hedef kullanıcıyı tarar (rol, takma ad, voice state)
- scans mutual servers for the target (roles, nickname, voice state),
- Discord'un kendi search API'sinden son mesajlarını çeker (sunucu başına 100, configurable)
- pulls recent messages via Discord's search API (100/server by default, configurable),
- Profile endpoint'ten bio, badges, GitHub/Steam/Twitch gibi bağlantıları alır
- fetches bio, badges, and connections (GitHub/Steam/Twitch) from the profile endpoint,
- Üç analiz katmanını çalıştırır: risk taraması, davranışsal NLP, güven puanı
- runs three analysis layers: risk scan, behavioral NLP, confidence score,
- İki HTML raporu (kimlik + aktivite) Telegram'a iletir
- sends two HTML reports (identity + activity) to Telegram,
- Bellekteki veri scope dışına çıkar ve garbage collector tarafından silinir
- and lets the in-memory data fall out of scope for garbage collection.
Disk'e hiçbir şey yazılmaz. Production'da iki katmanlı koruma vardır: Node.js düzeyinde fs.writeFile türü API'ler runtime'da monkey-patch ile bloke edilir; systemd ReadOnlyPaths=/opt/echidna ile kernel düzeyinde aynı kural uygulanır.
Nothing is written to disk. Production has two layers of protection: at the Node.js level, fs.writeFile-family APIs are monkey-patched at startup; systemd enforces the same with ReadOnlyPaths=/opt/echidna at kernel level.
3.YeteneklerCapabilities
Kimlik & alias clustering
Identity & alias clustering
Username, global_name ve tüm sunucu takma adları case-insensitive dedupe
Username, global_name and every server nickname, deduplicated
Sunucu sınıflandırma
Server classification
Anime, sohbet, eğitim, dev, oyun, 18+, topluluk
Anime, chat, education, dev, gaming, 18+, community
Risk taraması
Risk scan
Phishing, scam, mass-mention, link shortener pattern'leri
Phishing, scam, mass-mention, URL shortener patterns
Davranışsal NLP
Behavioral NLP
Dil, yaş, cinsiyet ipuçları + ton/küfür/CAPS oranı
Language, age, gender hints + tone/profanity/CAPS rates
Güven puanı
Confidence score
0–100 puan, 6 faktör breakdown
0–100 score with 6-factor breakdown
Mesaj geçmişi
Message history
Discord search API ile sunucu başına 100-500 mesaj
100-500 messages per server via Discord search API
Anlık ses durumu
Live voice state
Şu anda hangi sunucu, kanal, süre, flag
Current guild, channel, duration, flags
Profile bağlantıları
Profile connections
GitHub, Steam, Twitch, Spotify, YouTube, vb.
GitHub, Steam, Twitch, Spotify, YouTube, etc.
4.Riskler ve uyarılarRisks & warnings
Self-bot kullanımı Discord'un Hizmet Şartları'na aykırıdır. Hesap er ya da geç banlanır. Yalnızca throwaway hesap kullanın, ana hesabınızı asla.
Self-bot usage violates Discord's Terms of Service. The account will eventually be banned. Use only a throwaway, never your main account.
- Datacenter IP'sinden login (AWS, GCP, DigitalOcean, vb.) — residential IP kullan
- Logging in from datacenter IPs (AWS, GCP, DigitalOcean…) — use a residential IP
- 100+ sunuca kısa sürede katılım — günde 2-4 sunucudan fazla katılma
- Joining many servers quickly — limit to 2-4 servers per day
- 30 günden yeni hesap — daha yaşlı throwaway tercih et
- Account younger than 30 days — use an older throwaway
SEARCH_PAGES_PER_GUILD'i çok yüksek ayarlama (default 4 yeterli)- Raising
SEARCH_PAGES_PER_GUILDtoo high (default 4 is enough)
- Yalnızca kendi yönettiğin topluluğun moderasyonu için kullan
- Use only for moderating communities you yourself operate
- Raporları üçüncü taraflarla paylaşma; taciz/dox amaçlı kullanma — suç teşkil edebilir
- Don't share reports with third parties; never use for harassment or doxxing — may be a criminal offense
- KVKK / GDPR yükümlülükleri sana aittir; analist sıfatınla veri işleyen sensin
- GDPR/CCPA-like obligations are yours; you are the data processor
- Yaş ve cinsiyet tahminleri kesinlik değil — confidence düşükse karar verme
- Age and gender hints are estimates, not facts — don't decide on low-confidence signals
Yeni throwaway al, sunuculara yavaşça yeniden katıl, .env'de DISCORD_TOKEN'i güncelle, npm start ile yeniden başlat. Veri kaybı olmaz çünkü zaten persistence yoktur.
Get a new throwaway, re-join the servers slowly, update DISCORD_TOKEN in .env, restart with npm start. No data loss — nothing was persisted.
5.KomutlarCommands
| Komut | Command | Açıklama | Description |
|---|---|---|---|
/lookup <id> |
Tam analiz — kimlik, alias, mesajlar, voice, profil, risk, davranışsal NLP, güven puanı. İki HTML rapor ek olarak gelir. Full analysis — identity, aliases, messages, voice, profile, risk, behavioral NLP, confidence score. Two HTML reports attached. | ||
/status |
Servis sağlığı, RAM cache boyutu, uptime Service health, RAM cache size, uptime | ||
/help |
Komut listesi Command list | ||
Rate limit: 6 lookup/dakika (default). Aşımda Telegram'a "rate limited" yanıtı döner; API çağrısı gönderilmez. Rate limit: 6 lookups/min (default). When exceeded, Telegram receives a "rate limited" reply; no API call is dispatched.
6.YapılandırmaConfiguration
6.1 Discord kullanıcı tokeni
6.1 Discord user token
- Tarayıcıda (incognito) throwaway hesabıyla
https://discord.com/app'i aç - In an incognito browser, open
https://discord.com/appwith the throwaway account - F12 → Network sekmesiNetwork tab →
/apifilter → Fetch/XHR - Bir kanala tıkla; listeden bir
messagesisteğine tıkla - Click a channel; then click a
messagesrequest in the list - Sağ panelde Headers → Request Headers →
Authorization:alanı tokendir - In the right panel: Headers → Request Headers → the
Authorization:value is the token
6.2 Telegram bot tokeni
6.2 Telegram bot token
- @BotFather →
/newbot - Görüntü adı ve kullanıcı adı belirle (kullanıcı adı
_botile bitmeli) - Set a display name and username (username must end in
_bot) - Verilen tokeni
.env'deTELEGRAM_BOT_TOKENalanına yapıştır - Paste the token into
.envunderTELEGRAM_BOT_TOKEN /setprivacy→Disable
6.3 Admin chat ID
6.3 Admin chat ID
- @userinfobot ile sohbet aç, otomatik yanıt verirstarts a chat, replies automatically
Id:alanındaki sayıyı.env'eADMIN_CHAT_IDS=…şeklinde ekle (virgülle çoklu)- Add the
Id:value to.envasADMIN_CHAT_IDS=…(comma-separated for multiple)
6.4 Ayarlanabilen önemli env değerleri
6.4 Notable env values
| Variable | Default | Default | Açıklama | Description |
|---|---|---|---|---|
RATE_LIMIT_LOOKUP_PER_MIN | 6 | Telegram /lookup limitiTelegram /lookup limit | ||
SEARCH_PAGES_PER_GUILD | 4 | Sayfa başı 25 mesaj (default 100/server)25 messages/page (default 100/server) | ||
SEARCH_MAX_GUILDS | 50 | Lookup başına search yapılacak sunucu sayısıServers searched per lookup | ||
SEARCH_DELAY_BETWEEN_GUILDS_MS | 1500 | Sunucu arası gecikme (ban riski azaltır)Inter-guild delay (lowers ban risk) | ||
MSG_CACHE_TOTAL | 50000 | RAM'de tutulacak toplam mesaj sayısı (LRU)Total messages held in RAM (LRU) | ||
7.Analiz katmanlarıAnalysis layers
Risk taraması
Risk scan
Mesaj sample'larında lokal regex pattern'leri çalışır. Hiç dış API çağrısı yapmaz. Bulunan flag'ler kimlik raporunun başında pill'lerle gösterilir.
Local regex patterns over message samples; no external API. Flags appear as pills at the top of the identity report.
| Kategori | Category | Seviye | Severity | Örnek | Example |
|---|---|---|---|---|---|
nitro-scam | high | "free nitro", "discord.gift/..." | |||
phishing-url | high | "steamcommunity.ru", "disc0rd.gg" | |||
token-grabber | high | "token grabber", webhook URL pattern | |||
crypto-scam | medium | "metamask verify", "free btc airdrop" | |||
mass-mention | medium | 5+ mention veya @everyone tekrarı5+ mentions or repeated @everyone | |||
suspicious-link | low | bit.ly, tinyurl, cutt.ly | |||
invite-spam | low | Tek mesajda 2+ Discord davet2+ Discord invites in one message | |||
Davranışsal NLP
Behavioral NLP
Kullanıcının kendi yazdığı mesajları ve rol etiketlerini analiz eder. 4 çıkarım: dil (TR/EN/AR/RU/DE/ES/FR), yaş (self-mention + nickname numerics), cinsiyet (rol + self-mention), ton (pozitif/nötr/negatif/karışık + küfür/CAPS/emoji oranı). Her çıkarım için low/medium/high confidence band'i gösterilir.
Analyzes the user's own messages and role labels. Four outputs: language (TR/EN/AR/RU/DE/ES/FR), age (self-mention + nickname numerics), gender (roles + self-mention), tone (positive/neutral/negative/mixed + profanity/CAPS/emoji rates). Each shown with a low/medium/high confidence band.
Güven puanı
Confidence score
0–100 puan. Raporun ne kadar zengin sinyale dayandığını ölçer — kullanıcı suçluluğunu değil. Faktörler: mutual guild sayısı (25), mesaj hacmi (25), profil sinyalleri (15), hesap yaşı (15), recency (10), search coverage (10). Bantlar: 0-34 düşük · 35-59 orta · 60-79 yüksek · 80+ çok yüksek.
A 0–100 score. Measures how rich the underlying signals are, not the user's guilt. Factors: mutual guild count (25), message volume (25), profile signals (15), account age (15), recency (10), search coverage (10). Bands: 0-34 low · 35-59 medium · 60-79 high · 80+ very-high.
8.BakımMaintenance
systemd ile 7/24 çalıştırma
Run 24/7 with systemd
sudo adduser --system --no-create-home --group --shell /usr/sbin/nologin echidna
sudo mkdir -p /opt/echidna
sudo cp -r dist node_modules package.json deploy /opt/echidna/
sudo cp .env /opt/echidna/.env
sudo chown -R echidna:echidna /opt/echidna
sudo chmod 600 /opt/echidna/.env
sudo cp deploy/echidna.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now echidna
sudo journalctl -u echidna -f
echidna.service hardening (ReadOnlyPaths, NoNewPrivileges, MemoryDenyWriteExecute, syscall filter) içerir. sudo systemd-analyze security echidna exposure ≤ 2.0 hedefler.
The echidna.service unit includes hardening (ReadOnlyPaths, NoNewPrivileges, MemoryDenyWriteExecute, syscall filter). Target: sudo systemd-analyze security echidna exposure ≤ 2.0.
Token yenileme
Token rotation
# Discord veya Telegram tokeni değişince
# When the Discord or Telegram token changes
sudo nano /opt/echidna/.env
sudo systemctl restart echidna
Güncelleme deploy
Deploy an update
# geliştirme makinesinde yeni tar.gz hazırla, sonra:
# build a new tar.gz on the dev machine, then:
sudo systemctl stop echidna
sudo rm -rf /opt/echidna/dist /opt/echidna/node_modules
sudo tar xzf /tmp/echidna.tar.gz -C /opt/echidna/
sudo -u echidna bash -c 'cd /opt/echidna && npm ci --include=dev && npm run build'
sudo systemctl start echidna
9.Sık sorulan sorularFrequently asked questions
Discord ID nasıl alınır?
How do I get a user's Discord ID?
Discord → Settings → Advanced → Developer Mode → kullanıcıya sağ tık → Copy User ID.
Discord → Settings → Advanced → Developer Mode → right-click the user → Copy User ID.
Drag-drop ile dosya transferi VM'de çalışmıyor
Drag-drop file transfer to the VM doesn't work
VMware/VirtualBox'ın drag-drop modülü kararsızdır. scp ile aktar (yukarıdaki hızlı kurulum adım 2).
VMware/VirtualBox's drag-drop is unreliable. Use scp instead (see Quickstart step 2).
npm ci sırasında "tsc: not found" hatası
"tsc: not found" during npm ci
Shell'de NODE_ENV=production set edilmişse devDependencies kurulmaz. unset NODE_ENV sonra npm ci --include=dev çalıştır.
If your shell has NODE_ENV=production set, devDependencies are skipped. Run unset NODE_ENV then npm ci --include=dev.
Tüm mesajlar görünmüyor
Not all messages are visible
Discord search API sayfa başına 25 mesaj döner. Default SEARCH_PAGES_PER_GUILD=4 = sunucu başına 100 mesaj. Raporda "showing N of M" dipnotu kaçırılan miktarı söyler. Daha yüksek değer (8 veya 20) ban riskini artırır.
Discord's search API returns 25 messages per page. Default SEARCH_PAGES_PER_GUILD=4 = 100/server. The "showing N of M" footnote in the report tells you what was missed. Higher values (8 or 20) raise ban risk.
Risk flag false positive — ne yapmalıyım?
A false-positive risk flag — what now?
Risk paneli bir öneri sistemidir. Evidence kısmında orijinal mesaj görünür; bağlamla beraber değerlendir. Örneğin "bit.ly" her zaman scam değildir.
The risk panel is advisory. Evidence shows the original message; judge in context. "bit.ly" isn't always a scam.
Yaş/cinsiyet tahmini güvenilir mi?
Are age/gender estimates reliable?
Hayır, tahmindir. "high" confidence = açık self-mention veya rol etiketi. "low" = nickname numerics veya zayıf ipucu. Hiçbiri kesinlik değildir; düşük confidence'a göre karar verme.
No — they are estimates. "high" = explicit self-mention or role label. "low" = nickname numerics or weak hint. Never facts; don't decide on low-confidence signals.
Cloud VM kullanabilir miyim?
Can I use a cloud VM?
Önerilmez. Datacenter IP'leri Discord tarafından bilinir; hesap saatler içinde banlanır. Lokal VM veya Raspberry Pi tercih et. Mecbursan WireGuard ile ev IP'sine tünel.
Not recommended. Datacenter IPs are well known to Discord; the account is typically banned within hours. Prefer a local VM or a Raspberry Pi. If you must, tunnel egress via WireGuard to a home IP.