Giriş

Bu adım adım rehber ile sıfırdan tamamen çalışan bir Telegram botu oluşturacaksınız. Bu bot, bir proxy listesini otomatik olarak izler, yanıt sürelerini ölçer, dönüşüm sonrası IP değişikliğini tespit eder, ip-api.com servisi aracılığıyla coğrafi konumu kontrol eder ve sorunlar ve degrade durumları olduğunda Telegram'a bildirim gönderir. Fikirden VPS üzerinde otomatik başlatma, SQLite ile geçmiş kaydı ve uptime istatistikleri ve günlüklerin dışa aktarımı için basit bir kontrol paneline kadar adım adım geçeceğiz.

Rehber, yeni başlayanlar için tasarlanmıştır ancak ileri düzey öğeler de içermektedir. Eğer daha önce bir bot yazmadıysanız endişelenmeyin: her adımı detaylı bir şekilde inceleyeceğiz, nedenini açıklayacağız ve sonucu nasıl kontrol edeceğimizi öğreteceğiz. Kılavuzun sonunda, her 5-15 dakikada bir çalışan, proxy'leri bölgelere ve türlerine göre gruplayabilen ve Telegram'a bilgilendirici uyarılar gönderebilen, stabil bir proxy izleme aracına sahip olacaksınız.

Başlamadan önce, terminali nasıl açacağınızı, programları nasıl kuracağınızı ve dosya ve klasör nasıl yaratacağınızı bilmek faydalı olacaktır. Diğer her şeyi açıklayacağız. Tüm adımların tamamlanması yaklaşık 4 ila 8 saat sürer, bu süreye ortamın ayarlanması, kod yazma, testler ve dağıtım dahildir. Eğer zaten bir VPS'niz var ve Python konusunda temel becerileriniz varsa, süreniz kısalır.

Kılavuzun sonunda elde edeceğiniz şeyler: aiogram 3 ile çalışan bir Telegram botu, aiohttp ile asenkron kontrol modülü, dönemsel görevler için APScheduler, günlük ve istatistiklerle SQLite veritabanı, temel kriterleri barındıran basit bir web kontrol paneli ve fonksiyonelliği genişletmeye yönelik bakım ve geliştirme talimatları.

Tavsiye: Kılavuzu adım adım ilerleyerek takip etmek en iyisidir. Her aşamada, her şeyin doğru çalıştığından emin olmanız için kontrol ekledik.

Ön Hazırlık

Kodu yazmadan önce, gerekli tüm araçları ve ortamı hazırlayalım. Bu, rastgele hatalardan kaçınmanıza ve zaman kazandırmanıza yardımcı olacak.

Gerekli Araçlar, Programlar ve Erişimler

  • Botu oluşturmak ve bildirim almak için bir Telegram hesabı.
  • VPS veya Linux (Ubuntu 22.04 veya 24.04 öncelikli) kullanan yerel bir bilgisayar. Windows ve macOS üzerinde de çalışabilir, ancak dağıtımı Ubuntu üzerinde göstereceğiz.
  • Python 3.11 veya daha yenisi. Versiyonunu python3 --version komutu ile kontrol edeceğiz.
  • Paketleri kurmak için terminal ve temel sudo yetkileri.
  • İzlenecek proxy listesi, formatı host:port, eğer gerekiyorsa kullanıcı adı ve şifre. HTTP, HTTPS ve SOCKS5'i destekleyeceğiz.

Sistem Gereksinimleri

  • 1 CPU, 512-1024 MB RAM, 5-15 dakikalık aralıklarla 50-200 proxy için yeterlidir. Binlerce proxy için 2 CPU ve 2 GB RAM daha iyidir.
  • Diskte 1 GB boş alan. SQLite hafif bir sistemdir, ancak günlükler büyür.
  • Açık bir internet bağlantısı. Telegram API'sine ve proxy'lerinize erişim gereklidir. ip-api.com için çıkış HTTP erişimi gerekir.

Kurulması Gerekenler

  • Python 3.11+ ve sanal ortam için venv.
  • Bağımlılıkların kurulması için pip.
  • Kütüphaneler: aiogram versiyonu 3, aiohttp, APScheduler, aiosqlite, python-dotenv (rahat yapılandırma için), uvloop (Linux için opsiyonel), yarl (sıklıkla bağımlılık olarak gelir).

Yedekleme Oluşturma

Başlangıçta yedekleme kritik değildir. Bot çalışmaya başladıktan sonra, günlükler ve ayarlarla basit bir SQLite yedekleme ayarlamamız gerekir. Bu, hatalı güncellemeler veya dosya hasarı durumunda geri dönmenizi sağlar.

⚠️ Dikkat: SQLite tek bir dosyadır. Beklenmedik bir güç kesilmesi durumunda bozulursa, yeni kayıtları kaybedebilirsiniz. Bu yüzden VPS üzerinde cron veya systemd zamanlayıcıları aracılığıyla dosya yedekleme işlemini otomatik hale getirmelisiniz. Bu konuda basit bir script'i sonunda göstereceğiz.

Temel Kavramlar

Karışıklığı önlemek için, ana terimlerle ve çalışma prensipleriyle anlaşalım.

  • Proxy - İsteklerinizin geçtiği aracı sunucu. HTTP, HTTPS ve SOCKS5 türleri vardır. Proxy, kullanıcı adı:şifre ya da IP bağlılığı ile oturum açmayı gerektirebilir.
  • Latency (gecikme) - Proxy üzerinden yaptığımız isteğin yanıtını alma zamanıdır. Milisaniye cinsinden ölçülür. Ne kadar azsa o kadar iyidir.
  • IP Değişimi - Bazı proxy'ler periyodik olarak dış IP adresini değiştirir. Botumuz bu değişiklikleri izlemeli ve eğer IP beklenmedik bir şekilde değişirse ya da beklenen bölge ile uyuşmuyorsa bildirim göndermelidir.
  • Coğrafi Konum (Geo) - IP adresinin ülke, şehir ve operatörü. IP üzerinden ip-api.com servisiyle alınır. Bu, proxy'nizin istenilen ülkede olduğunu kontrol etmenize yardımcı olur.
  • Degradasyon - Proxy yanıt veriyor, ancak normalden çok daha yavaş ya da sık hatalarla. DOWN (tamamen erişilemez) ve DEGRADED (çalışıyor ama kötü) olarak ayırt edeceğiz.
  • aiogram 3 - Telegram botları için modern asenkron kütüphane. Basit, hızlı, 2026 yılında Telegramdaki tüm güncel özellikleri destekliyor.
  • aiohttp - Zaman aşımı ve proxy desteği ile asenkron HTTP istekleri.
  • APScheduler - N dakikada bir kontrolleri başlatacak görev planlayıcısı.
  • SQLite - Gömülü veritabanı. Tek bir dosya, hızlı ve sunucu kurulumu gerektirmiyor. Yerel günlük ve istatistikler için oldukça uygundur.

Botun çalışma prensibi şöyledir: Programlama ile bot, proxy listesini alır, her bir proxy üzerinden hızlı test istekleri yapar, yanıt süresini ölçer, dış IP'yi ve coğrafi verileri alır, sonuçları SQLite'a kaydeder. Proxy düştüğünde veya önemli ölçüde degrade olduğunda, bot düzgün bir mesaj oluşturur ve Telegram'a gönderir. Ayrıca bot, sohbetten gelen komutlara yanıt verir: durumu göster, uptime, son hataları, CSV dışa aktar, proxy ekle veya devre dışı bırak, aralığı değiştir.

Tavsiye: ip-api.com limitlerini aşmamak için (genellikle ücretsiz seviyede dakikada 45 isteğe izin verilir), geo verileri için bir önbellek ve coğrafi konum isteklerinizi sınırlayacağız. Bu, çalışmayı yavaşlatmayacak, ama engellenmeyi önleyecektir.

Adım 1: Telegram'da Bot Oluşturma ve Erişimi Ayarlama

Aşama Hedefi

Telegram botunun token'ını almak ve botun olayları hakkında mesaj gönderebileceği özel bir sohbet oluşturmak.

Adım Adım Talimatlar

  1. Telefonunuzda veya bilgisayarınızda Telegram uygulamasını açın.
  2. Ara çubuğuna BotFather yazın ve mavi onay simgesi olan resmi hesabı açın.
  3. Başlat'a tıklayın veya /start komutunu yazın, ardından /newbot komutunu girin.
  4. Botunuza bir isim verin. Örneğin: ProxyMonitorBot.
  5. Bot için bot ile biten benzersiz bir kullanıcı adı oluşturun. Örneğin: proxy_monitor_helper_bot.
  6. Verilen token'ı kopyalayın. Bu, iki nokta ile ayrılmış harf ve rakamlardan oluşan bir dizi gibi görünecektir.
  7. Botun bildirim göndereceği özel bir sohbet veya grup oluşturun. Botu oraya ekleyin.
  8. Sohbette herhangi bir mesaj yazın, böylece sohbet, hesabınız için listede belirecektir.
  9. Bota diyalog açın ve başlatmak için Start'a tıklayın.

Önemli Noktalar: Token'ınızı gizli tutun. Hiç kimseye vermeyin. Token sızdığında kötü niyetli kişiler botunuza erişim sağlayabilir. Eğer token'ınız sızarsa, BotFather'da /revoke seçeneğini seçerek yeni bir tane alın.

Tavsiye: Uyarılar için yalnızca sizin ve botun bulunduğu ayrı bir grup oluşturun. Böylece bildirimler diğer mesajlar arasında kaybolmaz.

✅ Kontrol: Token'ı aldınız ve botu gerekli sohbete eklediniz. Bot, kişisel diyalogda /start komutuna yanıt veriyor.

Olası Sorunlar ve Çözümleri

  • Proble: Bot /start komutuna yanıt vermiyor. Sebep: Start'a tıklamadınız ya da token kodda yanlış girildi. Çözüm: Botun etkin olduğundan emin olun ve daha sonra .env dosyasında token'ı doğru belirttiğimizden emin olun.
  • Proble: Sohbet ID'sini göremiyorsunuz. Sebep: Henüz almadık. Çözüm: Daha sonra botun içindeki komut otomatik olarak chat_id'yi gösterecektir.

Adım 2: Python Ortamını ve Proje Yapısını Hazırlama

Aşama Hedefi

Proje için bir çalışma klasörü oluşturmak, sanal Python 3.11+ ortamı oluşturmak, bağımlılıkları yüklemek, yapılandırmayı ayarlamak ve klasör yapısını oluşturmak.

Adım Adım Talimatlar

  1. Terminali açın veya VPS'ye SSH ile bağlanın.
  2. Python versiyonunu kontrol edin: python3 --version. Eğer versiyon 3.11'den düşükse, güncel version'ı yükleyin.
  3. Ubuntu üzerinde şu komutu uygulayın: sudo apt update; sudo apt install -y python3.11 python3.11-venv python3-pip.
  4. Proje klasörünü oluşturun: mkdir proxy-monitor-bot; cd proxy-monitor-bot.
  5. Sanal ortam yaratın: python3.11 -m venv .venv.
  6. Ortamı aktifleştirin: source .venv/bin/activate.
  7. pip'yi güncelleyin: pip install --upgrade pip.
  8. Bağımlılıkları yükleyin: pip install aiogram aiohttp aiosqlite APScheduler python-dotenv uvloop.
  9. Klasör yapısını oluşturun: mkdir app app/modules app/db app/bot app/web.
  10. Dosyaları oluşturun: touch app/__init__.py app/config.py app/main.py app/modules/proxy_checker.py app/db/models.py app/db/migrations.py app/bot/handlers.py app/bot/notifications.py app/scheduler.py app/web/server.py .env .env.example README.md.

Temel Yapılandırma

.env dosyasını açın ve anahtarları ekleyin (değerleri kendinizle değiştirin):

BOT_TOKEN=bot_tokeniniz TELEGRAM_CHAT_ID=sayı ya da boş bırak DB_PATH=./data/monitor.db PROBE_TIMEOUT=8 PROBE_RETRIES=2 CHECK_INTERVAL_MINUTES=10 GEO_CACHE_TTL_HOURS=24 IP_API_URL=http://ip-api.com/json PROXY_CONCURRENCY=20 GEO_CONCURRENCY=10 DASHBOARD_HOST=0.0.0.0 DASHBOARD_PORT=8080

.env dosyasını .env.example olarak kopyalayın ve gizli bilgileri silin, böylece projeyi token olmadan paylaşmanız kolaylaşır.

Tavsiye: .env dosyasını sürüm kontrol sisteminin dışına çıkartın. .gitignore dosyasına .env ekleyin ki token'ı yanlışlıkla yüklemeyin.

Minimum Kodu Yapılandırması

app/config.py dosyası çevresel değişkenleri okuyacak ve yapılandırmayı sağlayacak. app/main.py dosyası, botu, zamanlayıcıyı ve web kontrol panelini başlatacak. proxy_checker.py modülü tüm kontrolleri gerçekleştirecek. db klasöründe SQLite modelleri ve göçleri yer alacak. bot klasöründe komut işleyicileri ve bildirim gönderimi yapılacak. web klasöründe basit bir web sunucusu çalıştırılacak.

✅ Kontrol: Sizde bir sanal ortam mevcut, bağımlılıklar yüklü, bir .env dosyası oluşturdunuz ve proje yapısı listelenen ile eşleşiyor. Komut python -c "import aiogram, aiohttp, aiosqlite; print('ok')" ile ok'u görmelisiniz.

Olası Sorunlar ve Çözümleri

  • Proble: pip SSL hatası veya erişim hatası veriyor. Sebep: İnternete erişim yok. Çözüm: Ağı kontrol edin veya pip için yerel bir ayna kullanın.
  • Proble: Python 3.11 mevcut değil. Sebep: Eski işletim sistemi. Çözüm: Sistemi güncelleyin veya Python'u deadsnakes PPA ya da pyenv ile yükleyin.

Adım 3: Proxy Kontrol Modülünü Yazma: Bağlantı, Latency, IP, Coğrafi Konum

Aşama Hedefi

Proxy'leri hızla ve güvenilir bir şekilde kontrol eden asenkron bir modül oluşturmak: proxy üzerinden test HTTP isteği yapabilmeli, gecikmeyi ölçebilmeli, dış IP'yi öğrenebilmeli, ip-api.com üzerinden istek yapabilmeli, coğrafi verileri önbelleğe alabilmeli ve hataları düzgün bir şekilde işleyebilmelidir.

Ana Fikirler

  • Erişebilirliği kontrol etmek için basit bir kaynağa, örneğin https://api.ipify.org adresine veya hızlı bir echo uç noktasına istek yapıyoruz. Önce IP almak için web servisini, ardından geo için ip-api.com'u seçeceğiz. Tam tersini de yapabiliriz.
  • Varsayılan olarak zaman aşımı 8 saniye, deneme sayısı 2. Bu ayarlar .env üzerinden yapılandırılabilir.
  • aiohttp proxy ile iyi çalışıyor: ClientSession.request'e proxy parametresini gönderin.
  • Coğrafi konum için, IP bazında verileri 24 saat boyunca önbelleğe alıyoruz, böylece limitimizi harcamıyoruz.
  • Kontrolleri paralel olarak yapıyoruz, ancak eşzamanlılığı semafor ile sınırlıyoruz, böylece bağlantıları aşırı yüklemiyoruz ve ip-api limitlerine takılmıyoruz.

Detaylı Talimatlar

  1. app/modules/proxy_checker.py dosyasını açın.
  2. Proxy modelini sözlük olarak tanımlayın: id, label, type (http, https, socks5), endpoint (host:port), username, password, region, group, expected_country, last_ip.
  3. type, host, port ve isteğe bağlı olarak username:password'dan proxy_url oluşturacak asenkron bir build_proxy_url fonksiyonu oluşturun.
  4. save_delay parametresi ile dış IP'yi almak için proxy_url üzerinden fetch_ip(session, proxy_url) isimli asenkron bir fonksiyon oluşturun. IP'nizi JSON olarak döndüren https://api.ipify.org?format=json adresini kullanın. Zamanı çağrıdan önce ve cevapta ölçerek latency'yi elde edin.
  5. Geo verileri için önbellek oluşturarak, bellek içinde bir sözlük ve SQLite'de bir tablo oluşturun, böylece yeniden başlatmalarda önbelleği kaybetmeyin. Anahtar - IP, değer - ülke, şehir, organizasyon ve önbellekleme zamanının JSON şeklindedir.
  6. ip için ip-api.com/json/{ip}?fields=status,country,countryCode,regionName,city,org,query adresine GET isteği yapacak fetch_geo(session, ip) fonksiyonunu oluşturun. Statü fail ise hata belirtisi dönecektir. Başarılıysa geo verilerini döndürün.
  7. proxy için check_proxy(proxy) fonksiyonunu gerçekleştirin: proxy_url oluştur, IP almak için zaman aşımı ile dene, latency'yi ölç, ardından geo verilerini (önbellekten ya da ağdan) topla, sonucu oluştur: erişilebilirlik (ok), gecikme milisaniye olarak, dış IP, ülke ve şehir, ve sonuç tipi: UP, DEGRADED ya da DOWN.
  8. DEGRADED kriterlerini belirleyin: eğer latency belirli bir eşiğin üzerindeyse, örneğin 1500-2000 ms veya son kontrollerde hata oranı belirginse. Basitlik açısından: eğer yanıt varsa, ancak latency 2 saniyeden fazlaysa - DEGRADED, aksi takdirde UP. Eğer yanıt yoksa - DOWN.
  9. Günlüğü kaydetmek için detaylı sonuçları döndürün: timestamp, proxy_id, status, latency_ms ya da None, ip ya da None, geo ya da None, error_reason, changed_ip (True veya False, eğer IP önceki ile farklıysa), changed_geo (ülke değiştiyse), region, group, type.
  10. Hata işleme ekleyin: asyncio.TimeoutError, aiohttp.ClientConnectorError, aiohttp.ClientHttpProxyError, aiohttp.ClientProxyConnectionError, sock errors. error_reason alanına kısa bir açıklama yazın.

Örnek Kod (basitleştirilmiş, tek satırda)

Temel mantık için burada sıkıştırılmış bir örnek: import asyncio, time, json, aiohttp; async def check_proxy(proxy, cfg, geo_cache, sem): async with sem: start=time.perf_counter(); purl=f"{proxy['type']}://{proxy.get('username', '')+(':'+proxy.get('password','') if proxy.get('username') else '')+'@' if proxy.get('username') else ''}{proxy['endpoint']}"; timeout=aiohttp.ClientTimeout(total=cfg['PROBE_TIMEOUT']); try: async with aiohttp.ClientSession(timeout=timeout) as s: t0=time.perf_counter(); async with s.get('https://api.ipify.org?format=json', proxy=purl, ssl=False) as r: data=await r.json(); ip=data.get('ip'); latency=int((time.perf_counter()-t0)*1000); if not ip: raise Exception('no-ip'); geo=geo_cache.get(ip); if not geo or geo['ts']

Gerçek kodda, SQLite'de loglama ve GEO istekleri için semaforlar ekleyeceğiz, ayrıca düzgün zaman aşım ve tekrar deneme işlemleri gerçekleştireceğiz.

⚠️ Dikkat: ip-api.com'a çok fazla eşzamanlı istek göndermeyin. Eğer yüzlerce proxy içeren bir listeniz varsa sonuçları önbelleğe alın ve eşzamanlılığı sınırlayın. Bu, limitlere ve hatalara karşı korur.

✅ Kontrol: Tek bir test proxy için check_proxy fonksiyonunu manuel olarak çağırın ve sonucu yazdırın. UP veya DEGRADED statüsünü görmelisiniz.

Olası Sorunlar ve Çözümleri

  • Proble: ClientHttpProxyError hatası. Sebep: Proxy, istenen türü desteklemiyor ya da yanlış kimlik doğrulama. Çözüm: Türü ve kimlik bilgilerini kontrol edin, endpoint'i güncelleyin.
  • Proble: Geo her zaman unknown. Sebep: ip-api isteğinde hata ya da blokaj. Çözüm: IP_API_URL ve ağınızı kontrol edin, hata günlüğünü açın.

Adım 4: SQLite Veritabanını ve Geçmiş Günlüğünü Ayarlama

Aşama Hedefi

Proxy listesini, kontrol geçmişini, olayları, geo önbelleğini ve ayarları tutmak için SQLite'de tablolar oluşturmak. Bu, size detaylı istatistik ve grafikler oluşturma imkanı verecektir.

Veritabanı Yapısı

  • proxies: id, label, type, endpoint, username, password, region, group_name, expected_country, last_ip, enabled, created_at, updated_at.
  • checks: id, proxy_id, ts, status, latency_ms, ip, country, city, org, error_reason.
  • incidents: id, proxy_id, opened_at, closed_at, kind (DOWN veya DEGRADED), last_status, last_message, active.
  • geo_cache: ip, country, city, org, ts.
  • settings: key, value (örneğin, varsayılan kontrol aralığı).

Detaylı Talimatlar

  1. app/db/models.py dosyasını açın. Tabloları oluşturmak için SQL sabitlerini tanımlayın. Proxy_id ve ts üzerinden indeksler ekleyin, böylece seçimleri hızlandırın.
  2. db_path parametresi ile init_db(db_path) fonksiyonunu oluşturun, gerekirse data klasörünü oluşturun, aiosqlite.connect ile bağlantı açın ve tüm tablolar için create table if not exists işlemi gerçekleştirin.
  3. Sonuçları yazmak için fonksiyonlar ekleyin: add_proxy, update_proxy_last_ip, add_check, open_incident, close_incident_if_needed, upsert_geo_cache, get_recent_checks, get_uptime_stats.
  4. app/db/migrations.py dosyasında göçleri gerçekleştirin. İlk çalıştırma için tüm create table işlemleri yeterlidir. Versiyon güncellemelerinde, eksik sütunlar ekleyecektir.

Örnek SQL (tek satırda)

CREATE TABLE IF NOT EXISTS proxies (id INTEGER PRIMARY KEY AUTOINCREMENT, label TEXT, type TEXT, endpoint TEXT, username TEXT, password TEXT, region TEXT, group_name TEXT, expected_country TEXT, last_ip TEXT, enabled INTEGER DEFAULT 1, created_at INTEGER, updated_at INTEGER); CREATE TABLE IF NOT EXISTS checks (id INTEGER PRIMARY KEY AUTOINCREMENT, proxy_id INTEGER, ts INTEGER, status TEXT, latency_ms INTEGER, ip TEXT, country TEXT, city TEXT, org TEXT, error_reason TEXT, FOREIGN KEY(proxy_id) REFERENCES proxies(id)); CREATE INDEX IF NOT EXISTS idx_checks_proxy_ts ON checks(proxy_id, ts); CREATE TABLE IF NOT EXISTS incidents (id INTEGER PRIMARY KEY AUTOINCREMENT, proxy_id INTEGER, opened_at INTEGER, closed_at INTEGER, kind TEXT, last_status TEXT, last_message TEXT, active INTEGER, FOREIGN KEY(proxy_id) REFERENCES proxies(id)); CREATE TABLE IF NOT EXISTS geo_cache (ip TEXT PRIMARY KEY, country TEXT, city TEXT, org TEXT, ts INTEGER); CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT);

Tavsiye: Eğer proxy listenizi CSV veya JSON formatında saklıyorsanız, veritabanına kolay bir içe aktarma aracı ekleyin: Basit bir script dosyayı okur ve proxies tablosuna kayıt ekler.

✅ Kontrol: init_db fonksiyonunu çalıştırın ve DB_PATH'ta veritabanı dosyasının oluştuğundan emin olun. Tabloların oluşturulup oluşturulmadığını kontrol edin; proxy tablosundan select count(*) sorgusu çalıştırıp 0 yanıtı alın.

Olası Sorunlar ve Çözümleri

  • Proble: no such table hatası. Sebep: İnit işlemi yapılmadı. Çözüm: Uygulamanın başında tüm işlemlerden önce init_db çağrısını yapın.
  • Proble: Yazma engelleri. Sebep: Eşzamanlı işlemler. Çözüm: Mümkünse sonuç kayıtlarını gruplandırın ya da kısa süreli işlemler gerçekleştirin.

Adım 5: aiogram 3 üzerinde Telegram Botunun Gerçekleştirilmesi

Aşama Hedefi

Komutlara yanıt veren, sohbetinize bildirim gönderebilen ve .env dosyasından ayarları okuyan bir bot oluşturun. Temel komutları ayarlayalım: /start, /status, /chatid, /addproxy, /list, /enable, /disable, /interval, /export.

Detaylı Talimatlar

  1. app/bot/handlers.py dosyasını açın. Komutları yönlendirin. Aiogram 3 için Router, Dispatcher ve asenkron işleyicileri kullanın.
  2. /start komutunu gerçekleştirin: botun yeteneklerinin kısa bir tanımını ve mevcut kontrol aralığını yanıtlayın.
  3. /chatid komutunu gerçekleştirin: sohbet ID'sini gönderin, böylece TELEGRAM_CHAT_ID'yi .env dosyasına kaydedebilirsiniz. Bu, botu kişisel bir sohbetten veya gruptan başlatıyorsanız kullanışlıdır.
  4. /status komutunu gerçekleştirin: her proxy için en son N kontrolleri bulup kısa bir özet çıkartın: durum, latency, ülke, güncellemeye kadar geçen süre.
  5. /list komutunu gerçekleştirin: proxy listesini id, label, type, region, enabled ile gösterin.
  6. /addproxy komutunu gerçekleştirin: tip, endpoint, kullanıcı adı, şifre, bölge, grup, beklenen ülke gibi parametreleri geçin. İlk aşamada, yalnızca type=http, endpoint=host:port ve region=EU formatındaki bir string alacak basit bir versiyon yapabilirsiniz.
  7. /enable ve /disable komutlarını id parametreleri ile, böylece belirli bir proxy'yi hızlıca açıp kapatabilirsiniz.
  8. /interval N komutunu gerçekleştirin; böylece kontrol aralığını dakikada değiştirin. Değeri ayarlar tablosuna kaydedin.
  9. /export komutunu gerçekleştirin; belirli bir süre için en son kontrollerin CSV'sini oluşturun. Daha sonra, basit web kontrol panelinde benzer bir buton ekleyeceğiz.

Bildirim Gönderimi

app/bot/notifications.py dosyasında, olaylarla ilgili bir mesaj oluşturan notify_change fonksiyonunu yapın. Örnek bir mesaj: Proxy: EU-1 (http) Bölge: EU Grup: EUROPE Durum: DOWN Sebep: zaman aşımı Son IP: 203.0.113.45 Beklenen: ülke DE Alınan: ülke NL Zaman: 2026-02-01 12:34:56 Latency: n/a. UP için UP etiketini, DEGRADED için DEGRADED etiketini kullanın. Öncelik sırasına göre sıralama ekleyin: önce DOWN, sonra DEGRADED, daha sonra IP değişikliği ve coğrafi değişiklik. Mesajları görsel bir şekilde daha anlaşılır hale getirmek için ✅, ⚠️ ve ❌ emojileri ekleyin. TELEGRAM_CHAT_ID tanımlanmadan mevcut sohbetten gönderin, geminiz aleyhine kaydedin. Üretim ortamında, chat_id'yi .env ile sabitlemek daha iyidir.

Tavsiye: Gruplar için botun mesaj gönderebilmesi için yazma hakkına ihtiyacı olabilir. Botun mesaj atmasına izin verildiğinden emin olun.

✅ Kontrol: Botu yerel olarak başlatın ve /chatid gönderin. Sayısal bir kimlik almalısınız. .env dosyasındaki TELEGRAM_CHAT_ID'yi ayarlayın. /start ve /status gönderin. Bot yanıt vermelidir. /list komutu başlangıçta boş olabilir, bu normaldir.

Olası Sorunlar ve Çözümleri

  • Problem: Bot başlatılmıyor. Sebep: Hatalı token. Çözüm: .env dosyasındaki BOT_TOKEN'i kontrol edin, fazla boşluk ve satır sonlarını kontrol edin.
  • Problem: Komutlar çalışmıyor. Sebep: Router bağlı değil. Çözüm: Router'ı Dispatcher'a ekleyin ve polling'i çalıştırdığınızdan emin olun.

Adım 6: APScheduler'da Kontrol Planlayıcısı

Aşama Hedefi

Tüm açılan proxy'lerin mevcut ayarlarla 5-15 dakikada bir kontrol edilmesi için periyodik kontroller ayarlamak, kontrol geçmişini kaydetmek ve değişikliklerde uyarı göndermek.

Detaylı Talimatlar

  1. app/scheduler.py dosyasını açın. AsyncIOScheduler'ı başlatın.
  2. enabled=1 olan tüm proxy'leri veritabanından seçen ve bunları asenkron görev havuzuna gönderen run_checks görevini oluşturun.
  3. Her bir sonuçta checks tablosuna bir satır yazın. Sonuç değişirse proxies'te last_ip'yi güncelleyin.
  4. Olay mantığı: statu DOWN ve olay yoksa bir olay kaydı oluşturun (active=1). Eğer statu tekrar UP olursa, olayı kapatın (active=0, closed_at=ts). DEGRADED için benzer şekilde, DEGRADED'leri aktif bir olaya toplayabilir ya da iyileştiğinde kapatabilirsiniz.
  5. Uyarıları gönderin: ilk DOWN geçişinde, DEGRADED'de, UP'ya dönüşte, IP değiştiğinde veya ülke değiştiğinde. Aynı anda birden fazla proxy'nin durumunun değişmesi durumunda mesajları gruplandırın: etkin bir başlık gönderin ve öğelerin listesini paylaşın.
  6. scheduler.add_job(run_checks, 'interval', minutes=CHECK_INTERVAL_MINUTES, id='checks', replace_existing=True) görevini oluşturun. /interval komutuna tepki vererek botu başlatmadan önceki yeni aralığı başlatmalısınız.
  7. scheduler.start()'ı bot ve web sunucusuyla birlikte ana dosyada başlatın.

Tavsiye:

Tavsiye: Pik yükü azaltmak ve tam zamanlı senkronizasyon sorunlarından kaçınmak için 0-60 saniye arasında rastgele bir jitter ekleyin.

✅ Kontrol: CHECK_INTERVAL_MINUTES=1 değerini geçici olarak ayarlayın ve uygulamayı başlatın. Günlüklerde her dakikada bir kontrol gerçekleştirildiğini ve checks tablosuna yeni satırların eklendiğini görmelisiniz.

Olası Sorunlar ve Çözümleri

  • Proble: Kontroller başlamıyor. Sebep: Scheduler başlamıyor. Çözüm: scheduler.start()'ın çağrıldığından ve iş tanımlamalarının oluşturulurken hata almadığınızdan emin olun.
  • Proble: Veritabanı engelleri. Sebep: Aşırı sık kayıt. Çözüm: Aralığı düşürün ya da kayıtları toplu kaydedin.

Adım 7: Tüm Bileşenleri main.py'de Birleştirin

Aşama Hedefi

Uygulamayı bir araya getirin: yapılandırma, DB, bot, kontrol modülü, zamanlayıcı ve web kontrol paneli. Doğru başlatmayı ve durdurmayı sağlayın, bitiş sinyallerini işleyin.

Detaylı Talimatlar

  1. app/main.py dosyasını açın. asyncio, logging, uvloop (Linux için), aiogram, init_db, router, zamanlayıcı, web sunucu mühendislik paketlerini içe aktarın.
  2. .env dosyasından yapılandırmayı python-dotenv ile yükleyin. Zorunlu anahtarları kontrol edin: BOT_TOKEN ve DB_PATH.
  3. DB'yi başlatın: await init_db(DB_PATH).
  4. Dispatcher ve Router'ı aiogram 3 üzerinden oluşturun, komut işleyicilerini ekleyin.
  5. APScheduler için zamanlayıcı oluşturun ve görevleri aralığına göre ekleyin.
  6. Üç bileşeni aynı anda başlatın: botun polling işlemi, scheduler.start(), web kontrol paneli. Paralel başlatmak için asyncio.gather kullanın.
  7. SIGINT ve SIGTERM sinyallerini işleyin: zamanlayıcıyı düzgün şekilde durdurun, veritabanı bağlantılarını kapatın ve polling'i sonlandırın.

Kısaca başlatma mantığı: import asyncio, logging; async def main(): await init_db(...); dp=Dispatcher(); dp.include_router(router); scheduler=AsyncIOScheduler(); scheduler.add_job(run_checks, 'interval', minutes=interval); scheduler.start(); await asyncio.gather(dp.start_polling(bot), start_web_server(), wait_for_signals(scheduler)); asyncio.run(main()).

Tavsiye: INFO ve WARN seviyelerinde detaylı loglama ekleyin. Bu, başlatma sırasında ve kontroller gerçekleştirilirken neler olduğunu hızlıca anlamanıza yardımcı olacaktır.

✅ Kontrol: python app/main.py dosyasını çalıştırın. Bot, /start komutuna yanıt vermelidir, web kontrol paneli http://localhost:8080 adresinde açılmalı ve zamanlayıcı kontroller aralığında başlamalıdır.

Olası Sorunlar ve Çözümleri

  • Proble: 0.0.0.0:8080 adresi meşgul. Sebep: Port başka bir süreç tarafından kullanılıyor. Çözüm: .env dosyasındaki DASHBOARD_PORT'u değiştirin veya meşgul süreci durdurun.
  • Proble: polling başlatma hatası. Sebep: Yanlış token ya da ağ bağlantısı. Çözüm: BOT_TOKEN ve internet erişimini kontrol edin.

Adım 8: Bildirim Formatı ve Proxy Gruplama

Aşama Hedefi

Bildirimlerin anlaşılır, kompakt ve bilgilendirici olmasını sağlamak. Mesajların yapılandırılabilir olması için proxy'leri bölgelere ve türlere gruplamak.

Bildirim Formatı

  • Başlık: Proxy durum değişiklikleri.
  • Alt başlık: tarih ve saat.
  • Öncelik sırasına göre bölümler: DOWN, ardından DEGRADED, ardından Kurtarma, ardından IP Değişikliği, ardından coğrafi Değişiklik.
  • Her bir noktada: [Bölge] [Grup] [Etiket] ([tip]) durum, latency, IP, ülke, sebep.
  • İkonlar: DOWN ❌, DEGRADED ⚠️, UP ✅.

Proxy Gruplama

  • region alanına göre: EU, US, ASIA ve diğerleri.
  • group_name alanına göre: mantıksal gruplama, örneğin EUROPE, PAID, TESTING.
  • type alanına göre: http, https, socks5.

Uygulama

  1. app/bot/notifications.py dosyasında group_by_region ve group_by_type fonksiyonlarını oluşturun, böylece sonuçları gönderimden önce gruplandıralım. Bu, daha az mesaj göndermeyi ve okunabilirliği artırmayı sağlar.
  2. Her blok için, kritik verileri içeren kısa dizeler oluşturun: "EU, EUROPE, EU-1 (http): ❌ DOWN, zaman aşımı" ya da "US, AMERICA, US-2 (socks5): ⚠️ DEGRADED, 2300ms, ülke US".
  3. Eğer birçok değişiklik varsa, bir özet başlığı ve teyit edici bölgeler için birkaç mesaj gönderin. Bu, 100 ayrı mesaj göndermekten daha iyidir.

✅ Kontrol: Geçici olarak bir proxy'yi çalışmayan bir endpoint ile değiştirin. Kontrol ardından bir DOWN bildirimi alınıyor. Proxy'yi çalışır hale geri döndürdüğünüzde, IP ve ülke değişikliği durumunu bildiren bir bildirim alacaksınız.

Olası Sorunlar ve Çözümleri

  • Problem: Mesajlar çok uzun. Sebep: Fazla detay. Çözüm: Altyapıyı kesmek; detayları /status ya da /details id komutuyla görmek.
  • Problem: Tekrar eden uyarılar. Sebep: Statü değişmeden tekrar gönderim. Çözüm: Uyarıları yalnızca durum değişikliklerinde ve açık IP ya da ülke değişikliği olduğunda gönderin.

Adım 9: VPS'ye Dağıtım (Ubuntu) ve Otomatik Başlatma

Aşama Hedefi

Boti uzaktan sunucuda çalıştırmak, systemd üzerinden otomatik başlatma ayarlamak, loglama sağlamak ve güncellemeleri kolaylaştırmak.

VPS Hazırlığı

  1. VPS'ye bağlanın: ssh user@server_ip.
  2. Sistemi güncelleyin: sudo apt update && sudo apt upgrade -y.
  3. Yüklenmemişse, Python'u kurun: sudo apt install -y python3.11 python3.11-venv python3-pip.
  4. Uygulama için kullanıcı oluşturun, gerekiyorsa: sudo adduser botuser; ardından bu kullanıcıyla giriş yapın.
  5. Projeyi sunucuya scp ile veya git clone ile kopyalayın.
  6. Adım 2'deki gibi sanal ortamı oluşturun ve bağımlılıkları yükleyin.
  7. .env dosyasını kontrol edin. BOT_TOKEN ve TELEGRAM_CHAT_ID'yi gerçek değerlerle doldurun.

systemd Servisi

  1. Servis dosyasını oluşturun: sudo nano /etc/systemd/system/proxy-monitor.service.
  2. Örnek bir birim (tek satırda): [Unit] Description=Proxy Monitor Bot After=network.target [Service] Type=simple User=botuser WorkingDirectory=/home/botuser/proxy-monitor-bot ExecStart=/home/botuser/proxy-monitor-bot/.venv/bin/python -m app.main Environment=PYTHONUNBUFFERED=1 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target.
  3. Demonu yeniden yükleyin: sudo systemctl daemon-reload.
  4. Otomatik başlangıcı etkinleştirin: sudo systemctl enable proxy-monitor.service.
  5. Başlatın: sudo systemctl start proxy-monitor.service.
  6. Günlükleri kontrol edin: journalctl -u proxy-monitor.service -f.

Tavsiye: Eğer uvloop kullanıyorsanız, sanal ortamda kurulu olduğundan emin olun. Windows'ta uvloop kullanılmaz, Linux'ta performansı artırır.

✅ Kontrol: Bot, başlatılan servisten /start komutuna yanıt vermelidir. Günlüklerde zamanlayıcının ve web kontrol panelinin port 8080'de dinlemede olduğunu görmelisiniz.

Olası Sorunlar ve Çözümleri

  • Proble: Servis hemen kapanıyor. Sebep: Yanlış Python ya da çalışma dizini yolu. Çözüm: ExecStart ve WorkingDirectory'yi kontrol edin, kullanıcı izinlerini kontrol edin.
  • Proble: 8080 portuna dışarıdan erişim yok. Sebep: UFW ya da bulut güvenlik duvarı. Çözüm: Portu açın: sudo ufw allow 8080 ya da sağlayıcı panelinden kuralları ayarlayın.

Sonuç Kontrolü

Kontrol Listesi

  • Bot, /start, /status, /list, /chatid komutlarını alabiliyor.
  • Zamanlayıcı, kontrolleri aralıklarla başlatıyor, kayıtlar checks tablosunda görünüyor.
  • Proxy düştüğünde bot, Telegram'a bildirim gönderiyor.
  • IP değişimi kaydediliyor ve mesajlarda belirtiliyor.
  • Coğrafi konum belirleniyor ve beklenen ülkeyle karşılaştırılıyor.
  • Kontrol paneli belirtilen portta görüntüleniyor, uptime ve son olayları gösteriyor.
  • CSV dışa aktarımı çalışıyor ve doğru dosyayı üretiyor.

Test Etme

  1. Bir proxy'yi kapatın veya yanlış bir port belirtin. DOWN uyarısını bekleyin.
  2. Geçici olarak endpoint'i değiştirin, IP değişikliği meydana gelsin. Botun IP ve ülke değişikliklerini bildirdiğinden emin olun.
  3. Ağ kısıtlamalarıyla veya yoğun bir istekle latency'yi yapay olarak artırın ve DEGRADED durumunu elde edin.
  4. /interval 5, /list, /enable, /disable komutlarını kontrol edin ve durumun doğru şekilde yansıdığına emin olun.

Başarıyla Tamamlanma Göstergeleri

  • Hatalı bir günlük olmadan düzenli kontrollerin yapılması.
  • Gerçek sorunlarda zamanında gelen uyarılar.
  • Olay kaydı mantığının düzgün çalışması: DOWN durumunda açılma ve UP durumunda kapanma.

✅ Kontrol: Eğer kontrol listesindeki tüm maddeler geçiyorsa ve test senaryoları çalışıyorsa, botunuz başarıyla dağıtılmış ve izleme görevlerini düzenli olarak yerine getiriyor demektir.

Tipik Hatalar ve Çözümleri

  • Proble: Telegram'da bildirim yok → Sebep: Hatalı TELEGRAM_CHAT_ID veya bot grup üyesi değil → Çözüm: İlgili sohbette /chatid komutunu uygulayın, ID'yi .env dosyasına kaydedin ve botu sohbete ekleyip yazma yetkisi verin.
  • Proble: Tüm proxy'ler DOWN, oysa çalışıyorlar → Sebep: Proxy URL formatı hatalı veya tür → Çözüm: type=http, https veya socks5 kontrol edin, kullanıcı:şifre ve host:port'dan geçerli olduğundan emin olun, bir proxy'yi ayrı test edin.
  • Proble: Coğrafi konum belirlenemiyor → Sebep: ip-api limiti veya ağ hatası → Çözüm: Önbellekleme düzenleyin, ip-api'ya istek sıklığını azaltın, IP_API_URL'i kontrol edin.
  • Proble: Veri tabanı çok hızlı büyüyor → Sebep: Aşırı sık kontroller ve çok sayıda proxy → Çözüm: Aralığı artırın, eski kayıtları temizleyin, arşivleri dışa aktarın ve 30-90 gün öncekileri silin.
  • Proble: Tüm proxy'lerde yüksek gecikme → Sebep: Sunucu aşırı yüklenmiş ya da ağ sorunları → Çözüm: VPS kaynaklarını artırın, PROXY_CONCURRENCY'yi azaltın, yakın bölgeyi tercih edin.
  • Proble: Aynı olay için yineleyen uyarılar → Sebep: Olay durumu saklanmıyor → Çözüm: incidents tablosunu kullanın ve yalnızca durum değişikliği olduğunda alerji gönderin.
  • Proble: Bot, hatalar nedeniyle sık sık çöküyor → Sebep: Yakalanmamış hatalar → Çözüm: Ağ işlemlerini try-except ile sarın, günlükleme ve yeniden deneme ekleyin.

Ek Olanaklar

İleri Düzey Ayarlar

  • Esnek degrade eşik değeri: latency eşiklerini ayarlayın ve tüm gruplar için settings tablosunda saklayın.
  • Gruplar için farklı aralıklar: önemli proxy'leri 5 dakikada bir, ikinci dereceden olanları 15-30 dakikada bir kontrol edin.
  • Genişletilmiş komut ayrıştırma: key=value formatını ve parametrelerde sıkı doğrulama kullanın.

Optimizasyon

  • Linux üzerinde olay döngüsünü hızlandırmak için uvloop'yu etkinleştirin.
  • SQLite'deki kayıtları hızlandırmak için toplu kayıtlar veya WAL modunu kullanın.
  • Hızı ve yükü dengelemek için semaforları parametrize edin.

Basit Kontrol Paneli

app/web/server.py içinde aiohttp.web sunucusunu başlatın. Ana sayfada kritik bilgileri görüntüleyin: toplam proxy sayısı, kaç tane UP, DOWN, DEGRADED, ortalama latency, 24 saatlik uptime. /export?from=ts&to=ts endpointini CSV dışa aktarma işlemi için oluşturun. Minimum HTML, basit bir liste ve durumu gösteren bir tablo ile sınırlı olabilir. Grafik görselleştirmesi daha sonra basit SVG'ler yoluyla eklenebilir.

Tavsiye: Dashboard'da bir buton ekleyin, bu buton zamanlama değerlerini değiştirerek ayarları hızlandırır.

Yedeklemeler

Veritabanının yedekleme script: tar -czf backup-$(date +%F).tar.gz data/monitor.db. Günlük yedekleme cron veya systemd timer'ları ile ayarlanabilir. En az 7 arşivi saklayın.

⚠️ Dikkat: Veritabanı dosyasını anlık düzenlemeyin. Manuel düzenlemeler için servisi durdurun, yedek alın, düzenleyip tekrar başlatın.

SSS

  • Proxy oturum açılması nasıl eklenir? /addproxy komutunda, username ve password’u ya da endpoint'te user:pass ekleyin. Örneğin: type=http endpoint=user:pass@host:port.
  • Gece kontrollerini nasıl kısıtlarız? APScheduler'da cron benzeri bir program ayarlayıp zaman aralığı ekleyebilir ya da geceleyin aralığı otomatik bir kural ile artırabilirsiniz.
  • ip-api.com erişilemezse ne yapılmalı? Önbelleği kullanın ve coğrafi istekleri geçici olarak atlayın. Daha sonra alternatif bir geo kaynağı ekleyebilirsiniz.
  • Bildirimleri nasıl filtreleriz? Önem seviyeleri ve ayar ekleyin: yalnızca DOWN bildirimlerini gönderin, DEGRADED için toplamda bir kez bir saatte gönderin.
  • PostgreSQL kullanabilir miyiz? Evet. aiosqlite'yi asyncpg ile değiştirin, SQL ve bağlantıyı uyarlayın. Büyük hacimlerde daha uygundur.
  • Token'ları güvenli bir şekilde nasıl saklarız? .env dosyasında 600 izinle saklayın. Gerekirse zaman zaman token’ı güncelleyin.
  • Bot neden bazen zaman aşımı alıyor? Ağ bağlantıları istikrarsız olabilir. PROBE_TIMEOUT'ı artırın, eşzamanlılığı azaltın, yönlendirmeleri kontrol edin.
  • IPv6 proxy kontrol edilebilir mi? Evet, hedef hizmetler IPv6'yi destekliyorsa. Endpoint’in IPv6 döndürdüğünden ve ip-api'nin adresi düzgün işlediğinden emin olun.
  • Belirli bir iletişim operatörü nasıl izlenir? Mesajda ip-api'den gelen org değerini saklayın ve beklenen değerle karşılaştırın.
  • Proxy'yi nasıl geçici olarak devre dışı bırakabilirim? /disable id komutunu kullanın, böylece proxy'yi veritabanından silmeden kontrol dışı bırakabilirsiniz.

Sonuç

Fikirden çalışan bir çözüme kadar olan süreci tamamladınız: aiogram 3 üzerinde bir Telegram botu oluşturdunuz, aiohttp ile proxy kontrol modülü yazdınız, APScheduler'ı planlayıcı olarak ayarladınız, SQLite'da geçmişi kaydettiniz, düşme, degrade, IP ve coğrafi konum bildirimlerini gerçekleştirdiniz, uygulamayı VPS üzerinde dağıtımını yaptınız ve systemd üzerinden otomatik başlatmayı sağladınız, basit bir web kontrol paneli ile günlükleri dışa aktarma işlemini eklediniz. Şimdi ölçeklenebilir bir araca sahipsiniz: grupları ayırabilir, eşik değerlerini ayarlayabilir, grafik ve raporlar ekleyebilir, PostgreSQL'e yükleri artırırken geçirebilirsiniz. Bir sonraki adım, bakım otomasyonu olacak: günlük döngüsü ayarları, veritabanında günlük yedeklemeler, botun kendisini VPS sistemi metrikleri ile izleme. Daha ileriye gidebilirsiniz: bot komutlarına erişim için rol tabanlı model eklemek, grupların SLA raporları eklemek, alternatif coğrafi veri kaynaklarına bağlanmak ve mevcut bir kütüphane aracılığıyla web arayüzü oluşturmak. İyi şanslar ve proxy'lerinizin kararlı uptime'ı!