сделал ревью системы
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-04-28 22:13:47 +10:00
parent c564140428
commit 25f2c09064
18 changed files with 1169 additions and 712 deletions

75
services/proxy_manager.py Normal file
View File

@@ -0,0 +1,75 @@
"""
Менеджер прокси - управление загрузкой и использованием прокси
"""
import random
import requests
from config import PROXIES_URL
def download_proxies(url: str = PROXIES_URL) -> list[str]:
"""
Загружает список прокси из удаленного источника
"""
response = requests.get(url)
if response.status_code == 200:
proxies = response.text.splitlines()
return proxies
else:
return []
def get_shuffled_proxies(proxies_list: list[str]) -> list[str]:
"""
Перемешивает список прокси для случайного начала
"""
shuffled = proxies_list.copy()
random.shuffle(shuffled)
return shuffled
def fetch_with_proxy(url: str, proxy: str, verify: bool = True, timeout: int = 10) -> str | None:
"""
Выполняет запрос к URL через прокси
Возвращает текст ответа или None при ошибке
"""
proxies = {
'http': f'http://{proxy}',
'https': f'http://{proxy}',
}
try:
response = requests.get(url, proxies=proxies, timeout=timeout, verify=verify)
response.encoding = 'utf-8'
if response.status_code == 200:
# Проверяем содержимое - если это ошибка от прокси
if '"message":"Request failed' in response.text or '403' in response.text[:500]:
print(f"Proxy {proxy} - Site returned 403 (inside response)")
return None
print(f"Proxy {proxy} - SUCCESS")
return response.text
elif response.status_code == 403:
print(f"Proxy {proxy} - 403 Forbidden")
return None # Прокси работает, но сайт блокирует
else:
print(f"Proxy {proxy} - Status {response.status_code}")
return None
except:
return None
def fetch_with_proxy_retry(url: str, timeout: int = 10, verify: bool = True) -> str:
"""
Выполняет запрос с перебором прокси до успешного
Возвращает пустую строку если все прокси не сработали
"""
proxies_list = download_proxies(PROXIES_URL)
proxies_list = get_shuffled_proxies(proxies_list)
response = ""
for proxy in proxies_list:
response = fetch_with_proxy(url, proxy=proxy, timeout=timeout, verify=verify)
if response:
break
else:
response = ""
return response