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="/glossary/socks5">SOCKS5</a>.
Чому після встановлення приходить ConnectionError, а не ProxyError?
Для SOCKS urllib3 видає помилки підключення як NewConnectionError, а requests перетворює їх на ConnectionError. Причину шукайте в тексті після Failed to establish a new connection. Про відмови SOCKS-сервера — на сторінці <a href="/errors/socks5-general-failure">SOCKS5 general failure</a>.
Що робити, якщо з'єднання з портом 824 відхилено?
Перевірте хост gw.prokso.com, порт і мережу: деякі мережі закривають нестандартні порти. Докладно — на сторінці <a href="/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 ГБ
Реєстрація за хвилину, доступи одразу після оплати.