Sciratest / config.py
Samfy001's picture
Upload 6 files
63d660f verified
#!/usr/bin/env python3
"""
Configuration file for Scira Reverse API
Centralized settings for rate limiting, proxies, and bypass strategies
Supports environment variables for Hugging Face deployment
"""
import os
from typing import List, Dict, Any
# ===== PROXY CONFIGURATION =====
def get_proxy_configs() -> List[Dict[str, Any]]:
"""Get proxy configurations from environment variables or defaults"""
proxy_configs = []
# Check if proxy is enabled
if os.getenv("PROXY_ENABLED", "false").lower() == "true":
proxy_host = os.getenv("PROXY_HOST", "6b3b12f886551090.ika.na.pyproxy.io")
proxy_port = int(os.getenv("PROXY_PORT", "16666"))
proxy_username = os.getenv("PROXY_USERNAME", "Y21wFw2-zone-resi")
proxy_password = os.getenv("PROXY_PASSWORD", "Y21wFw2")
proxy_configs.append({
"name": "Primary Residential Proxy",
"host": proxy_host,
"port": proxy_port,
"username": proxy_username,
"password": proxy_password,
"type": "residential",
"enabled": True
})
return proxy_configs
PROXY_CONFIGS = get_proxy_configs()
# ===== RATE LIMITING SETTINGS =====
RATE_LIMITING = {
"min_delay": float(os.getenv("MIN_DELAY", "0.5")),
"max_delay": float(os.getenv("MAX_DELAY", "3.0")),
"request_timeout": int(os.getenv("REQUEST_TIMEOUT", "120")),
"max_retries": int(os.getenv("MAX_RETRIES", "3")),
"backoff_factor": float(os.getenv("BACKOFF_FACTOR", "2.0")),
"burst_protection": {
"enabled": os.getenv("BURST_PROTECTION", "true").lower() == "true",
"max_requests_per_minute": int(os.getenv("MAX_REQUESTS_PER_MINUTE", "20")),
"cooldown_period": int(os.getenv("COOLDOWN_PERIOD", "60"))
}
}
# ===== USER AGENT ROTATION =====
USER_AGENTS = [
# Chrome on Windows
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36",
# Firefox on Windows
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0",
# Chrome on macOS
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
# Safari on macOS
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
# Chrome on Linux
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
# Edge on Windows
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0",
]
# ===== BROWSER FINGERPRINT ROTATION =====
SEC_CH_UA_OPTIONS = [
'"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"',
'"Not;A=Brand";v="99", "Google Chrome";v="138", "Chromium";v="138"',
'"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
'"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
'"Microsoft Edge";v="139", "Not;A=Brand";v="99", "Chromium";v="139"',
'"Google Chrome";v="139", "Not;A=Brand";v="99", "Chromium";v="139"'
]
PLATFORMS = [
'"Windows"',
'"macOS"',
'"Linux"'
]
ACCEPT_LANGUAGES = [
"en-US,en;q=0.9",
"en-US,en;q=0.8,es;q=0.7",
"en-GB,en;q=0.9,en-US;q=0.8",
"en-US,en;q=0.9,fr;q=0.8",
"en-US,en;q=0.7"
]
# ===== SESSION TOKEN MANAGEMENT =====
def get_session_tokens() -> List[str]:
"""Get session tokens from environment variables or defaults"""
env_token = os.getenv("SCIRA_SESSION_TOKEN")
if env_token:
return [env_token]
# Default token (may not work without proper configuration)
return ["QZkIjAJihMAA2Eju4uV54BpqwOFScwUl.Ptbu8Y%2FO%2BU4%2BimLLh6unpkg%2FMGdvFThciJvInvNAV8Y%3D"]
def get_posthog_tokens() -> List[str]:
"""Get PostHog tokens from environment variables or defaults"""
env_token = os.getenv("SCIRA_POSTHOG_TOKEN")
if env_token:
return [env_token]
# Default token
return ["%7B%22distinct_id%22%3A%2201970149-15a6-74b8-8abd-93a5932c0b14%22%2C%22%24sesid%22%3A%5B1754648371696%2C%220198891e-aee2-7b9f-962c-305a2214e83c%22%2C1754647146210%5D%2C%22%24epp%22%3Atrue%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22https%3A%2F%2Fscira.ai%2F%22%2C%22u%22%3A%22https%3A%2F%2Fscira.ai%2F%22%7D%7D"]
SESSION_TOKENS = get_session_tokens()
POSTHOG_TOKENS = get_posthog_tokens()
# ===== BYPASS STRATEGIES =====
BYPASS_CONFIG = {
"proxy_rotation": {
"enabled": True,
"rotate_every_n_requests": 10, # Switch proxy every N requests
"fallback_to_direct": True # Use direct connection if all proxies fail
},
"header_spoofing": {
"enabled": True,
"rotate_user_agent": True,
"rotate_sec_ch_ua": True,
"rotate_platform": True,
"rotate_accept_language": True,
"add_random_headers": True
},
"ip_spoofing": {
"enabled": True,
"x_forwarded_for": True,
"x_real_ip": True,
"x_originating_ip": True
},
"session_rotation": {
"enabled": False, # Set to True when multiple tokens are available
"rotate_every_n_requests": 5
},
"request_timing": {
"randomize_delays": True,
"human_like_patterns": True,
"avoid_burst_detection": True
}
}
# ===== LOGGING CONFIGURATION =====
LOGGING_CONFIG = {
"level": "INFO",
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"log_requests": True,
"log_responses": False, # Set to True for debugging
"log_proxy_usage": True,
"log_rate_limiting": True
}
# ===== API ENDPOINTS =====
SCIRA_CONFIG = {
"base_url": "https://scira.ai/api",
"search_endpoint": "/search",
"timeout": 120,
"max_retries": 3
}
# ===== SERVER CONFIGURATION =====
SERVER_CONFIG = {
"host": os.getenv("HOST", "0.0.0.0"),
"port": int(os.getenv("PORT", "7860")), # Default to Hugging Face port
"debug": os.getenv("DEBUG", "false").lower() == "true",
"cors_enabled": os.getenv("CORS_ENABLED", "true").lower() == "true",
"cors_origins": os.getenv("CORS_ORIGINS", "*").split(","),
"max_request_size": int(os.getenv("MAX_REQUEST_SIZE", str(10 * 1024 * 1024))),
"keepalive_timeout": int(os.getenv("KEEPALIVE_TIMEOUT", "65"))
}
def get_active_proxies():
"""Get list of enabled proxy configurations"""
return [proxy for proxy in PROXY_CONFIGS if proxy.get("enabled", False)]
def get_primary_proxy():
"""Get the primary proxy configuration"""
active_proxies = get_active_proxies()
return active_proxies[0] if active_proxies else None
def validate_config():
"""Validate configuration settings"""
errors = []
# Check if at least one proxy is configured
if not get_active_proxies():
errors.append("No active proxy configurations found")
# Check rate limiting settings
if RATE_LIMITING["min_delay"] >= RATE_LIMITING["max_delay"]:
errors.append("min_delay must be less than max_delay")
# Check session tokens
if not SESSION_TOKENS:
errors.append("No session tokens configured")
return errors
if __name__ == "__main__":
# Validate configuration when run directly
errors = validate_config()
if errors:
print("❌ Configuration errors found:")
for error in errors:
print(f" - {error}")
else:
print("✅ Configuration is valid")
print(f"Active proxies: {len(get_active_proxies())}")
print(f"Session tokens: {len(SESSION_TOKENS)}")
print(f"User agents: {len(USER_AGENTS)}")