Missing dependencies for SOCKS support: jak naprawić

Requests potrafi pracować z proxy SOCKS, ale dopiero po zainstalowaniu dodatkowego pakietu. Bez niego już pierwsze żądanie przez socks5:// kończy się wyjątkiem InvalidSchema.

Zaktualizowano · Redakcja Prokso

W skrócie
  • Missing dependencies for SOCKS support oznacza, że dla requests nie zainstalowano pakietu PySocks
  • Zainstaluj go tym samym Pythonem, który uruchamia skrypt: python -m pip install 'requests[socks]'
  • Dla proxy rezydencjalnych pisz socks5h, aby nazwę strony zamieniało na IP proxy, a nie Twój komputer

Co oznacza błąd

Pełna treść: requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support. W kodzie źródłowym requests ten wyjątek pojawia się, gdy nie udało się zaimportować modułu SOCKS z urllib3, a ten z kolei wymaga pakietu PySocks. Samo requests instaluje się bez niego, bo według dokumentacji obsługa SOCKS jest opcjonalna.

Błąd nie pojawia się przy imporcie, tylko przy pierwszym żądaniu przez proxy ze schematem socks5://, socks5h:// lub socks4://. Dlatego kod z proxy HTTP działa, a po zamianie linii na SOCKS nagle się wywraca. Żądanie nie dociera ani do proxy, ani do strony, więc transfer nie jest zużywany.

Po instalacji zależności ważny jest wybór schematu. Według dokumentacji requests przy schemacie socks5 nazwę strony zamienia na IP Twój komputer, a przy socks5h robi to proxy. Dla proxy rezydencjalnych zwykle potrzebny jest socks5h: wtedy zapytanie DNS idzie z tego samego kraju co IP.

Przyczyny

  • Nie zainstalowano PySocks. Pakietu requests[socks] ani PySocks nie instalowano, więc urllib3 nie może załadować modułu SOCKS.
  • Pakiet jest w innym środowisku. pip zainstalował PySocks dla innego Pythona lub innego środowiska wirtualnego niż to, w którym działa skrypt.
  • Powłoka zsh zjadła nawiasy kwadratowe. Polecenie pip install requests[socks] bez cudzysłowu kończy się w zsh błędem no matches found i nic się nie instaluje.
  • Build bez dodatkowych pakietów. Obraz Docker, serwer lub build aplikacji instaluje tylko requests z requirements.txt, gdzie nie ma PySocks.

Jak to naprawić

  1. Zainstaluj zależności tym samym interpreterem, który uruchamia skrypt: python -m pip install 'requests[socks]'. Cudzysłów jest potrzebny w zsh.
  2. Sprawdź, czy pakiet jest na miejscu: python -c "import socks; print(socks.__file__)". Jeśli import się nie udaje, zainstalowano go w innym środowisku.
  3. Dodaj requests[socks] do requirements.txt lub pyproject.toml, aby zależność instalowała się także na serwerze i w Dockerze.
  4. Ustaw proxy ze schematem socks5h dla obu kluczy: proxies={'http': 'socks5h://LOGIN:HASŁO@gw.prokso.com:824', 'https': 'socks5h://LOGIN:HASŁO@gw.prokso.com:824'}. Dla stałego IP zamiast 824 podaj port z zakresu 10000–20000.
  5. Jeśli po instalacji przychodzi ConnectionError z tekstem SOCKS5 authentication failed, proxy nie przyjęło loginu lub hasła: skopiuj linię z panelu klienta jeszcze raz. Pełny przykład kodu jest w instrukcji Python requests.

Jak sprawdzić, czy działa

Wykonaj requests.get('https://prokso.com/ip', proxies=proxies, timeout=30).json(). Jeśli w odpowiedzi jest IP, kraj i ASN proxy, SOCKS działa. Potem otwórz Mój IP bez proxy i porównaj: adresy powinny się różnić.

Diagnoza w 2 minuty

Najpierw wklej linię do sprawdzania proxy. Jeśli tam proxy działa, przyczyna leży w programie lub jego ustawieniach. Jeśli nie - sprawdź linię z terminala:

curl -v -x "http://LOGIN:HASŁO@gw.prokso.com:823" https://api.ipify.org
  • Wiersz < HTTP/1.1 407 zaraz po CONNECT oznacza, że odpowiada proxy. Nazwa po kodzie, na przykład NO_USER, wskazuje przyczynę.
  • Proxy odpowiedziało na CONNECT kodem 200, a potem przyszedł inny kod - proxy działa, tę odpowiedź dała strona.
  • Brak odpowiedzi, tylko przekroczony czas - połączenie nie dotarło do proxy: sprawdź host, port i sieć.

Instrukcje, w których pojawia się ten błąd

Pytania i odpowiedzi (FAQ)

Czym socks5 różni się od socks5h?

Tylko tym, kto zamienia nazwę strony na IP. Przy socks5 robi to Twój komputer i Twój serwer DNS widzi, dokąd się łączysz, przy socks5h robi to proxy. Więcej o protokole w słowniczku: <a href="/pl/glossary/socks5">SOCKS5</a>.

Dlaczego po instalacji przychodzi ConnectionError, a nie ProxyError?

Dla SOCKS urllib3 zgłasza błędy połączenia jako NewConnectionError, a requests zamienia je na ConnectionError. Przyczyny szukaj w tekście po Failed to establish a new connection. O odmowach serwera SOCKS mówi strona <a href="/pl/errors/socks5-general-failure">SOCKS5 general failure</a>.

Co zrobić, jeśli połączenie z portem 824 jest odrzucane?

Sprawdź host gw.prokso.com, port i sieć: niektóre sieci blokują niestandardowe porty. Szczegóły na stronie <a href="/pl/errors/socks5-connection-refused">SOCKS5 connection refused</a>.

Czy httpx lub aiohttp potrzebują PySocks?

Nie, mają własne zależności: httpx wymaga httpx[socks], a aiohttp działa z SOCKS tylko przez osobny pakiet aiohttp-socks.

Rezydencjalne $1.59, mobilne $2.50, serwerowe $0.65 za 1 GB

Rejestracja w minutę, dostęp od razu po płatności.

Utwórz konto