Что нового

Отправка GET запроса,проблема с ответом.

Gzzk

Новичок
Сообщения
104
Репутация
1
Код:
$sDomain = 'montytool.ru' ;домен или ip-адрес
$iPort = 80 ;порт

;Запрос, который будет отправлен серверу
$sRequest = 'GET /tasks/check?id=39297/ HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'Accept: */*' & @CRLF
$sRequest &= 'X-Requested-With: XMLHttpRequest' & @CRLF
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17' & @CRLF
$sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
$sRequest &= 'Referer: http://montytool.ru/tasks' & @CRLF
$sRequest &= 'Accept-Encoding: gzip,deflate,sdch' & @CRLF
$sRequest &= 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' & @CRLF
$sRequest &= 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3' & @CRLF
$sRequest &= 'PHPSESSID=lspb98gqnvgth9cef0jc558rq0; user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5; _user_id=190405458; _user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5' & @CRLF & @CRLF

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

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

If @error Then
    MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

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) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 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', $sData)
Сей код в теории должен отправлять такой запрос:
Код:
GET /tasks/check?id=39411 HTTP/1.1
Host: montytool.ru
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Content-Type: application/x-www-form-urlencoded
Referer: http://montytool.ru/tasks
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: PHPSESSID=lspb98gqnvgth9cef0jc558rq0; user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5; _user_id=190405458; _user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5
А получать что-то вроде этого:
Код:
{"error_code":2}
или
Код:
{"error_code":1,"points":"10"}
Однако срабатывает условие "Полученные данные неверны.".
Помогите,ведь я не столь опытен,как вы.
Заранее спасибо за ответы.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Может сессия устарела и куки недействительные?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Gzzk [?]
срабатывает условие "Полученные данные неверны.".
Видимо проблема в регулярном выражении.
Что выдаёт $sData?
 

darkwhite

Знающий
Сообщения
129
Репутация
5
Gzzk [?]
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
If @error Then
MsgBox(16, 'Ошибка', 'Полученные данные неверны.')
Exit 5
EndIf
этой частью кода вы пытаетесь вычлденить ответ сервера
но проверяете ошибку самой функции
Код:
StringRegExp

согласен с CreatoR дело в шаблоне выражения - посмотрите сначала сам полученный ответ а затем что вам предлагает после выборки шаблон
 
Автор
G

Gzzk

Новичок
Сообщения
104
Репутация
1
При таком коде выходит следующее,отмечу что 1 - непонятное значение,появляющееся каждый раз когда я отправляю пакет,т.е. неверное значение.
Код:
$aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')

MsgBox(0, 'Data', $sData)
MsgBox(0, 'Data', $aData)

b18a4182bdad.jpg

bd22e7355906.jpg
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gzzk,
У Вас ошибка в запросе. Так у меня работает, только Cookie новые вставьте, если с этими уже не работает.
Код:
$sDomain = 'montytool.ru' ;домен или ip-адрес
$iPort = 80 ;порт

;Запрос, который будет отправлен серверу
$sRequest = 'GET /tasks/check?id=39297/ HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
$sRequest &= 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17' & @CRLF
$sRequest &= 'Host: ' & $sDomain & @CRLF
$sRequest &= 'Referer: http://montytool.ru/tasks' & @CRLF
$sRequest &= 'Connection: Close' & @CRLF
$sRequest &= 'Cookie: PHPSESSID=lspb98gqnvgth9cef0jc558rq0; user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5; _user_id=190405458; _user_hash=770bc2afdfcd1e47d59c5557475f6e3c8efd4bc5' & @CRLF & @CRLF
ConsoleWrite($sRequest & @LF)
If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
	MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
	Exit 1
EndIf

$sIP = TCPNameToIP($sDomain) ;получаем ip-адрес

If @error Then
	MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
	Exit 2
EndIf

$iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером

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

TCPSend($iSocket, $sRequest) ;отправляем сообщение

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

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

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

TCPCloseSocket($iSocket)
TCPShutdown()
ConsoleWrite($sData & @LF)
 
Верх