import httpx import re import time import random from typing import List, Optional from urllib.parse import urlparse from rich.console import Console import logging # Configuração de logging logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # Inicializa o console do rich para mensagens coloridas console = Console() class ClickSimulator: def __init__( self, request_interval: float = 2.0, max_requests: int = 50, timeout: float = 15.0 ): """ Inicializa o simulador de cliques para Google, Facebook ou Instagram. Args: request_interval: Intervalo entre requisições em segundos. max_requests: Número máximo de requisições a enviar. timeout: Tempo máximo de espera por requisição em segundos. """ self.request_interval = request_interval self.max_requests = max_requests self.timeout = timeout self.total_clicks = 0 self.client = httpx.Client( timeout=self.timeout, headers=self._get_random_headers(), follow_redirects=True ) def _get_random_headers(self) -> dict: """Retorna headers aleatórios para simular navegadores diferentes.""" user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1", ] return { "User-Agent": random.choice(user_agents), "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", } def validate_url(self, url: str, platform: str) -> bool: """Valida se a URL é válida e pertence à plataforma escolhida.""" try: parsed = urlparse(url) if platform.lower() == "google": return bool(parsed.scheme in ["http", "https"] and "google" in parsed.netloc.lower()) elif platform.lower() == "facebook": return bool(parsed.scheme in ["http", "https"] and any(domain in parsed.netloc.lower() for domain in ["facebook", "fb"])) elif platform.lower() == "instagram": return bool(parsed.scheme in ["http", "https"] and "instagram" in parsed.netloc.lower()) return False except: return False def simulate_clicks(self, url: str, platform: str) -> None: """ Simula cliques enviando requisições GET para o link fornecido. Args: url: URL do Google, Facebook ou Instagram. platform: Plataforma escolhida ("google", "facebook", "instagram"). """ if not self.validate_url(url, platform): console.print(f"[red]Erro: URL inválida ou não pertence ao {platform}.[/red]") return url = url.strip() for i in range(self.max_requests): try: # Atualiza headers para cada requisição self.client.headers = self._get_random_headers() if platform.lower() == "google": self.client.headers["Referer"] = "https://www.google.com/" elif platform.lower() == "facebook": self.client.headers["Referer"] = "https://www.facebook.com/" elif platform.lower() == "instagram": self.client.headers["Referer"] = "https://www.instagram.com/" response = self.client.get(url) # Verifica o status da resposta if response.status_code == 200: # Tenta extrair o título da página title_match = re.search(r'