Bu prompt'u production'daki Claude'a ver. SQL sorgularını çalıştırıp eşik değerlerini belirleyecek.
Abuse Detection (Suistimal Tespit) sistemi için production veritabanından analiz yapıp HTML rapor oluşturmanı istiyorum.
## AMAÇ
B2B müzik platformumuzda (Muzibu) hesap paylaşımı tespiti yapıyoruz. 1 abonelik = 1 aktif stream kuralımız var. Eş zamanlı 2+ stream = suistimal şüphesi.
Şu anki eşikler çok agresif, normalin ne olduğunu belirlemek için GERÇEK VERİLERE bakmamız gerekiyor.
## ÇALIŞTIRMAN GEREKEN SQL'LER
Bunları sırasıyla çalıştır ve sonuçları HTML rapora yaz:
### 1. Günlük Toplam Dinleme (Son 30 Gün)
```sql
SELECT DATE(created_at) as tarih, COUNT(*) as dinleme,
COUNT(DISTINCT user_id) as benzersiz_kullanici
FROM muzibu_song_plays
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(created_at)
ORDER BY tarih DESC;
```
### 2. Kullanıcı Başına Günlük Dinleme Dağılımı (Son 14 Gün)
```sql
SELECT
CASE
WHEN daily_plays BETWEEN 1 AND 5 THEN '01-05'
WHEN daily_plays BETWEEN 6 AND 15 THEN '06-15'
WHEN daily_plays BETWEEN 16 AND 30 THEN '16-30'
WHEN daily_plays BETWEEN 31 AND 50 THEN '31-50'
WHEN daily_plays BETWEEN 51 AND 100 THEN '51-100'
WHEN daily_plays BETWEEN 101 AND 200 THEN '101-200'
WHEN daily_plays BETWEEN 201 AND 500 THEN '201-500'
WHEN daily_plays > 500 THEN '500+'
END as aralik,
COUNT(*) as kullanici_gun_sayisi,
COUNT(DISTINCT user_id) as benzersiz_kullanici
FROM (
SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
FROM muzibu_song_plays
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
GROUP BY user_id, DATE(created_at)
) sub
GROUP BY aralik
ORDER BY FIELD(aralik, '01-05', '06-15', '16-30', '31-50', '51-100', '101-200', '201-500', '500+');
```
### 3. En Çok Dinleyen Top 30 Kullanıcı (Günlük Max)
```sql
SELECT
sp.user_id,
u.name,
u.email,
DATE(sp.created_at) as tarih,
COUNT(*) as gunluk_dinleme,
COUNT(DISTINCT sp.ip_address) as farkli_ip,
COUNT(DISTINCT sp.browser) as farkli_browser,
COUNT(DISTINCT CONCAT(COALESCE(sp.ip_address,''), '|', COALESCE(sp.browser,''), '|', COALESCE(sp.platform,''))) as farkli_fingerprint
FROM muzibu_song_plays sp
JOIN users u ON sp.user_id = u.id
WHERE sp.created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
GROUP BY sp.user_id, u.name, u.email, DATE(sp.created_at)
ORDER BY gunluk_dinleme DESC
LIMIT 30;
```
### 4. Eş Zamanlı Dinleme (Overlap) Analizi — Sadece Farklı Fingerprint
```sql
SELECT
p1.user_id,
u.name,
DATE(p1.created_at) as tarih,
COUNT(*) as overlap_sayisi
FROM muzibu_song_plays p1
JOIN muzibu_song_plays p2 ON p1.user_id = p2.user_id
AND p1.id < p2.id
AND p1.created_at < DATE_ADD(p2.created_at, INTERVAL COALESCE(p1.duration, 180) SECOND)
AND p2.created_at < DATE_ADD(p1.created_at, INTERVAL COALESCE(p1.duration, 180) SECOND)
AND CONCAT(COALESCE(p1.ip_address,''), '|', COALESCE(p1.browser,''), '|', COALESCE(p1.platform,''))
!= CONCAT(COALESCE(p2.ip_address,''), '|', COALESCE(p2.browser,''), '|', COALESCE(p2.platform,''))
JOIN users u ON p1.user_id = u.id
WHERE p1.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY p1.user_id, u.name, DATE(p1.created_at)
HAVING overlap_sayisi > 5
ORDER BY overlap_sayisi DESC
LIMIT 30;
```
### 5. Ortalama ve Percentile İstatistikleri
```sql
-- Genel ortalama
SELECT
COUNT(DISTINCT user_id) as toplam_aktif_kullanici,
ROUND(AVG(daily_plays), 1) as ortalama_gunluk_dinleme,
MIN(daily_plays) as min_gunluk,
MAX(daily_plays) as max_gunluk
FROM (
SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
FROM muzibu_song_plays
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
GROUP BY user_id, DATE(created_at)
) sub;
-- Abonelik durumuna göre
SELECT
CASE WHEN u.subscription_expires_at > NOW() THEN 'Aktif Abone' ELSE 'Abone Değil' END as durum,
COUNT(DISTINCT sub.user_id) as kullanici,
ROUND(AVG(sub.daily_plays), 1) as ort_gunluk
FROM (
SELECT user_id, DATE(created_at) as d, COUNT(*) as daily_plays
FROM muzibu_song_plays
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
GROUP BY user_id, DATE(created_at)
) sub
JOIN users u ON sub.user_id = u.id
GROUP BY durum;
```
### 6. Aktif Abone Sayısı ve B2B Müşteri Bilgisi
```sql
SELECT COUNT(*) as aktif_abone FROM users WHERE subscription_expires_at > NOW();
SELECT COUNT(*) as toplam_kullanici FROM users;
```
## HTML RAPOR FORMAT
Sonuçları `public/readme/2026/02/28/abuse-esik-analiz/v1/index.html` konumuna Tailwind CDN dark mode ile yaz.
Raporda şunlar olsun:
1. **Günlük Dinleme Trendi** — Tablo + ortalama
2. **Kullanıcı Dağılım Histogramı** — Kaç kullanıcı hangi aralıkta
3. **Top 30 En Çok Dinleyen** — Günlük max, IP/browser çeşitliliği ile
4. **Overlap Analizi** — Gerçekten eş zamanlı farklı cihazdan dinleyenler
5. **İstatistikler** — Ortalama, median, percentile
6. **Eşik Önerisi** — Verilere dayanarak:
- Günde X şarkı altı = kesinlikle normal (P75 gibi)
- Günde Y şarkı üstü = şüpheli (P95 gibi)
- Z overlap üstü = kesinlikle suistimal
- Önerilen THRESHOLD_SUSPICIOUS ve THRESHOLD_ABUSE değerleri
## ÖNEMLİ NOTLAR
- Bu B2B müzik platformu — 1 hesap = 1 işletme (restoran, kafe, mağaza)
- 7/24 dinleme NORMAL (mağaza müziği)
- Yüksek hacim NORMAL (kalabalık mekan)
- Önemli olan FARKLI CİHAZDAN eş zamanlı dinleme
- Footer'da "Claude AI" yazma, sadece "28 Şubat 2026 • Muzibu.com.tr"
- Dosya izinleri: chown tuufi.com_:psaserv, chmod 644
| Pattern | Eski Puan | Yeni Puan (Önerilen) | Max |
|---|---|---|---|
| Concurrent Different (Farklı Cihaz) | overlap × 50 | overlap × 5 | 500 |
| Split Stream (Bölünmüş Akış) | overlap × 30 | overlap × 3 | 300 |
| Ping-Pong | döngü × 100 | döngü × 20 | 200 |
| Eşik | Eski | Yeni (Önerilen) | Anlamı |
|---|---|---|---|
| THRESHOLD_SUSPICIOUS | 100 | 200 | ~40 CD overlap |
| THRESHOLD_ABUSE | 300 | 500 | ~100 CD overlap |
* Bu değerler production analiz sonucuna göre güncellenecek