""" Rate limiting utility to prevent overloading target servers. """ import time import random from typing import Optional class RateLimiter: """ Simple rate limiter with random jitter to avoid detection. """ def __init__(self, min_delay: float = 1.0, max_delay: Optional[float] = None): """ Initialize rate limiter. Args: min_delay: Minimum delay between requests in seconds max_delay: Maximum delay between requests. If None, uses min_delay """ self.min_delay = min_delay self.max_delay = max_delay or min_delay self.last_request_time = 0 def wait(self): """ Wait for the appropriate amount of time before the next request. Adds random jitter to avoid pattern detection. """ elapsed = time.time() - self.last_request_time delay = random.uniform(self.min_delay, self.max_delay) if elapsed < delay: time.sleep(delay - elapsed) self.last_request_time = time.time() def __enter__(self): """Context manager entry.""" return self def __exit__(self, exc_type, exc_val, exc_tb): """Context manager exit.""" self.wait()