Что нового

[Сеть, интернет] И всетаки, кто покажет живой код приема и передачи cookie

dimontag

Новичок
Сообщения
22
Репутация
0
за пример можно взять любой сайт с логином и паролем
Лучше если это будет без браузера.
Идеально - WinHttp.WinHttpRequest.5.1
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Выдрал кусок рабочего кода.
Способ парсинга куков из ответа, не эталонный, есть проще, просто в той задаче была необходимость парсить именно так, а переписывать лень.

Код:
; Авторизация
Func Login($email,$pass)
	$data = "login_post_vars"
	$oHTTP.Open("POST", "http://serverxxxxxxxx.com/login.php")
	$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
    $oHTTP.SetRequestHeader("Accept", "*/*")
    $oHTTP.SetRequestHeader("Accept-Language", "ru")
	$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
	$oHTTP.SetRequestHeader("User-Agent", $USER_AGENT)
	$oHTTP.SetRequestHeader("Host","serverxxxxxxxx.com")
	$oHTTP.SetRequestHeader("Content-Length",StringLen($data))
	$oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive")
	$oHTTP.SetRequestHeader("Pragma", "no-cache")
	If $PROXY<>"" Then
	   $oHTTP.SetProxy(2,$PROXY)
	EndIf
	$oHTTP.Send($data)
	$oHTTP.WaitForResponse
	If @error Then
	   Return 0
    EndIf
    $headers = $oHTTP.GetAllResponseHeaders()
	$resp    = $oHTTP.Responsetext
	If StringInStr($resp,"good")>0 Then
	   GetCookie($headers)
	   Return True
       Else
	   Return False
	EndIf
EndFunc



; Получаем cookie из заголовков ответа
Func GetCookie($headers)
	Local $Cookie_String
	$headers = StringSplit($headers,@LF)
	For $i=1 to $headers[0]
		If StringInStr($headers[$i],"Set-Cookie")>0 Then
		   $start         = StringInStr($headers[$i],"Set-Cookie:")+12
           $str           = StringSplit(StringMid($headers[$i],$start),";")
           $Cookie_String&= $str[1]&"; "
		EndIf
	Next
        $Cookie_String        = StringStripWS($Cookie_String,1)
	$Cookie_String        = StringStripWS($Cookie_String,2)
	$Cookie_String        = StringLeft($Cookie_String,StringLen($Cookie_String)-1)
	$COOKIE = $Cookie_String
EndFunc


Как передавать надеюсь разберешься :-X
 

andrew_vvv

Новичок
Сообщения
3
Репутация
0
El Panda а можешь написать весь код, а то никак не разберусь до конца? :smile:
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Кстати возможно в коде выше ошибка, в переменную
Код:
$COOKIE
ничего не попадает, ну может только в моем случае.

Куки заполучил таким образом, правда не знаю, меняется ли номер строки или нет...
Код:
Func GetCookie($headers)
$Cookie_String=StringSplit($headers,@CRLF);''
$COOKIE=StringRegExpReplace($Cookie_String[17],'.*e:\s(.*).*','\1')
EndFunc
 

evg64

Новичок
Сообщения
6
Репутация
0
Выдрал кусок рабочего кода...
Попробовал нечто подобное сделать на примере Вконтакте, не вышло: в конце сообщения привожу $resp.
А что указывать в качестве параметров $USER_AGENT и $PROXY? Иеще есть ли какие-нибудь UDF для http в АвтоИт3?


Код:
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/0.7.59</center>
</body>
</html>
<!-- The padding to disable MSIE's friendly error page -->
<!-- The padding to disable MSIE's friendly error page -->
<!-- The padding to disable MSIE's friendly error page -->
<!-- The padding to disable MSIE's friendly error page -->
<!-- The padding to disable MSIE's friendly error page -->
<!-- The padding to disable MSIE's friendly error page -->


Можно организовать себе небольшой ликбез по WinHttp? (А то я не понял, как работает функция Login($email,$pass))
Ко всем строкам напишу коммент. Где-то будет предположение о том, что делает строка, где-то будет коммент в формате "Что эта строка делает?" ) Итак:
Код:
   $data = "login_post_vars" ; login_post_vars - это надо писать, когда хочешь залогиниться?
    $oHTTP.Open("POST", "http://serverxxxxxxxx.com/login.php") ; открываем соединение, пока понятно
    $oHTTP.setTimeouts(5000, 5000, 15000, 15000) ; выставляем таймауты (для чего именно не знаю, но на данном этапе и не надо)
    $oHTTP.SetRequestHeader("Accept", "*/*") ; что делает эта строка?
    $oHTTP.SetRequestHeader("Accept-Language", "ru") ; что в этой строке переводится на русский язык?
    $oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded") ; что делает эта строка?
    $oHTTP.SetRequestHeader("User-Agent", $USER_AGENT) ; что такое пользовательский агент?
    $oHTTP.SetRequestHeader("Host","serverxxxxxxxx.com")
    $oHTTP.SetRequestHeader("Content-Length",StringLen($data)) ; это ясно
    $oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive"); прокси для чего это? не понимаю)
    $oHTTP.SetRequestHeader("Pragma", "no-cache") ; это не понимаю

Всем, кто поможет разобраться коде - большое спасибо! Это гораздо удобнее, чем курить разрозненный MSDN, где а) не все понятно б) написано не применительно к АвтоИт, в) все на английском
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
evg64 [?]
А что указывать в качестве параметров $USER_AGENT и $PROXY? Иеще есть ли какие-нибудь UDF для http в АвтоИт3?

Наверно ты не поверишь, но указывать нужно User Agent и Proxy в формате ip:blum:ort ;D
UDF есть только они проигрывают в функциональности работе с WinHttp.WinHttpRequest
 

evg64

Новичок
Сообщения
6
Репутация
0
El Panda сказал(а):
Наверно ты не поверишь, но указывать нужно User Agent и Proxy в формате ip:blum:ort ;D
Я в этом совсем еще чайник) За ip брать @IPAddress1?
А порт какой указывать?
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
evg64 [?]
Я в этом совсем еще чайник) За ip брать @IPAddress1?А порт какой указывать?

Нет. Лучше убери эти строки, если не понимаешь для чего они.
А в юзер агент укажи что-то типа "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

Читай (гугли) про http заголовки, пока не разберешся, лучше не продолжай.
 

evg64

Новичок
Сообщения
6
Репутация
0
Почему в функции Login($email,$pass) не используются ее параметры? Куда в функции написать $email,$pass, чтобы авторизоваться?
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
evg64 [?]
Почему в функции Login($email,$pass) не используются ее параметры? Куда в функции написать $email,$pass, чтобы авторизоваться?

Уважаемый, это обобщенный пример, который не следует расценивать как рабочую функцию. Для каждого конкретного сервера нужно формировать свой http запрос.
Эти параметры ($email, $pass) нужно передавать в соответствующих переменных строки $data если используется POST запрос.
 

evg64

Новичок
Сообщения
6
Репутация
0
Помогите получить исходный код страницы, через WinHttp на примере вконтакте (сначала надо авторизоваться, потом получить исходный код):
Код:
$sEmail="Мое мыло" ; тут, разумеется, ввожу реальные данные
$sPass="Мой пароль"

; Сначала проходим авторизацию
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST","http://vkontakte.ru/login.php")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
$oHTTP.SetRequestHeader("Accept-Language", "ru")
$oHTTP.SetRequestHeader("Referer","http://vkontakte.ru/login.php")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")
$oHTTP.SetRequestHeader("Host","vkontakte.ru")
$oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive")
$oHTTP.Send("login=" & $sEmail & "&pass=" & $sPass)
$oHTTP.WaitForResponse

; Теперь получаем исходный код страницы, когда мы уже авторизовались.
$oHTTP.Open("GET","http://vkontakte.ru/login.php")
$oHTTP.Send()
$oHTTP.WaitForResponse
MsgBox(0,0,$oHTTP.ResponseText)
Вышеописанное не работает, выдает код страницы логина, а не моего профайла, в чем ошибка не пойму...
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Код:
Global $cookie
$sEmail=""
$sPass=""

Func login()
; Сначала проходим авторизацию
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST","http://login.vk.com/?act=login")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*")
$oHTTP.SetRequestHeader("Accept-Language", "ru")
$oHTTP.SetRequestHeader("Referer","http://vkontakte.ru")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")
$oHTTP.SetRequestHeader("Host","login.vk.com")
$oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive")
$oHTTP.Send('email='&$sEmail&'&pass='&$sPass&'&expire=&vk=')
$oHTTP.WaitForResponse

$resp=$oHTTP.ResponseText
;ДОстаем куки
$cookie=StringRegExp($resp,'.*ue=.(.*). />',3)
$cookie='remixsid='&$cookie[4]
;~ ConsoleWrite($cookie&@LF)
;~ _ArrayDisplay($cookie)
EndFunc

Func get()
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", "http://vkontakte.ru/profile.php")
$oHTTP.SetRequestHeader("Cookie",$cookie)
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*")
$oHTTP.SetRequestHeader("Accept-Language", "ru")
$oHTTP.SetRequestHeader("Referer","http://login.vk.com/?act=login")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)")
$oHTTP.SetRequestHeader("Host","vkontakte.ru")
$oHTTP.SetRequestHeader("Proxy-Connection", "Keep-alive")
$oHTTP.Send("")
$oHTTP.WaitForResponse

$resp=$oHTTP.ResponseText
ConsoleWrite($resp&@LF)
EndFunc

login()
get()
 

evg64

Новичок
Сообщения
6
Репутация
0
Спасибо огромное! Работает! Есть вопросы по коду:
$oHTTP.SetRequestHeader("Host","login.vk.com")
- как вы узнали параметр "Host"?
$oHTTP.Send('email='&$sEmail&'&pass='&$sPass&'&expire=&vk=')
- как вы узнали, что нужно к логину/паролю еще добавить '&expire=&vk=' ?
Как определить, что в Login() надо писать
$oHTTP.SetRequestHeader("Referer","http://vkontakte.ru")
а в Get() -
$oHTTP.SetRequestHeader("Referer","http://login.vk.com/?act=login")
?
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Есть плагины к FireFox, IE(http://www.ieinspector.com/), которые показывают http запросы со всей этой информацией.

evg64 [?]
$oHTTP.Send('email='&$sEmail&'&pass='&$sPass&'&expire=&vk=')
- как вы узнали, что нужно к логину/паролю еще добавить '&expire=&vk=' ?
Работает и без этого параметра, просто как было в плагине так и добавил.
 

beve

Осваивающий
Сообщения
104
Репутация
31
Подскажите кто знает, я пытаюсь получить данные из некоторого сайта, примерно также, как описано выше. Одна из строчек запроса у меня такая: $oHTTP.Open("POST","https://название сайта.com/")
И очень странно то, что ответ, который получаю из сайта такой:
<html><head><meta http-equiv="refresh" content="0;url=http://название сайта.com/profile"/></head></html>
То есть нету кукисов в тексте, хотя когда я только начинал сии эксперименты, то первый раз в полученном ответе из сайта были эти самые кукисы, теперь же только такой текст, если отправить повторно второй запрос, взяв кукисы на эту сессию из мозилы - заходит в мой профиль на этом сайте. Короче, мне сайт не дает кукисы будто автоит ему передает уже ранее сохраненные где то кукисы, но это ж нонсенс. Подскажите, что делать в этой ситуации?


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

Все разобрался. Оказывается кукисы будут в $headers = $oHTTP.GetAllResponseHeaders(). Я пропустил это мимо внимания.
 

Taus

Новичок
Сообщения
1
Репутация
0
Не получается логиниться на форум (на vBulletin) через WinHttp.WinHttpRequest.
Заголовки беру на подобии Charles.
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST", "http://forum.v-galaktike.ru/login.php?do=login")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Host","forum.v-galaktike.ru")
$oHTTP.SetRequestHeader("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.6)")
$oHTTP.SetRequestHeader("Accept","text/html,application/xhtml+xml,application/xml")
$oHTTP.SetRequestHeader("Accept-Language","ru")
$oHTTP.SetRequestHeader("Keep-Alive","115")
$oHTTP.SetRequestHeader("Cookie","bblastvisit=1283711132; bblastactivity=0; __utma=133405465.1418468191.1283711150.1283711150.1283711150.1; __utmb=133405465.2.10.1283711150; __utmc=133405465; __utmz=133405465.1283711151.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("Content-Length","217")
$oHTTP.Send("vb_login_username=****&vb_login_password=&s=&securitytoken=guest&do=login&vb_login_md5password=****&vb_login_md5password_utf=****")
$oHTTP.WaitForResponse()
;Получаем куки
$resp = $oHttp.GetResponseHeader("Set-Cookie")
ConsoleWrite($resp & @CRLF)
$cookie = StringTrimRight($resp, 18)
ConsoleWrite($cookie & @CRLF)

В ResponseText - страничка переадресации.
Не могу словить securitytoken для дальнейшего серфинга.
Помогите разобраться :(
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Используя чтение загловков пытался авторизиоваться в контакте

Код:
Func login1()
; Сначала проходим авторизацию
; Сначала проходим авторизацию
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("POST","http://login.vk.com/?act=login")
$oHTTP.setTimeouts(5000, 5000, 15000, 15000)
$oHTTP.SetRequestHeader("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*")
$oHTTP.SetRequestHeader("Referer","http://vkontakte.ru/")
$oHTTP.SetRequestHeader("Accept-Language","ru")
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)")
$oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
$oHTTP.SetRequestHeader("Accept-Encoding"," gzip, deflate")
$oHTTP.SetRequestHeader("Host","login.vk.com")
;$oHTTP.SetRequestHeader("Content-Length","109")
$oHTTP.SetRequestHeader("Connection", "Keep-alive")
$oHTTP.SetRequestHeader("Cache-Control", "no-cache")
$oHTTP.Send('from_host=vkontakte.ru&captcha_key=&captcha_sid=&expire=&al_frame=1&email='&$email&'&pass='&$pass)

$oHTTP.WaitForResponse
$resp=$oHTTP.ResponseText
;ДОстаем куки
;$cookie=StringRegExp($resp,'.*ue=.(.*). />',3)
ConsoleWrite($resp&@LF)
; _ArrayDisplay($cookie)
EndFunc

Фиг. Выдает вот такую фигню
Код:
‹
 
Верх