Быстрый конкурентный проверщик прокси. Для каждого прокси из списка он сообщает, работает ли он,
выходной IP, страну / город / провайдера / часовой пояс (через GeoIP-сервис, совместимый с
ip-api), задержку и подсказку локали (например, DE → de-DE), которая пригодится, когда
нужно подогнать Accept-Language под страну прокси при скрапинге или тестах локализации.
Всё началось со 100-строчного последовательного скрипта (один прокси в секунду, time.sleep(1)),
который затем переписали в небольшой устанавливаемый пакет с тестами.
| Исходный скрипт | Эта версия |
|---|---|
| Последовательно, пауза 1 с после каждого прокси | Пул потоков (--workers), результаты сохраняют порядок ввода |
Только ip:port:login:password → login:password@ip:port |
Разбирает host:port, host:port:user:pass, user:pass@host:port, scheme://…; пароли могут содержать : или @ |
URL прокси для HTTPS строился как https://proxy (неверная схема) |
Корректный URL прокси для каждой схемы; учётные данные URL-кодируются |
| Учётные данные выводились в консоль | Пароли везде маскируются; --reveal включается явно |
print результатов, запись в файл закомментирована |
Вывод table, json, csv, txt, --only-valid, корректные коды возврата |
Случайно читал HTTP(S)_PROXY из окружения |
Прокси из окружения игнорируются (trust_env=False) |
| Любой сбой → «невалиден» | Различные причины: ошибка авторизации (407), таймаут, сбой соединения, ошибки гео-сервиса, лимит запросов |
| Без тестов | 46 тестов, включая встроенный в процесс поддельный прокси-сервер (сеть не нужна) |
uv sync # создаёт .venv, ставит пакет и dev-инструментыДля SOCKS-прокси нужен дополнительный extra: uv run --with "requests[socks]" proxy-validator ....
uv run proxy-validator examples/proxies.example.txt
uv run proxy-validator proxies.txt -w 50 -t 5 --only-valid
uv run proxy-validator proxies.txt -f json -o result.json
uv run proxy-validator proxies.txt -f txt -o working.txt # полные URL рабочих прокси
cat proxies.txt | uv run proxy-validator - -f csvPROXY STATUS MS EXIT IP COUNTRY CITY LOCALE
demo:***@203.0.113.11:3128 ok 412 198.51.100.7 DE Berlin de-DE
203.0.113.10:8080 fail: timeout while connecting - - - -
Коды возврата: 0 — работает хотя бы один прокси, 1 — не работает ни один, 2 — некорректные входные данные.
| Флаг | Значение |
|---|---|
-w, --workers |
число параллельных проверок (по умолчанию 20) |
-t, --timeout |
секунд на запрос (по умолчанию 8) |
-r, --retries |
число повторов при сетевых ошибках (по умолчанию 1) |
--min-interval |
глобальная минимальная задержка между стартами запросов, для гео-API с ограничением частоты |
--geo-url |
любой ip-api-совместимый эндпоинт (бесплатный тариф ip-api.com работает только по HTTP) |
-f, --format |
table (по умолчанию), json, csv, txt |
--only-valid |
скрыть нерабочие прокси |
--reveal |
включить учётные данные в json/csv (по умолчанию маскируются) |
from proxy_validator import parse_proxy_list, validate_all
proxies, errors = parse_proxy_list(open("proxies.txt").read())
for result in validate_all(proxies, workers=30):
if result.ok:
print(result.proxy.masked, result.exit_ip, result.country_code, result.locale)tests/fake_proxy.py — это HTTP-прокси на ~100 строк, который притворяется GeoIP-сервисом. Поскольку
клиент отправляет GET http://host/path обычному HTTP-прокси, весь стек (авторизация на прокси,
таймауты, HTTP 429/500, некорректный JSON, недоступный прокси, конкурентность и порядок результатов)
проверяется сквозным образом, не обращаясь к интернету.
uv sync
uv run pytest- Проверяйте только те прокси, которые вам разрешено использовать, и соблюдайте условия
GeoIP-провайдера, на который указывает
--geo-url. - Примеры адресов взяты из диапазонов для документации (RFC 5737); это не настоящие прокси.
MIT