Missing dependencies for SOCKS support: как исправить
Requests умеет работать с SOCKS-прокси, но только после установки дополнительного пакета. Без него первый же запрос через socks5:// завершается исключением InvalidSchema.
Обновлено · Редакция Prokso
- Missing dependencies for SOCKS support означает, что для requests не установлен пакет PySocks
- Установите его тем же Python, что запускает скрипт: python -m pip install 'requests[socks]'
- Для резидентских прокси пишите socks5h, чтобы имя сайта превращал в IP прокси, а не ваш компьютер
Что означает ошибка
Полный текст: requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support. В исходном коде requests это исключение возникает, когда не удалось импортировать модуль SOCKS из urllib3, а тот, в свою очередь, требует пакет PySocks. Сам requests устанавливается без него, потому что поддержка SOCKS по документации необязательна.
Ошибка появляется не при импорте, а в момент первого запроса через прокси со схемой socks5://, socks5h:// или socks4://. Поэтому код с HTTP-прокси работает, а после замены строки на SOCKS вдруг падает. Ни до прокси, ни до сайта запрос при этом не доходит, так что трафик не тратится.
После установки зависимостей важно выбрать схему. По документации requests со схемой socks5 имя сайта превращает в IP ваш компьютер, а со схемой socks5h это делает прокси. Для резидентских прокси обычно нужен socks5h: тогда DNS-запрос идёт из той же страны, что и IP.
Причины
- Не установлен PySocks. Пакет requests[socks] или PySocks не устанавливали, и urllib3 не может подключить модуль SOCKS.
- Пакет стоит в другом окружении. pip установил PySocks для другого Python или другого виртуального окружения, чем то, в котором запускается скрипт.
- Оболочка zsh съела квадратные скобки. Команда pip install requests[socks] без кавычек в zsh завершается ошибкой no matches found, и ничего не устанавливается.
- Сборка без дополнительных пакетов. Docker-образ, сервер или сборка приложения ставит только requests из requirements.txt, где нет PySocks.
Как исправить
- Установите зависимости тем же интерпретатором, которым запускаете скрипт:
python -m pip install 'requests[socks]'. Кавычки нужны для zsh. - Проверьте, что пакет на месте:
python -c "import socks; print(socks.__file__)". Если импорт не удаётся, вы установили его в другое окружение. - Добавьте
requests[socks]в requirements.txt или pyproject.toml, чтобы зависимость ставилась и на сервере, и в Docker. - Задайте прокси со схемой socks5h для обоих ключей:
proxies={'http': 'socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824', 'https': 'socks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824'}. Для фиксированного IP вместо 824 укажите порт из диапазона 10000–20000. - Если после установки приходит
ConnectionErrorс текстом SOCKS5 authentication failed, прокси не принял логин или пароль: скопируйте строку из личного кабинета заново. Пример полного кода есть в инструкции Python requests.
Как проверить, что всё заработало
Выполните requests.get('https://prokso.com/ip', proxies=proxies, timeout=30).json(). Если в ответе IP, страна и ASN прокси, SOCKS работает. Затем откройте Мой IP без прокси и сравните: адреса должны отличаться.
Диагностика за 2 минуты
Сначала вставьте строку в проверку прокси. Если там прокси работает, причина в программе или её настройках. Если нет — проверьте строку из терминала:
curl -v -x "http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823" https://api.ipify.org
- Строка
< HTTP/1.1 407сразу послеCONNECT— отвечает прокси. Название после кода, напримерNO_USER, подсказывает причину. - Прокси ответил на
CONNECTкодом 200, а дальше пришёл другой код — прокси работает, этот ответ дал сайт. - Никакого ответа, только тайм-аут — соединение не дошло до прокси: проверьте хост, порт и сеть.
Инструкции, где встречается эта ошибка
Вопросы и ответы
Чем socks5 отличается от socks5h?
Только тем, кто превращает имя сайта в IP. С socks5 это делает ваш компьютер и ваш DNS-сервер видит, куда вы обращаетесь, с socks5h это делает прокси. Больше о протоколе — в глоссарии: <a href="/ru/glossary/socks5">SOCKS5</a>.
Почему после установки приходит ConnectionError, а не ProxyError?
Для SOCKS urllib3 выдаёт ошибки подключения как NewConnectionError, а requests превращает их в ConnectionError. Причину ищите в тексте после Failed to establish a new connection. Об отказах SOCKS-сервера — на странице <a href="/ru/errors/socks5-general-failure">SOCKS5 general failure</a>.
Что делать, если соединение с портом 824 отклонено?
Проверьте хост gw.prokso.com, порт и сеть: некоторые сети закрывают нестандартные порты. Подробно — на странице <a href="/ru/errors/socks5-connection-refused">SOCKS5 connection refused</a>.
Нужен ли PySocks для httpx или aiohttp?
Нет, у них свои зависимости: httpx требует httpx[socks], а aiohttp работает с SOCKS только через отдельный пакет aiohttp-socks.
Другие ошибки прокси
Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ
Регистрация за минуту, доступы сразу после оплаты.