Что нового

Помогите составить POST и GET запросы !

uritalex

Новичок
Сообщения
197
Репутация
3
Добрый вечер знатоки ! После ряда манипуляций с автоматизацией одного из сайтов через IE возникла острая необходимость сделать то же но с помощью запросов. В запросах я не просто 0 я -100000 :( по сайту смотрел но ни чего не выходит :( бьюсь уже которую неделю а результата не видно. Помогите кто чем может :smile:
вот то что у меня есть :
Код:
$sEmail="[email protected]"
$sPass="111111"




$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open ('POST', 'http://pumpyt.com/')
$oHTTP.SetRequestHeader('Host', 'pumpyt.com')
$oHTTP.SetRequestHeader('Proxy-Connection', 'keep-alive')
$oHTTP.SetRequestHeader('Accept', '*/*')
$oHTTP.SetRequestHeader('Origin', 'http://pumpyt.com')
$oHTTP.SetRequestHeader('X-Requested-With', 'XMLHttpRequest')
$oHTTP.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')
$oHTTP.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
$oHTTP.SetRequestHeader('Referer', 'http://pumpyt.com/')
$oHTTP.SetRequestHeader('Accept-Encoding', 'gzip, deflate')
$oHTTP.SetRequestHeader('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')
$oHTTP.SetRequestHeader('Content-Length', '120')


;Передаем логин-пароль
$oHTTP.Send('email='&$sEmail&'&password='&$sPass)
$oHTTP.WaitForResponse

$resp=$oHTTP.ResponseText

;выести в файл текст ответа (страницу)
; затем перейти с помощью GET на страницу http://pumpyt.com/profile  и получить текст страницы для дальнейшей обработки
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Сперва GET на главную, за куками и YII_CSRF_TOKEN - достаешь регуляркой.
Затем запрос POST на http://pumpyt.com/site/signin
В теле запроса:
email:[email protected]
password:111111
YII_CSRF_TOKEN:9c9ae077e4e1ce5939a0625a681c5554e446f199 (тут подставить валидный)
remember:0
action:sign

Дальше все тоже самое. Всегда можешь смотреть в отладчике браузера какие он запросы делает. И повторять.
Ps.
Код:
$oHTTP.SetRequestHeader('Accept-Encoding', 'deflate') всегда оставляй deflate, если не хочешь gzip декодировать.
$oHTTP.SetRequestHeader('Content-Length', '120') это надо убирать. Оно само посчитает.




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

P.s все данные в POST нужно кодировать в x-www-form-urlencoded, так [email protected] станет urist.alex%40gmail.com
Функция кодировки есть в WinHttp UDF
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Благодарю за ответ :smile: хоть не оч многое понял но есть с чего начать!
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Могу пояснить.
Форма входа на тот сайт прячет в (скрытом) поле с именем YII_CSRF_TOKEN - дополнительный секретный ключ, который защищает тебя от Межсайтовой подделки запроса. Этот ключ будет передан обратно на сервер вместе с логином и паролем. Браузер это делает при отправке формы, но т.к у тебя не браузер, а обычный запрос, то задача - сделать все так, как это делает браузер.
Для этого, в форме нужно отыскать все элементы с именем, даже скрытые и включить их в тело запроса.
Вот они:
Код:
email:[email protected]
password:111111
YII_CSRF_TOKEN:9c9ae077e4e1ce5939a0625a681c5554e446f199 (тут подставить валидный)
remember:0
action:sign
Откуда их взять?
Некоторые из них уже известны это email, password, remember, action. Но вот YII_CSRF_TOKEN - должен изменяться. Поэтому его нужно "вытащить" из кода страницы, а что бы получить код - нужно сделать запрос. Это GET на главную (ресурс /) т.к форма авторизации доступна от туда.

Открой исходный код и увидишь его:
Код:
<input type="hidden" value="9c9ae077e4e1ce5939a0625a681c5554e446f199" name="YII_CSRF_TOKEN">
Вот его регулярными выражениями и доставай.

Как только все данные собраны, вторым запросом войдешь на сайт.
Открой "Инструменты разработчика" и зайди в вкладку Network, установи галочку "Preserve log" Открой фильтры и выбери XHR и DOC.
Впиши логин и пароль и нажми войти.
Увидишь такое:


Я выделил запрос sigin. Слева видно Request URL:http://pumpyt.com/site/signin именно сюда надо отсылать все данные, метод виден тут же: Request Method:blum:OST
Если прокрутить, то видно все данные формы



Браузер из декодировал для лучшего отображения. А если нажать кнопочку view URL encoded, то покажет так:


именно так и нужно отправлять. Функцию кодирования можно достать из WinHTTP UDF (посмотри у меня в подписи есть ссылка), называется она __WinHttpURLEncode.

По поводу
Код:
$oHTTP.SetRequestHeader('Accept-Encoding', 'deflate')

Здесь ты указываешь серверу в какой кодировке сможешь принять ответ, т.к изначально у тебя стоит gzip, deflate, то сервер ответ сожмет. Но объект WinHttp.WinHttpRequest.5.1 не умеет разжимать, поэтому убирай gzip.

Код:
$oHTTP.SetRequestHeader('Content-Length', '120')

А вот тут наоборот, WinHttp.WinHttpRequest.5.1 как раз все умеет, и поэтому сам все посчитает и это заголовок добавит, поэтому вручную его не надо устанавливать.

Надеюсь так понятнее стало 8)
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Благодарю за более подробные разъяснения :beer: уже GET составил возвращает код страницы. Теперь изучаю регулярку :(
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
uritalex сказал(а):
Благодарю за более подробные разъяснения :beer: уже GET составил возвращает код страницы. Теперь изучаю регулярку :(
А вместо регулярки можно попробовать это использовать...
Подключим в начале
Код:
#include <IE.au3>

Делаем запрос ...
Создаём объект:
Код:
$oHTML = ObjCreate("HTMLFILE")

Записываем в него HTML код:
Код:
$oHTML.Write( "<p>здесь весь HTML код страницы</p>" )

Код:
$oHTML.Write( $oHttp.responseText )

Всё, объект с данными готов, работаем.
Код:
$oElems = _IETagNameGetCollection($oHTML, "input")
$sLog = "fields: input;"&@CRLF
For $oElem In $oElems
  If StringLen($oElem.name) <= 1 Then ContinueLoop
  Switch $oElem.name
    Case "firstname"
      _IEFormElementSetValue($oElem, "имя")
    Case "lastname"
      _IEFormElementSetValue($oElem, "фамилия")
  EndSwitch
  $sLog &= StringFormat("field\r\n name: %s\r\n value: %s\r\n-----\r\n", $oElem.name, _IEFormElementGetValue($oElem))
Next
ConsoleWrite($sLog)
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
Благодарю за ответ слегка его изменил

Код:
$oHTML = ObjCreate("HTMLFILE")
$oHTML.Write($sData)

$oElems = _IETagNameGetCollection($oHTML, "input")
For $oElem In $oElems
 If $oElem.name = "YII_CSRF_TOKEN" Then
  $YII = $oElem.getAttribute('value')
 ConsoleWrite($YII)
 ExitLoop
Endif

Next
но возникло такое чудо http://c2n.me/3slPV49 что очень не желательно т.к. скрипт останавливается :( (Может где то я и напортачил )

Но получилось так:
Код:
$str =  StringRegExp($sData, '<input type="hidden" value="(.*?)" name="YII_CSRF_TOKEN">', 3)
может и не совсем правильно, но результат (данные) получил :smile: Буду дальше с запросами колдовать :smile:
 
Автор
U

uritalex

Новичок
Сообщения
197
Репутация
3
И снова я и снова с тем же :( данные с первого запроса вытянул, и как бы отправил Но вот что то не так вот код с которым бьюсь:
Код:
Global $LogIn = "[email protected]"
Global $Pasword = "111111"

_Cookie()

Global $LogInn = __WinHttpURLEncode ($LogIn, "text/html" )
ConsoleWrite($LogInn & @CRLF)

_LogIn ()
_Cookie1()

Func _Cookie()
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open ('GET', 'http://pumpyt.com/')
$oHTTP.SetRequestHeader('Host', 'pumpyt.com')
$oHTTP.SetRequestHeader('path', '/')
$oHTTP.SetRequestHeader('scheme', 'http')
$oHTTP.SetRequestHeader('version', 'HTTP/1.1')
$oHTTP.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')
$oHTTP.SetRequestHeader('Accept-Encoding', 'deflate')
$oHTTP.SetRequestHeader('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')
$oHTTP.Send()
Local  $sSite = $oHTTP.ResponseText
Global $str =  StringRegExp($sSite, '<input type="hidden" value="(.*?)" name="YII_CSRF_TOKEN">', 3)
$cookie = $oHTTP.GetResponseHeader('Set-Cookie')
$cookie6 = $oHTTP.GetAllResponseHeaders
Global $cookie2 = StringTrimRight ( $cookie , 8 )
ConsoleWrite($cookie2 & @CRLF)
Global $str1 =  StringRegExp($cookie6, 'Set-Cookie: YII_CSRF_TOKEN=(.*?); path=/', 3)
ConsoleWrite($cookie6 & @CRLF)
ConsoleWrite($str [0] & @CRLF)
ConsoleWrite($str1 [0] & @CRLF)
EndFunc

Func _LogIn ()
	Local $Data = 'email='&$LogInn&'&password='&$Pasword&'&YII_CSRF_TOKEN='& $str [0]&'&remember=0&action=sign'
	Local $Coci = $cookie2&'YII_CSRF_TOKEN='&$str1 [0]&'; _ga=GA1.2.1567899009.1451765387; _gat=1; _ym_uid=1451765388946175217; _ym_isad=0; jv_enter_ts_BBNNWULmZd=1451765388117; jv_visits_count_BBNNWULmZd=1; _ym_visorc_22399945=w; jv_gui_state_BBNNWULmZd=WIDGET'

$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open ('POST', 'http://pumpyt.com/site/signin', 0)
$oHTTP.SetRequestHeader('Host', 'pumpyt.com')
$oHTTP.SetRequestHeader('Connection', 'keep-alive')
$oHTTP.SetRequestHeader('Accept', '*/*')
$oHTTP.SetRequestHeader('Origin','http://pumpyt.com')
$oHTTP.SetRequestHeader('version', 'HTTP/1.1')
$oHTTP.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')
$oHTTP.SetRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8')
$oHTTP.SetRequestHeader('Accept-Encoding', 'deflate')
$oHTTP.SetRequestHeader('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')
;$oHTTP.SetRequestHeader('Cookie', $Coci)
$oHTTP.Send($Data)
$oHTTP.WaitForResponse
$cookie3 = $oHTTP.GetResponseHeader('Set-Cookie')
Global $cookie4 = StringTrimRight ( $cookie3 , 8 )
$cookie7 = $oHTTP.GetAllResponseHeaders
ConsoleWrite($cookie4 & @CRLF)
ConsoleWrite($cookie7 & @CRLF)
EndFunc

Func _Cookie1()
	Local $Coci = 'YII_CSRF_TOKEN='& $str [0]&'_ga=GA1.2.1567899009.1451765387; _gat=1; _ym_uid=1451765388946175217; _ym_isad=0; jv_enter_ts_BBNNWULmZd=1451765388117; jv_visits_count_BBNNWULmZd=1; _ym_visorc_22399945=w; jv_gui_state_BBNNWULmZd=WIDGET; '& $cookie2

$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open ('GET', 'http://pumpyt.com//profile')
$oHTTP.SetRequestHeader('Host', 'pumpyt.com')
$oHTTP.SetRequestHeader('Cache-Control', 'max-age=0')
$oHTTP.SetRequestHeader('Connection', 'keep-alive')
$oHTTP.SetRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
$oHTTP.SetRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')
$oHTTP.SetRequestHeader('Accept-Encoding', 'deflate')
$oHTTP.SetRequestHeader('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4')
$oHTTP.SetRequestHeader('Cookie', $Coci)
$oHTTP.Send()
Local  $sSite = $oHTTP.ResponseText
ConsoleWrite($sSite & @CRLF)

EndFunc



Func __WinHttpURLEncode($vData, $sEncType = "")
	If IsBool($vData) Then Return $vData
	$vData = __WinHttpHTMLDecode($vData)
	If $sEnctype = "text/plain" Then Return StringReplace($vData, " ", "+")
	Local $aData = StringToASCIIArray($vData, Default, Default, 2)
	Local $sOut
	For $i = 0 To UBound($aData) - 1
		Switch $aData[$i]
			Case 45, 46, 48 To 57, 65 To 90, 95, 97 To 122, 126
				$sOut &= Chr($aData[$i])
			Case 32
				$sOut &= "+"
			Case Else
				$sOut &= "%" & Hex($aData[$i], 2)
		EndSwitch
	Next
	Return $sOut
EndFunc

Func __WinHttpHTMLDecode($vData)
	Return StringReplace(StringReplace(StringReplace(StringReplace($vData, "&amp;", "&"), "&lt;", "<"), "&gt;", ">"), "&quot;", '"')
EndFunc
Вроде пересмотрел все возможные примеры на сайте, крутил запросы и в ту сторону и в ту но не могу понять что не так :( Помогите понять где я накосячил. Данные для запросов брал из HttpAnalyzer Не могу получить текст страницы : http://pumpyt.com//profile
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Может быть будет проще через WinHttp UDF сделать. Не надо думать про куки. Как я понимаю объект WinHttp.WinHttpRequest.5.1 куки не передает автоматически.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs [?]
Как я понимаю объект WinHttp.WinHttpRequest.5.1 куки не передает автоматически
Совершенно верно. Браузеры cookie хранят в cash`е (в файлах или в базе данных).
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs [?]
А где хранит куки библиотека winhttp.dll
Во время работы программы IMHO в памяти. Браузеры (по идее) во время сеансов тоже должны работать с cookie в памяти, так быстрее.
Cookie Handling in WinHTTP
 
Верх