Ошибки https-proxy-agent и socks-proxy-agent
Оба агента берут прокси одной строкой-адресом. Большинство ошибок возникает именно здесь: строка не разбирается, пароль ломает адрес или схема не та.
Обновлено · Редакция Prokso
- Оба агента разбирают строку прокси как URL, поэтому нужен полный адрес со схемой
- Спецсимволы в логине и пароле кодируйте через encodeURIComponent, иначе адрес ломается или меняется хост
- Для SOCKS5 пишите socks5h://, чтобы название сайта превращал в IP прокси
Что означает ошибка
Пакеты https-proxy-agent и socks-proxy-agent разбирают строку прокси стандартным классом URL. Если строка не является корректным адресом, Node.js бросает TypeError: Invalid URL с кодом ERR_INVALID_URL. Так бывает, например, когда в пароле есть символ / или порт больше 65535.
Опаснее, когда ошибки нет. Символы @ и # в пароле не ломают разбор, но меняют адрес: в нашей проверке строка с паролем p@ss#1 превратилась в хост ss. Программа идёт на несуществующий хост и падает уже с ENOTFOUND.
Оба агента декодируют логин и пароль функцией decodeURIComponent. Поэтому спецсимволы нужно закодировать перед вставкой в строку, и агент сам вернёт их в исходный вид. В socks-proxy-agent схема ещё и определяет, кто превращает название сайта в IP: при socks5 это делает ваш компьютер, при socks5h — прокси.
Причины
- Строка без схемы. Формат хост:порт:логин:пароль не является URL. socks-proxy-agent тогда отвечает TypeError «A "socks" protocol must be specified!».
- Спецсимволы в пароле без кодирования. Символы / ? # @ : % и пробел ломают адрес или тихо меняют хост.
- Неверный логин или пароль. HTTP-шлюз отвечает «HTTP/1.1 407 NO_USER», а библиотека socks на порту 824 — «Socks5 Authentication failed».
- Схема не соответствует порту. http:// нужен для порта 823, socks5h:// — для порта 824; порты 10000–20000 принимают оба протокола.
- socks5 вместо socks5h. Адрес сайта определяет ваш DNS, а не прокси, поэтому сайт может открыться с IP, подобранного под вашу сеть, а не под страну прокси.
Как исправить
- Пишите строку полностью со схемой:
http://ЛОГИН:ПАРОЛЬ@gw.prokso.com:823для https-proxy-agent иsocks5h://ЛОГИН:ПАРОЛЬ@gw.prokso.com:824для socks-proxy-agent. - Собирайте строку с кодированием:
`http://${encodeURIComponent(login)}:${encodeURIComponent(password)}@gw.prokso.com:823`. Тогда ни один символ пароля не сломает адрес. - При 407 скопируйте логин и пароль из личного кабинета заново, без пробелов. Параметры в логине (страна, город, сессия) проверьте по странице логин, порты и параметры. Подробнее о коде — на странице ошибки 407.
- Если пароль не хочется вставлять в строку, включите доступ по IP в кабинете (до 5 адресов на план) и подключайтесь без логина.
- Для SOCKS5 всегда берите
socks5h://. Что делать, когда SOCKS-сервер отвечает общей ошибкой, — на странице SOCKS5 general failure.
Как проверить, что всё заработало
Перед запуском выведите new URL(строка).hostname: там должен быть gw.prokso.com. Затем проверьте строку в проверке прокси и сделайте запрос через агент на https://prokso.com/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 в socks-proxy-agent?
В исходном коде пакета для socks5 название сайта превращает в IP ваш компьютер, для socks5h и просто socks — прокси. О самом протоколе — в глоссарии: <a href="/ru/glossary/socks5">SOCKS5</a>.
Нужно ли кодировать логин, а не только пароль?
Да, если в логине есть спецсимволы. Агенты декодируют обе части, так что encodeURIComponent для логина ничего не испортит.
Как подключить агент в своём коде?
Передайте агент в опцию agent модулей http и https или в httpsAgent для axios. Примеры — в инструкции <a href="/ru/guide/nodejs">Node.js</a>.
Другие ошибки прокси
Резидентские $1.59, мобильные $2.50, серверные $0.65 за 1 ГБ
Регистрация за минуту, доступы сразу после оплаты.