Merhabalar arkadaşlar , Daha önce kullandığım pyhon ile yazılmış Google Analytics e tamı tamına yansıyan kodlarımı veriyorum, artık kullanmıyorum requestte gectiğim için.

import asyncio
from playwright.async_api import async_playwright
import random
import time
import logging
import argparse
import os
import sys
import subprocess
import json
from datetime import datetime
from urllib.parse import urlparse
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(f"analytics_traffic_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log", encoding='utf-8'),
logging.StreamHandler()
]
)
logger = logging.getLogger()
class ProxyManager:
def __init__(self, proxy_file):
"""
Args:
proxy_file (str): Proxy dosyasının yolu
"""
self.proxy_file = proxy_file
self.proxies = []
self.working_proxies = []
self.load_proxies()
if not self.proxies:
logger.error(f"Proxy bulunamadi! Lutfen {proxy_file} dosyasini kontrol edin.")
raise FileNotFoundError(f"Proxy dosyası bulunamadı veya boş: {proxy_file}")
def load_proxies(self):
"""Dosyadan proxy'leri yükler"""
try:
with open(self.proxy_file, 'r') as file:
for line in file:
line = line.strip()
if line:
try:
parts = line.split(':')
if len(parts) >= 4:
host = parts[0]
port = parts[1]
username = parts[2]
password = ':'.join(parts[3:])
self.proxies.append({
"server": f"http://{host}:{port}",
"username": username,
"password": password,
"original": line
})
else:
logger.warning(f"Gecersiz proxy formati: {line}")
except Exception as e:
logger.error(f"Proxy ayristirma hatasi: {e} - Satir: {line}")
logger.info(f"Toplam {len(self.proxies)} proxy okundu.")
self.working_proxies = self.proxies
except Exception as e:
logger.error(f"Dosya okuma hatasi: {e}")
async def test_proxies(self, max_test=10):
"""
"""
logger.info("Proxy testi atlanıyor, tüm proxy'lerin çalıştığı varsayılıyor...")
# Tüm proxy'lerin çalıştığını varsay
self.working_proxies = self.proxies
def get_random_proxy(self):
"""Rastgele bir proxy döndürür"""
if not self.proxies:
return None
return random.choice(self.proxies)
def get_proxies_for_sessions(self, num_sessions):
if len(self.proxies) < num_sessions:
# Proxy sayısı yetersizse, tekrar kullan
return [self.proxies[i % len(self.proxies)] for i in range(num_sessions)]
else:
# Rastgele num_sessions kadar proxy seç
return random.sample(self.proxies, num_sessions)
def mask_proxy_url(self, proxy_info):
if not proxy_info:
return "Proxy yok"
try:
server = proxy_info["server"]
username = proxy_info["username"]
masked_username = username[:3] + '*' * (len(username) - 3) if len(username) > 3 else username
parsed = urlparse(server)
host_port = f"{parsed.netloc}"
return f"{parsed.scheme}://{masked_username}:******@{host_port}"
except:
return str(proxy_info)
class UserAgentManager:
def __init__(self):
"""User-Agent yönetim sınıfı""
self.user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:90.0) Gecko/20100101 Firefox/90.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'
]
try:
from fake_useragent import UserAgent
self.ua = UserAgent()
logger.info("Fake UserAgent basariyla baslatildi.")
self.has_fake_ua = True
except Exception as e:
logger.warning(f"Fake UserAgent baslatma hatasi: {e}")
logger.warning("Onceden tanimlanmis user agent'lar kullanilacak.")
self.has_fake_ua = False
def get_random_user_agent(self):
"""Rastgele bir User-Agent döndürür"""
if hasattr(self, 'has_fake_ua') and self.has_fake_ua:
try:
return self.ua.random
except:
pass
return random.choice(self.user_agents)
class PlaywrightManager:
def __init__(self, target_urls, proxy_file, num_sessions=2000, visit_duration=60, page_interaction=True, browser_type="all"):
"""
Args:
target_urls (list): Ziyaret edilecek URL'ler listesi
proxy_file (str): Proxy dosyasının yolu
num_sessions (int): Oturum sayısı
visit_duration (int): Her sayfada kalma süresi (saniye)
page_interaction (bool): Sayfa ile etkileşim kurulsun mu?
browser_type (str): Kullanılacak tarayıcı tipi ("all", "chromium", "firefox", "webkit")
"""
self.target_urls = target_urls if isinstance(target_urls, list) else [target_urls]
self.proxy_manager = ProxyManager(proxy_file)
self.ua_manager = UserAgentManager()
self.num_sessions = num_sessions
self.visit_duration = visit_duration
self.page_interaction = page_interaction
self.browser_type = browser_type
self.session_stats = {i: {"success": 0, "failed": 0} for i in range(num_sessions)}
self.total_visits = 0
self.start_time = None
self.browsers = []
self.tasks = []
async def check_playwright_browsers(self):
try:
# Tarayıcıların kurulu olup olmadığını kontrol et
result = subprocess.run(
["playwright", "install", "--dry-run"],
capture_output=True,
text=True
)
if "Browsers are already installed" not in result.stdout:
logger.warning("Playwright tarayıcıları kurulu değil!")
logger.info("Tarayıcılar indiriliyor... Bu işlem birkaç dakika sürebilir.")
install_process = subprocess.run(
["playwright", "install"],
capture_output=True,
text=True
)
if install_process.returncode == 0:
logger.info("Tarayıcılar başarıyla kuruldu!")
else:
logger.error("Tarayıcı kurulumu başarısız oldu!")
logger.error(install_process.stderr)
logger.info("Lütfen manuel olarak 'playwright install' komutunu çalıştırın.")
sys.exit(1)
else:
logger.info("Playwright tarayıcıları zaten kurulu.")
except Exception as e:
logger.error(f"Tarayıcı kontrolü sırasında hata: {e}")
logger.info("Lütfen manuel olarak 'playwright install' komutunu çalıştırın.")
sys.exit(1)
async def setup_browser(self, playwright, proxy_info, user_agent, session_id):
"""
Args:
playwright: Playwright nesnesi
proxy_info (dict): Proxy bilgileri
user_agent (str): User-Agent
session_id (int): Oturum ID'si
Returns:
tuple: (browser, context) tarayıcı ve bağlam nesneleri
"""
try:
# Tarayıcı tipini seç
if self.browser_type == "all":
browser_types = ["chromium", "firefox", "webkit"]
browser_weights = [0.7, 0.2, 0.1] # Chromium daha yaygın
browser_type = random.choices(browser_types, weights=browser_weights, k=1)[0]
else:
browser_type = self.browser_type
l
if browser_type == "chromium":
browser_obj = playwright.chromium
elif browser_type == "firefox":
browser_obj = playwright.firefox
else:
browser_obj = playwright.webkit
browser = await browser_obj.launch(
headless=True, # Görünmez modda çalıştır
slow_mo=50, # İşlemleri yavaşlat (ms)
args=[
'--disable-extensions',
'--disable-gpu',
'--disable-dev-shm-usage',
'--no-sandbox',
'--disable-web-security'
]
)
context = await browser.new_context(
proxy={
"server": proxy_info["server"],
"username": proxy_info["username"],
"password": proxy_info["password"]
},
user_agent=user_agent,
viewport={"width": 1366, "height": 768},
locale="tr-TR", # Türkçe dil ayarı
timezone_id="Europe/Istanbul", # Türkiye zaman dilimi
geolocation={"latitude": 31.995408, "longitude": 36.544443}, # İstanbul konumu
permissions=["geolocation", "notifications"] # İzinler
)
await context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
""")
logger.info(f"Oturum #{session_id+1} - {browser_type.capitalize()} tarayıcı başlatıldı")
return browser, context
except Exception as e:
logger.error(f"Oturum #{session_id+1} - Tarayıcı başlatma hatası: {e}")
return None, None
async def interact_with_page(self, page):
"""
Sayfa ile etkileşim kurar (scroll, tıklama vb.)
Args:
page: Playwright page nesnesi
"""
try:
for _ in range(random.randint(2, 5)):
await page.evaluate("window.scrollBy(0, window.innerHeight / 2)")
await asyncio.sleep(random.uniform(1, 2))
await page.evaluate("window.scrollTo(0, 0)")
await asyncio.sleep(random.uniform(0.5, 1))
try:
links = await page.query_selector_all('a[href^="/"], a[href^="http"]')
if links and random.random() < 0.3: # %30 ihtimalle bir linke tıkla
random_link = random.choice(links)
try:
async with page.expect_navigation(timeout=10000, wait_until="domcontentloaded"):
await random_link.click()
await asyncio.sleep(random.uniform(3, 5))
await page.go_back()
await asyncio.sleep(random.uniform(1, 2))
except Exception as e:
logger.debug(f"Link tıklama hatası: {e}")
except Exception as e:
logger.debug(f"Link seçme hatası: {e}")
except Exception as e:
logger.debug(f"Sayfa etkileşim hatası: {e}")
async def custom_page_load_strategy(self, page, url):
"""
Args:
page: Playwright page nesnesi
url (str): Ziyaret edilecek URL
Returns:
bool: Başarılı ise True, değilse False
"""
try:
# Temel navigasyon - minimum bekleme ile
await page.goto(url, wait_until="commit", timeout=20000)
for _ in range(30): # Maksimum 30 saniye bekle
# Sayfa hazır mı kontrol et
is_ready = await page.evaluate("""() => {
return document.readyState === 'complete' || document.readyState === 'interactive';
}""")
if is_ready:
has_content = await page.evaluate("""() => {
return !!document.querySelector('body') &&
document.body.innerHTML.length > 500;
}""")
if has_content:
return True
# 1 saniye bekle ve tekrar dene
await asyncio.sleep(1)
return False
except Exception as e:
logger.error(f"Özel yükleme stratejisi hatası: {e}")
return False
async def visit_url(self, context, url, session_id):
"""
Belirtilen URL'yi ziyaret eder - İyileştirilmiş sürüm
Args:
context: Playwright context nesnesi
url (str): Ziyaret edilecek URL
session_id (int): Oturum ID'si
Returns:
bool: Başarılı ise True, değilse False
"""
try:
# Yeni sayfa oluştur
page = await context.new_page()
start_time = time.time()
i
try:
response = await page.goto(
url,
wait_until="domcontentloaded",
timeout=40000
)
except Exception as e:
logger.warning(f"Oturum #{session_id+1} - domcontentloaded ile yükleme başarısız: {e}")
# Başarısız olursa, commit ile dene
try:
response = await page.goto(
url,
wait_until="commit",
timeout=20000
)
except Exception as e2:
logger.error(f"Oturum #{session_id+1} - Sayfa yükleme tamamen başarısız: {e2}")
self.session_stats[session_id]["failed"] += 1
await page.close()
return False
# Yükleme süresini hesapla
load_time = time.time() - start_time
if not response:
logger.warning(f"Oturum #{session_id+1} - Yanıt alınamadı: {url}")
self.session_stats[session_id]["failed"] += 1
await page.close()
return False
status = response.status
if 200 <= status < 400:
# Sayfa başlığını al
title = await page.title()
logger.info(f"Oturum #{session_id+1} - Başarılı ziyaret - {url} - Durum: {status} - Yükleme: {load_time:.2f}s - Başlık: {title}")
# Sayfanın yüklenmesi için ek bekleme
try:
# Sayfa içeriğinin görünür olmasını bekle
await page.wait_for_selector('body', timeout=10000)
# Sayfanın stabil olması için biraz bekle
await asyncio.sleep(3)
except Exception as e:
logger.warning(f"Oturum #{session_id+1} - Sayfa içeriği bekleme hatası: {e}")
await asyncio.sleep(3)
if self.page_interaction:
await self.interact_with_page(page)
await asyncio.sleep(self.visit_duration)
try:
has_analytics = await page.evaluate("""() => {
return !!(
window.ga ||
window.gtag ||
window.dataLayer ||
window.google_tag_manager ||
document.querySelector('script[src*="google-analytics.com"]') ||
document.querySelector('script[src*="googletagmanager.com"]')
);
}""", timeout=5000)
if has_analytics:
logger.info(f"Oturum #{session_id+1} - Google Analytics tespit edildi: {url}")
except Exception as e:
logger.debug(f"Oturum #{session_id+1} - Analytics kontrolü hatası: {e}")
self.session_stats[session_id]["success"] += 1
await page.close()
return True
else:
logger.warning(f"Oturum #{session_id+1} - Başarısız ziyaret - {url} - Durum: {status}")
self.session_stats[session_id]["failed"] += 1
await page.close()
return False
except Exception as e:
logger.error(f"Oturum #{session_id+1} - Ziyaret hatası - {url}: {e}")
self.session_stats[session_id]["failed"] += 1
return False
async def run_session(self, playwright, session_id):
"""
Bir oturumu çalıştırır
Args:
playwright: Playwright nesnesi
session_id (int): Oturum ID'si
"""
# Proxy ve User-Agent seç
proxy_info = self.proxy_manager.get_random_proxy()
user_agent = self.ua_manager.get_random_user_agent()
if not proxy_info:
logger.error(f"Oturum #{session_id+1} - Proxy bulunamadı!")
return
masked_proxy = self.proxy_manager.mask_proxy_url(proxy_info)
logger.info(f"Oturum #{session_id+1} - Proxy: {masked_proxy}")
browser, context = await self.setup_browser(playwright, proxy_info, user_agent, session_id)
if not browser or not context:
return
self.browsers.append((browser, context))
try:
for url in self.target_urls:
success = await self.visit_url(context, url, session_id)
self.total_visits += 1
if success and len(self.target_urls) > 1:
await asyncio.sleep(random.uniform(3, 8))
except Exception as e:
logger.error(f"Oturum #{session_id+1} - Çalışma hatası: {e}")
finally:
try:
await context.close()
await browser.close()
logger.info(f"Oturum #{session_id+1} - Tarayıcı kapatıldı")
except:
pass
async def run_all_sessions(self):
"""Tüm oturumları çalıştırır"""
self.start_time = time.time()
# Tarayıcıların kurulu olup olmadığını kontrol et
await self.check_playwright_browsers()
# Proxy test etme adımını atla - tüm proxy'lerin çalıştığını varsay
logger.info("Proxy testi atlanıyor, tüm proxy'lerin çalıştığı varsayılıyor...")
async with async_playwright() as playwright:
# Tüm oturumları başlat
self.tasks = []
for i in range(self.num_sessions):
# Oturumlar arasında kısa bir gecikme ekle (aynı anda çok fazla tarayıcı başlatmamak için)
await asyncio.sleep(random.uniform(1, 3))
task = asyncio.create_task(self.run_session(playwright, i))
self.tasks.append(task)
# Tüm görevlerin tamamlanmasını bekle
await asyncio.gather(*self.tasks, return_exceptions=True)
# İstatistikleri göster
self.show_stats()
def show_stats(self):
"""İstatistikleri gösterir"""
end_time = time.time()
elapsed_time = end_time - self.start_time
logger.info("\n--- İstatistikler ---")
logger.info(f"Toplam çalışma süresi: {elapsed_time:.2f} saniye")
logger.info(f"Toplam ziyaret sayısı: {self.total_visits}")
total_success = sum(stats["success"] for stats in self.session_stats.values())
total_failed = sum(stats["failed"] for stats in self.session_stats.values())
if self.total_visits > 0:
success_rate = total_success / self.total_visits * 100
logger.info(f"Başarılı ziyaretler: {total_success} ({success_rate:.2f}%)")
logger.info(f"Başarısız ziyaretler: {total_failed} ({100 - success_rate:.2f}%)")
# Oturum bazında istatistikleri göster
logger.info("\nOturum bazında istatistikler:")
for session_id, stats in self.session_stats.items():
total = stats["success"] + stats["failed"]
success_rate = stats["success"] / total * 100 if total > 0 else 0
logger.info(f"Oturum #{session_id+1} - Başarılı: {stats['success']}, Başarısız: {stats['failed']}, Başarı oranı: {success_rate:.2f}%")
async def save_results_to_csv(self, filename="analytics_results.csv"):
"""Sonuçları CSV dosyasına kaydeder"""
import csv
try:
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
fieldnames = ['session_id', 'success', 'failed', 'success_rate']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for session_id, stats in self.session_stats.items():
total = stats["success"] + stats["failed"]
success_rate = stats["success"] / total * 100 if total > 0 else 0
writer.writerow({
'session_id': session_id + 1,
'success': stats["success"],
'failed': stats["failed"],
'success_rate': f"{success_rate:.2f}%"
})
logger.info(f"Sonuçlar {filename} dosyasına kaydedildi.")
except Exception as e:
logger.error(f"CSV kaydetme hatası: {e}")
async def main():
# Argüman ayrıştırıcı
parser = argparse.ArgumentParser(description='Playwright ile web sitesi ziyareti ve Google Analytics\'e veri gönderme')
parser.add_argument('--urls', type=str, help='Ziyaret edilecek URL\'ler (virgülle ayrılmış)')
parser.add_argument('--proxy-file', type=str, default='proxy.txt', help='Proxy dosyası (varsayılan: proxy.txt)')
parser.add_argument('--sessions', type=int, default=20000, help='Oturum sayısı (varsayılan: 5)')
parser.add_argument('--duration', type=int, default=30, help='Her sayfada kalma süresi saniye (varsayılan: 30)')
parser.add_argument('--no-interaction', action='store_true', help='Sayfa ile etkileşim kurma')
parser.add_argument('--browser', type=str, default='chromium', choices=['all', 'chromium', 'firefox', 'webkit'],
help='Kullanılacak tarayıcı (varsayılan: chromium)')
parser.add_argument('--csv', type=str, help='Sonuçları CSV dosyasına kaydet')
args = parser.parse_args()
# URL'leri al
if args.urls:
target_urls = [url.strip() for url in args.urls.split(',')]
else:
target_urls = input("Ziyaret edilecek URL'leri girin (virgülle ayırarak): ").split(',')
target_urls = [url.strip() for url in target_urls]
# URL formatını kontrol et
for i, url in enumerate(target_urls):
if not url.startswith(('http://', 'https://')):
target_urls[i] = 'https://' + url
# Proxy dosyasını kontrol et
proxy_file = args.proxy_file
if not os.path.exists(proxy_file):
logger.error(f"{proxy_file} dosyası bulunamadı!")
# Örnek proxy.txt oluştur
logger.info("Örnek proxy.txt dosyası oluşturuluyor...")
with open(proxy_file, 'w') as f:
f.write("rotating2.we1.town:1000005:5112e6eee4b8e8d28ac3b8__cr.tr:e4f98ea6ff6763a0c\n")
logger.info(f"{proxy_file} dosyası oluşturuldu.")
# Ayarlar
num_sessions = args.sessions
visit_duration = args.duration
page_interaction = not args.no_interaction
browser_type = args.browser
# Uyarı mesajı
logger.warning("\n" + "!" * 80)
logger.warning("UYARI: Bu script web sitelerine gerçek tarayıcı trafiği gönderecektir!")
logger.warning(f"- Hedef URL'ler: {', '.join(target_urls)}")
logger.warning(f"- {num_sessions} oturum aynı anda çalışacak")
logger.warning(f"- Her sayfa ziyareti yaklaşık {visit_duration} saniye sürecek")
logger.warning(f"- Sayfa etkileşimi: {'Açık' if page_interaction else 'Kapalı'}")
logger.warning(f"- Tarayıcı tipi: {browser_type}")
logger.warning("Bu, hedef sitelere yük bindirebilir ve IP adresinizin engellenmesine neden olabilir.")
logger.warning("Sadece izin verilen sitelerde ve test amaçlı kullanın!")
logger.warning("!" * 80 + "\n")
# Kullanıcı onayı
try:
input("Devam etmek için Enter tuşuna basın (İptal etmek için Ctrl+C)...")
except KeyboardInterrupt:
logger.info("İşlem iptal edildi.")
return
# Playwright ile web sitesi ziyareti
manager = PlaywrightManager(
target_urls=target_urls,
proxy_file=proxy_file,
num_sessions=num_sessions,
visit_duration=visit_duration,
page_interaction=page_interaction,
browser_type=browser_type
)
# Tüm oturumları çalıştır
await manager.run_all_sessions()
# Sonuçları CSV'ye kaydet
if args.csv:
await manager.save_results_to_csv(args.csv)
if __name__ == "__main__":
# Ana fonksiyonu çalıştır
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("Program kullanıcı tarafından durduruldu.")
except Exception as e:
logger.error(f"Beklenmeyen hata: {e}")