Что нового

Авторизация методом POST на сайте

mef-t

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

Помогите написать код авторизации на сайте методом "POST", или через http-аутентификацию.

Авторизация через GET запрос проходит успешно.
Ниже строка запроса

Ниже параметры формы для POST запроса (собраны в ссылке GET запроса)
localeSelect=ru
action=ident
frompage=http://www.urban-rivals.com
[email protected]
password=init123456

При этом ни один из вариантов, описанных тут http://autoit-script.ru/index.php/topic,3925.15.html#post_inet_3 мне не помог.

Во всех вариантах нет ответа от сервера.

Ниже один из примеров, который не работает.
Код:
#include "WinHttp.au3"
;~ #Include <INet.au3> ;Подключаем библиотеку

$hOpen = _WinHttpOpen('au3browser') ;инициализируем использование WinHTTP-функций, указываем заголовок User-Agent

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

$hConnect = _WinHttpConnect($hOpen, 'www.urban-rivals.com') ;создаём соеденение, указываем только домен/ip-адрес

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

$sData = _WinHttpSimpleRequest($hConnect, 'POST', 'ru/player/signin.php', Default, 'localeSelect=ru&action=ident&frompage=http://www.urban-rivals.com&[email protected]&password=init123456') ;отправляем запрос, указываем его метод, адрес страницы без домена и параметры

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

_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

MsgBox(0, 'Data', $sData)



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

Поспешил.
Ответ дома получается. Видимо на работе что-то перекрыто.

Но как после этого воспользоваться авторизацией?
Любые обращения к страницы возвращают предложение авторизоваться.
Пример:
Код:
$HTML = _INetGetSource('http://www.urban-rivals.com/ru/market/?show=0&action=buy&group=all&orderby=asc&sortby=price') ;Получаем HTML код страницы

Возможно следует указать другого "User-Agent"?
Если да, то какого, чтобы можно было продолжить работать с исходным кодом сайта?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
если пользуйтесь _WinHttpOpen то забудьте про _INetGetSource и прочие.
Обычно, когда авторизация пройдена, сервер возвращает куки файлы, которые браузер отсылает обратно при навигациях по страницам. Так что, храните куки!
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Почитал про работу с куками.
Как я понял, суть в том, чтобы передавать их вместе с запросом.
Код:
$oHTTP.SetRequestHeader('Cookie', $sCookies) ; не забываем про куку!

Но на
Код:
$sHTML = $oHTTP.ResponseText
я не получаю ответа

В чем проблема? Просьба помочь разобраться.

Код:
Код:
#include <IE.au3>
$sLogin = '[email protected]'
$sPassword = 'init123456'

Login($sLogin, $sPassword)

Func Login($login, $pass)
    $oHTTP = ObjCreate('WinHttp.WinHttpRequest.5.1')
    $oHTTP.Open('GET', 'http://www.urban-rivals.com') ; идем на главную страницу
    $oHTTP.Send('')
    $oHTTP.WaitForResponse
    $sHTML = $oHTTP.ResponseText
    $sCookies = $oHTTP.GetResponseHeader('Set-Cookie') ; получаем куку
    $sCookies = StringRegExpReplace($sCookies, '^([^;]+).*', '$1;') ; выдираем из нее PHPSESSID=.....
    $sSessionID = StringRegExpReplace($sHTML, "(?si).*?hashLoginPassword\(this,\s.([^']+).*", '$1') ; из HTML-кода получаем SessionId для js
    $oHTTP.Open('POST', 'http://www.urban-rivals.com/ru/player/signin.php') ; идем на форму авторизации
    $oHTTP.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ; без этого заголовка данные формы не передаются!
    $oHTTP.SetRequestHeader('Cookie', $sCookies) ; пихаем куку
    $oHTTP.Send('localeSelect=ru&action=ident&frompage=http://www.urban-rivals.com&login='&$sLogin&'&password='&$sPassword) ; передаем данные пользователя: имя, пароль, остальное
    $oHTTP.WaitForResponse
    $sHTML = $oHTTP.ResponseText
;~  ConsoleWrite($sHTML & @CRLF)
    $oHTTP.Open('GET', 'http://www.urban-rivals.com/ru/market/?show=0&action=buy&group=all&orderby=asc&sortby=price') ; дальше идем куда хотим
    $oHTTP.SetRequestHeader('Cookie', $sCookies) ; не забываем про куку!
    $oHTTP.Send('')
    $oHTTP.WaitForResponse
    $sHTML = $oHTTP.ResponseText
;~     ConsoleWrite($sHTML & @CRLF)
	ClipPut ( $sHTML )
EndFunc


P.S. Я должен передавать все данные заголовка, или же только основные ?

FireBag возвращает следующее, и меня смущает, что заголовков больше, чем я передаю:
Код:
Заголовки ответапоказать исходный код
Cache-Control	no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection	Keep-Alive
Content-Encoding	gzip
Content-Language	ru
Content-Type	text/html; charset=UTF-8
Date	Thu, 14 Mar 2013 03:15:11 GMT
Expires	Thu, 19 Nov 1981 08:52:00 GMT
P3P	policyref="/w3c/p3p.xml"
Pragma	no-cache
Server	Apache/2.2.22 (Ubuntu)
Set-Cookie	locale=ru; expires=Tue, 13-Mar-2018 03:15:11 GMT; path=/ UR_SESSID=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/ ur_auto_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/ ur_auto_pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/
Transfer-Encoding	chunked
Vary	Accept-Encoding
Заголовки запросапоказать исходный код
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding	gzip, deflate
Accept-Language	ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Connection	keep-alive
Cookie	locale=ru; __utma=254262860.874205635.1363026444.1363189520.1363228668.6; __utmz=254262860.1363026444.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); PHPSESSID=d0ffaaea167070b8e538b57078c5e04c; roar=1264970992; lastNewsID=5963; __utmc=254262860; captcha=t5QT2hYRHJE%3D; __utmb=254262860.14.10.1363228668; defaultNewsTab=gameNews; defaultRankingTab=rankingDay; last_news=0; lastWindow=Window-0.8051886583915637; feedDelay=540000
DNT	1
Host	www.urban-rivals.com
User-Agent	Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0


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

Так же просьба подсказать, как можно просто записать куки в нужную директорию файлом. Что бы можно было пользоваться _INetGetSource
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Код:
$LogIN 		= "[email protected]"
$PassWORD 	= "init123456"


	$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
	  If @error Then
		 MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
		 Exit 1
	  EndIf
	  $oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc')
	$oRequest.Option(6) = False ;WinHttpRequestOption_EnableRedirects
	$oRequest.Open('GET', 'http://www.urban-rivals.com/ru/player/signin.php?localeSelect=ru&action=ident&frompage=http://www.urban-rivals.com&login='&$LogIN&'&password='&$PassWORD, 0)
		$oRequest.Send()
		$oRequest.WaitForResponse
	$oRequest.Open('GET', 'http://www.urban-rivals.com/', 0)
		$oRequest.Send()
	$sData = $oRequest.ResponseText
	If $sData Then
		ConsoleWrite('Player Games - yes'&@CRLF)
		$oRequest.Open('GET', 'http://www.urban-rivals.com/ru/market/?show=0&action=buy&group=all&orderby=asc&sortby=price', 0)
		$oRequest.Send()
		$sDataPrice = $oRequest.ResponseText
			If $sDataPrice Then
				ConsoleWrite('Мы в ПРАЙСЕ'&@CRLF)
				ClipPut ( $sDataPrice )
			EndIf
	EndIf
	$oErrorHandler = 0 ;выключаем обработчик ошибок


Func ErrorFunc()
    MsgBox(16, 'Ошибка', $oErrorHandler.description)
    Exit 2
EndFunc
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Прошу прощения, но я в первом посте писал, что авторизация методом GET не вызывает каких либо трудностей.
Интересует авторизация методом POST.
 
Автор
mef-t

mef-t

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