| Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум на Исходниках.RU > Delphi: Сетевое программирование > Ошибка TIdHTTP.Get при использовании прокси |
| Автор: Jin X 04.04.22, 10:40 |
| Получаю ошибку Exception EIdHTTPProtocolException с сообщением HTTP/1.1 400 Bad Request. Прокси 100% рабочий, логин-пароль верный. Проверено в браузерах FireFox и IE. ЧЯДНТ? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> {$APPTYPE CONSOLE} uses System.SysUtils, IdHTTP, IdSocks, IdSSLOpenSSL, IdCookieManager, IdCompressorZLib, IdURI; const DefaultUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'; DefaultReferer = 'https://google.com/'; ProxyURI = 'https://user:pwd@1.2.3.4:10733'; // здесь, естественно, проставлены нужные данные RequestURL = 'https://2ip.ru'; var HTTPS: TIdHTTP; begin HTTPS := TIdHTTP.Create(nil); with HTTPS do begin IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPS); CookieManager := TIdCookieManager.Create(HTTPS); Compressor := TIdCompressorZLib.Create(HTTPS); HandleRedirects := True; AllowCookies := True; Request.UserAgent := DefaultUserAgent; Request.Accept := '*/*'; Request.AcceptEncoding := 'gzip, deflate, br'; Request.ContentType := 'text/plain;charset=UTF-8'; Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'; Request.Connection := 'keep-alive'; Request.Referer := DefaultReferer; with ProxyParams, TIdURI.Create(ProxyURI) do begin ProxyServer := Host; ProxyPort := StrToIntDef(Port, 8080); ProxyUsername := Username; ProxyPassword := Password; end; WriteLn(Get(RequestURL)); Free; end; end. Добавлено Тот же прокси для SOCKS (там отличается только порт) прекрасно работает: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> {$APPTYPE CONSOLE} uses System.SysUtils, IdHTTP, IdSocks, IdSSLOpenSSL, IdCookieManager, IdCompressorZLib, IdURI; const DefaultUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'; DefaultReferer = 'https://google.com/'; ProxyURI = 'socks5://user:pwd@1.2.3.4:3128:10734'; // здесь, естественно, проставлены нужные данные ProxySocksVersion = svSocks5; RequestURL = 'https://2ip.ru'; var HTTPS: TIdHTTP; begin HTTPS := TIdHTTP.Create(nil); with HTTPS do begin IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPS); CookieManager := TIdCookieManager.Create(HTTPS); Compressor := TIdCompressorZLib.Create(HTTPS); HandleRedirects := True; AllowCookies := True; Request.UserAgent := DefaultUserAgent; Request.Accept := '*/*'; Request.AcceptEncoding := 'gzip, deflate, br'; Request.ContentType := 'text/plain;charset=UTF-8'; Request.AcceptLanguage := 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'; Request.Connection := 'keep-alive'; Request.Referer := DefaultReferer; with TIdSSLIOHandlerSocketOpenSSL(IOHandler), TIdURI.Create(ProxyURI) do begin if not Assigned(TransparentProxy) then TransparentProxy := TIdSocksInfo.Create(HTTPS); begin TransparentProxy.Host := Host; TransparentProxy.Port := StrToIntDef(Port, 1080); TransparentProxy.Username := Username; TransparentProxy.Password := Password; if Username = '' then TIdSocksInfo(TransparentProxy).Authentication := saNoAuthentication else TIdSocksInfo(TransparentProxy).Authentication := saUsernamePassword; TIdSocksInfo(TransparentProxy).Version := ProxySocksVersion; end; end; WriteLn(Get(RequestURL)); Free; end; end. |
| Автор: Jin X 04.04.22, 19:11 |
| В первом коде пишу ProxyURI = 'https://66.94.120.161:443' – всё работает. А этот прокси работает в браузерах, но в проге не хочет. Не понимаю, в чём прикол?! Добавлено Причём, с прокси он соединяется, но почему-то выдаёт ошибку 400. Если поменять пароль, скажем, на неверный, будет ошибка авторизации. Добавлено Короче, вот что я ещё сделал. Накидал прожку на Python: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> import requests #proxy = { 'https': '66.94.120.161:443' } proxy = { 'https': 'https://***:***@1.2.3.4:10733' } print(requests.get('https://2ip.ru', proxies=proxy).json()) Результат: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Traceback (most recent call last): File "D:\Lang\Python3\lib\site-packages\urllib3\connectionpool.py", line 700, in urlopen self._prepare_proxy(conn) File "D:\Lang\Python3\lib\site-packages\urllib3\connectionpool.py", line 994, in _prepare_proxy conn.connect() File "D:\Lang\Python3\lib\site-packages\urllib3\connection.py", line 364, in connect self.sock = conn = self._connect_tls_proxy(hostname, conn) File "D:\Lang\Python3\lib\site-packages\urllib3\connection.py", line 499, in _connect_tls_proxy socket = ssl_wrap_socket( File "D:\Lang\Python3\lib\site-packages\urllib3\util\ssl_.py", line 453, in ssl_wrap_socket ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls) File "D:\Lang\Python3\lib\site-packages\urllib3\util\ssl_.py", line 495, in _ssl_wrap_socket_impl return ssl_context.wrap_socket(sock) File "D:\Lang\Python3\lib\ssl.py", line 500, in wrap_socket return self.sslsocket_class._create( File "D:\Lang\Python3\lib\ssl.py", line 1040, in _create self.do_handshake() File "D:\Lang\Python3\lib\ssl.py", line 1309, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\Lang\Python3\lib\site-packages\requests\adapters.py", line 440, in send resp = conn.urlopen( File "D:\Lang\Python3\lib\site-packages\urllib3\connectionpool.py", line 785, in urlopen retries = retries.increment( File "D:\Lang\Python3\lib\site-packages\urllib3\util\retry.py", line 592, in increment raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='2ip.ru', port=443): Max retries exceeded with url: / (Caused by ProxyError('Your proxy appears to only use HTTP and not HTTPS, try changing your proxy URL to be HTTP. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#https-proxy-error-http-proxy', SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)')))) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\proj\download.py", line 5, in <module> print(requests.get('https://2ip.ru', proxies=proxy).json()) File "D:\Lang\Python3\lib\site-packages\requests\api.py", line 75, in get return request('get', url, params=params, **kwargs) File "D:\Lang\Python3\lib\site-packages\requests\api.py", line 61, in request return session.request(method=method, url=url, **kwargs) File "D:\Lang\Python3\lib\site-packages\requests\sessions.py", line 529, in request resp = self.send(prep, **send_kwargs) File "D:\Lang\Python3\lib\site-packages\requests\sessions.py", line 645, in send r = adapter.send(request, **kwargs) File "D:\Lang\Python3\lib\site-packages\requests\adapters.py", line 513, in send raise ProxyError(e, request=request) requests.exceptions.ProxyError: HTTPSConnectionPool(host='2ip.ru', port=443): Max retries exceeded with url: / (Caused by ProxyError('Your proxy appears to only use HTTP and not HTTPS, try changing your proxy URL to be HTTP. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#https-proxy-error-http-proxy', SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1129)')))) Неверная версия SSL ??? |
| Автор: Fr0sT 12.04.22, 07:45 |
| Сначала убедиться, что трафик от твоей программы до прокси идентичен трафику от браузеров. |
| Автор: Jin X 13.04.22, 11:17 |
Fr0sT, каким образом? ![]() Вообще, этот прокси для использования в софте, по идее, не должен какие-то особенные требования предъявлять |
| Автор: Fr0sT 19.04.22, 13:16 |
| Сниффер. Или логи в самом приложении. Если софт_А работает, а софт_Б - нет - алгоритм очень простой, надо всего лишь подогнать софт_Б под работающий вариант |