Что нового

[Сеть, интернет] Помогите разобраться с интрнет запросом через TCPConnect

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.

Ниже составлен запрос код

Код:
global $proxyUse = True

$proxy = "10.16.4.80" ; прокси
$proxy_port = 3128 ; прокси-порт

$sDomain = 'cars.auto.ru' ;домен или ip-адрес
$iPort = 80 ;порт
$path = "/list/?category_id=15&section_id=1&subscribe_id=&filter_id=&mark_id=-2&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=1000000&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=1&available_key=&change_key=&owner_pts=&stime=30&country_id=1&has_photo=1&region=0&region_id=14&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&_p=" ; URL страницы, без домена и с слешем в начале
$agent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0" ; User-Agent
;~ $agent = "mef-t" ; User-Agent

;Запрос, который будет отправлен серверу
$sRequest = 'GET ' & $path & 'HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$srequest &= "Host: " & $sDomain & @CRLF
$sRequest &= 'User-Agent: ' & $agent & '' & @CRLF
$srequest &= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" & @CRLF
$srequest &= "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3" & @CRLF
$srequest &= "Accept-Encoding: gzip, deflate" & @CRLF
$srequest &= "Cookie: UTGv2=h4f11f0accc1701637b60bf313060be97562; chcookie=1; autoru_sid=e8bce39ef952ab32_21301c7a0c7be72d8a6cdd13e5b49cc7; autoru_track=%7B%7D; __utma=1.406209656.1375869267.1376029661.1376294037.6; __utmz=1.1375869267.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); neova_resolution=1680x1050; currency_key=RUR; SPSI=3bce92bf5769d897d78573a98fd342ff; PRLST=Gp; __utmb=1.1.10.1376294037; __utmc=1; adOtr=9TbO3" & @CRLF
$srequest &= "Cache-Control: max-age=0" & @CRLF
$sRequest &= 'Connection: keep-alive' & @CRLF & @CRLF ;Заголовки

If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    Exit 1
EndIf

If $proxyUse Then
	$iSocket = TCPConnect($proxy, $proxy_port) ;соединяемся с сервером
Else
	$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
	If @error Then
		MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
		Exit 2
	EndIf
	$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
EndIf

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    Exit 3
EndIf

TCPSend($iSocket, $sRequest) ;отправляем сообщение
If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    Exit 4
EndIf

$sData = ''
$iTimer = TimerInit() ;запускаем таймер

Do
    $sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    $iError = @error
    If Not $sBuffer = '' Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > 3000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла

TCPCloseSocket($iSocket)
TCPShutdown()

$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')

If @error Then
    MsgBox(16, 'Ошибка', 'Полученные данные неверны.')
    Exit 5
EndIf

;~ MsgBox(0, 'Data', $aData[0])
;~ MsgBox(0, 'Data', $sData)


$hFile = FileOpen('Parser.txt', 2)
FileWrite($hFile, $sData)
FileClose($hFile)

Пользуюсь проксей, по этому вначале переключите параметр "$proxyUse" на "false".

Запрос возвращает:
HTTP/1.1 400 Bad Request
Server: squid/x.x.xx
Mime-Version: 1.0
Date: Mon, 12 Aug 2013 12:09:14 GMT
Content-Type: text/html
Content-Length: 3050
X-Squid-Error: ERR_INVALID_URL 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from ivn-ad01-proxy2
Via: 1.1 ivn-ad01-proxy2 (squid/x.x.xx)
Connection: close

В то время как ответ через браузер выглядит так:
HTTP/1.1 200 OK
Date: Mon, 12 Aug 2013 08:02:09 GMT
Server: nginx/1.2.3
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: chcookie=1; expires=Wednesday, 11-Sep-13 08:02:09 GMT; path=/; domain=.auto.ru
currency_key=RUR; expires=Tuesday, 12-Aug-14 08:02:09 GMT; path=/
cookie_test=1; expires=Friday, 02-Jan-70 00:00:00 GMT; path=/; domain=.auto.ru
SPSI=3bce92bf5769d897d78573a98fd342ff ; path=/; domain=.auto.ru
PRLST= ; expires=Fri, 09 Aug 2013 08:02:09 GMT; path=/; domain=.auto.ru
Content-Encoding: gzip
X-Cache: MISS from ivn-ad01-proxy2
Transfer-Encoding: chunked
Via: 1.1 ivn-ad01-proxy2 (squid/x.x.xx)
Connection: keep-alive

Просьба помочь разобраться, по какой причине я получаю "HTTP/1.1 400 Bad Request"

Возможно, где-то что-то упустил. Но найти не могу.

P.S. пробовал отправлять запрос и без куки, и с разными вариациями, результат одинаков. Предполагаю, что в самом запросе что-то не так.
 

Ilyialat

Новичок
Сообщения
54
Репутация
2
Посмотрел через Charles запросы и увидел, что перед "HTTP/1.1" нужен пробел. Но у меня и с ним не заработало. HTTP уже реализован в ядре, попробуйте его использовать, это будет приятнее, экономнее и быстрее:
Код:
$sUrl = "http://cars.auto.ru"
$sUrl &= "/list/?category_id=15&section_id=1&subscribe_id=&filter_id=&mark_id=-2&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=1000000&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=1&available_key=&change_key=&owner_pts=&stime=30&country_id=1&has_photo=1&region=0&region_id=14&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&_p="

;~ $ProxyServer = "ip:port"
;~ $ProxyUser = "login"
;~ $ProxyPass = "password"
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
;~ $oHTTP.SetProxy(2, $ProxyServer)
$oHTTP.Open("GET", $sUrl, False)
;~ $oHTTP.SetCredentials($ProxyUser, $ProxyPass, 0)
$oHTTP.Send("")
$oHTTP.WaitForResponse
$sHTML = $oHTTP.ResponseText
ConsoleWrite($sHTML & @CRLF)
Код украл отсюда:
http://autoit-script.ru/index.php?topic=5605.0
Почитайте, там практически все вопросы обсуждались.


Добавлено:
Сообщение автоматически объединено:

Ваш код работает. Переписал запрос по-своему:
Код:
$sRequest = "GET /list/?category_id=15&section_id=1&subscribe_id=&filter_id=&mark_id=-2&year%5B1%5D=&year%5B2%5D=&color_id=&price_usd%5B1%5D=1000000&price_usd%5B2%5D=&currency_key=RUR&body_key=&run%5B1%5D=&run%5B2%5D=&engine_key=0&engine_volume%5B1%5D=&engine_volume%5B2%5D=&drive_key=&engine_power%5B1%5D=&engine_power%5B2%5D=&transmission_key=0&used_key=&wheel_key=&custom_key=1&available_key=&change_key=&owner_pts=&stime=30&country_id=1&has_photo=1&region=0&region_id=14&sort_by=2&city_id=&output_format=1&client_id=0&extras%5B1%5D=0&extras%5B2%5D=0&extras%5B3%5D=0&extras%5B4%5D=0&extras%5B5%5D=0&extras%5B6%5D=0&extras%5B7%5D=&extras%5B8%5D=0&extras%5B9%5D=0&extras%5B10%5D=0&extras%5B11%5D=0&extras%5B12%5D=&extras%5B13%5D=0&extras%5B14%5D=0&extras%5B15%5D=0&extras%5B16%5D=0&extras%5B17%5D=0&extras%5B18%5D=&extras%5B19%5D=&extras%5B20%5D=&extras%5B21%5D=&extras%5B22%5D=&extras%5B23%5D=0&extras%5B24%5D=0&extras%5B25%5D=&extras%5B26%5D=&extras%5B27%5D=0&extras%5B28%5D=0&extras%5B29%5D=&submit=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8&_p= HTTP/1.1" & @CRLF
$sRequest &= "Content-Type: text/plain; Charset=UTF-8" & @CRLF
$sRequest &= "Accept: */*" & @CRLF
$sRequest &= "User-Agent: Mozilla/4.0 (compatible; Win32;)" & @CRLF
$sRequest &= "Host: cars.auto.ru" & @CRLF & @CRLF
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Про WinHTTP я в курсе. Пробовал и другие варианты.
Решил освоить данный путь.

По приведенному Вами примеру попробую. Если получится, значит на сайте проверки на содержимому запроса.

Спасибо


Добавлено:
Сообщение автоматически объединено:

Но возвращается все равно "HTTP/1.1 400 Bad Request".
Проверю еще из дома, без прокси


Добавлено:
Сообщение автоматически объединено:

С проксей не работает, а без нее все нормально.

Осталось разобраться, как не закрыть сессию, т.е. сделать "Connection: keep-alive" вместо
"Connection: close"
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Я так и пишу.
Все равно возвращает "Connection: close"
 
Верх