Что нового

https запрос

nicotino

Новичок
Сообщения
30
Репутация
0
Версия AutoIt: 3.3.10

Описание:
Составить https запрос на регистрацию почты yandex

Примечания:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
У яндекса кстати капча есть.


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

А так: там получится POST запрос со всей формой.
Кстати через чего хотите: IE или WinHttp?
Скажу сразу что через IE будет легче с Cookies, Sessions, Validation, etc. :smile:
А в WinHttp придётся обо всём позаботится самому... :smile:
Да, кстати опишите подробнее что требуется сделать?
 
Автор
N

nicotino

Новичок
Сообщения
30
Репутация
0
Да про капчу я знаю... мне хотя бы сначала отправить правильно запрос на страницу регистрации дальше наверно разберусь.

отправить запрос через ObjCreate("WinHttp.WinHttpRequest.5.1")
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
1. Код формы регистрации (с переносами строк) более менее удобная для чтения.
Код:
<form method="post" class="form" action="">
<input type="hidden" value="b1866b7f3864a303cdad6b2872aa0d6b10" name="track_id" id="track_id">
<input type="hidden" value="ru" name="language" id="language">
<div data-block="control_firstname" class="control control_name_firstname">
<div class="control__label control__label_name_firstname">
<label for="firstname">Имя</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="firstname" id="firstname" value="" class="control__input control__input_name_firstname">
</div>
<div class="control__error control__error__firstname_missingvalue g-hidden">Пожалуйста, укажите имя</div>
<div class="control__error control__error__firstname_toolong g-hidden">Пожалуйста, укажите более короткий вариант имени, до 50 символов</div>
</div>
<div data-block="control_lastname" class="control control_name_lastname">
<div class="control__label control__label_name_lastname">
<label for="lastname">Фамилия</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="lastname" id="lastname" value="" class="control__input control__input_name_lastname">
</div>
<div class="control__error control__error__lastname_missingvalue g-hidden">Пожалуйста, укажите фамилию</div>
<div class="control__error control__error__lastname_toolong g-hidden">Пожалуйста, укажите более короткий вариант фамилии, до 50 символов</div>
</div>
<div data-block="control_login" class="control control_name_login">
<div class="control__label control__label_name_login">
<label for="login">Придумайте логин</label>
</div>
<div class="control__msg">
<div class="login__loading g-hidden">проверка …</div>
<div class="login__ok control__valid g-hidden">логин свободен</div>
<div class="login_alias_promo_startswithdigit js-alias-promo-startswithdigit g-hidden">Логин, соответствующий номеру телефона, можно <a data-base-url="/registration/mail/digit?origin=loginstartswithdigit&amp;track_id=" href="/registration/mail/digit?origin=loginstartswithdigit&amp;track_id=" class="login_alias_promo_startswithdigit_link js-alias_startswithdigit_link js-alias-link">завести здесь</a>
</div>
<div class="login__requirements js-requirements g-hidden">Логин может состоять из латинских символов, цифр, одинарного дефиса или точки. Он должен начинаться с буквы, заканчиваться буквой или цифрой и содержать не более 30 символов.</div>
<div class="login__requirements js-requirements-short g-hidden">Логин может состоять из латинских символов, начинаться с буквы и заканчиваться буквой или цифрой.</div>
<div class="login_alias_promo_notavailable js-alias-promo-notavailable g-hidden">Рекомендуем вам <a data-base-url="/registration/mail/digit?origin=loginnotavailable&amp;track_id=" href="/registration/mail/digit?origin=loginnotavailable&amp;track_id=" class="login_alias_promo_notavailable_link js-alias_notavailable_link js-alias-link">завести логин</a> как номер вашего мобильного телефона. Например, [email protected]. Это очень удобно.</div>
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="login" id="login" value="" class="control__input control__input_name_login">
</div>
<ol class="login__suggest g-hidden">
</ol>
<div class="digitLoginSuggestion g-hidden">
<div class="digitLoginSuggestion-content text">
<p class="digitLoginSuggestion_message">В качестве логина можно <a data-base-url="/registration/mail/digit?origin=bubblelink&amp;track_id=" href="/registration/mail/digit?origin=bubblelink&amp;track_id=" class="login_alias_promo_bubble_link js-alias_bubble_link js-alias-link">использовать</a> номер вашего телефона, например [email protected]</p>
<a data-base-url="/registration/mail/digit?origin=mail2digit&amp;track_id=" href="/registration/mail/digit?origin=mail2digit&amp;track_id=" class="digitLoginSuggestion_button js-alias_bubble_button js-alias-link">
<span class="button-content">Перейти</span>
</a>
</div>
</div>
<div class="control__error control__error__login_missingvalue g-hidden">Необходимо выбрать логин</div>
<div class="control__error control__error__login_notavailable g-hidden">К сожалению, логин занят</div>
<div class="control__error control__error__login_prohibitedsymbols g-hidden">Недопустимый логин</div>
<div class="control__error control__error__login_startswithdigit g-hidden">Логин не должен начинаться с цифры</div>
<div class="control__error control__error__login_toolong g-hidden">Логин слишком длинный</div>
<div class="control__error control__error__login_startswithdot g-hidden">Логин не должен начинаться с точки</div>
<div class="control__error control__error__login_startswithhyphen g-hidden">Логин не должен начинаться с дефиса</div>
<div class="control__error control__error__login_endswithhyphen g-hidden">Логин не должен заканчиваться дефисом</div>
<div class="control__error control__error__login_doubleddot g-hidden">Логин не должен содержать две точки подряд</div>
<div class="control__error control__error__login_doubledhyphen g-hidden">Логин не должен содержать два дефиса подряд</div>
<div class="control__error control__error__login_dothyphen g-hidden">Логин не должен содержать точку и дефис подряд</div>
<div class="control__error control__error__login_hyphendot g-hidden">Логин не должен содержать дефис и точку подряд</div>
<div class="control__error control__error__login_endswithdot g-hidden">Логин не должен заканчиваться точкой</div>
</div>
<div data-block="control_password" class="control control_name_password">
<div class="control__label control__label_name_password">
<label for="password">Придумайте пароль</label>
</div>
<div class="control__msg">
<div class="toggleVisibility" id="wannasee_ctrl">
<span class="b-link b-link_pseudo_yes b-link_form b-nobr">
<span class="b-link__inner">Показать текст пароля</span>
</span>
</div>
<div class="toggleVisibility g-hidden" id="nosee_ctrl">
<span class="b-link b-link_pseudo_yes b-link_form b-nobr">
<span class="b-link__inner">Скрыть текст пароля</span>
</span>
</div>
</div>
<div class="control__cntrl">
<input type="password" autocomplete="off" name="password" id="password" value="" class="control__input control__input_name_password">
</div>
<div class="password-indicator">
<div class="password-indicator__i" style="background: none repeat scroll 0% 0% red;"> </div>
</div>
<div class="password-ok control__valid g-hidden">Надежный<span class="password-legend">
</span>
</div>
<div class="control__error control__error__password_missingvalue g-hidden">Необходимо выбрать пароль</div>
<div class="control__error control__error__password_likelogin g-hidden">Пароль не может совпадать с логином</div>
<div class="control__error control__error__password_tooshort g-hidden">Пароль слишком короткий<span class="password-legend">
</span>
</div>
<div class="control__error control__error__password_weak g-hidden" style="color: rgb(187, 0, 0);">Пароль слишком простой<span class="password-legend">
</span>
</div>
<div class="control__error control__error__password_prohibitedsymbols g-hidden">Пароль содержит запрещенные символы</div>
<div class="control__error control__error__password_likephonenumber g-hidden">Пароль не может совпадать с телефоном</div>
<div class="control__error control__error__password_toolong g-hidden">Пароль слишком длинный<span class="password-legend">
</span>
</div>
</div>
<div data-block="control_password-confirm" class="control control_name_password-confirm">
<div class="control__label control__label_name_password-confirm">
<label for="password_confirm">Повторите, чтобы не ошибиться</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="password" autocomplete="off" name="password_confirm" id="password_confirm" value="" class="control__input control__input_name_password-confirm">
</div>
<div class="password-confirm__valid control__valid g-hidden">введено верно</div>
<div class="control__error control__error__password-confirm_missingvalue g-hidden">Необходимо ввести пароль еще раз</div>
<div class="control__error control__error__password-confirm_notequal g-hidden">Подтверждение не совпадает с паролем</div>
</div>
<div data-block="control_question" class="control control_name_question">
<div class="control__label control__label_name_question">
<label for="hint_question_id">Контрольный вопрос</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<select name="hint_question_id" id="hint_question_id" class="control__input control__input_name_question">
<option value="0">не выбран</option>
<option value="1">Девичья фамилия матери</option>
<option value="2">Любимое блюдо</option>
<option value="3">Почтовый индекс родителей</option>
<option value="4">Дата рождения бабушки</option>
<option value="5">Ваше прозвище в школе</option>
<option value="6">Номер паспорта</option>
<option value="7">Пять последних цифр кред. карты</option>
<option value="8">Пять последних цифр ИНН</option>
<option value="9">Ваш любимый номер телефона</option>
<option value="99">Задайте собственный вопрос</option>
</select>
</div>
<div class="control__error control__error__question_missingvalue g-hidden">Пожалуйста, выберите контрольный вопрос</div>
</div>
<div data-block="control_user-question" class="control control_name_user-question g-hidden">
<div class="control__label control__label_name_user-question">
<label for="hint_question">Придумайте свой вопрос</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="hint_question" id="hint_question" value="" class="control__input control__input_name_user-question">
</div>
<div class="control__error control__error__user-question_missingvalue g-hidden">Пожалуйста, укажите свой вопрос</div>
<div class="control__error control__error__user-question_toolong g-hidden">Контрольный вопрос слишком длинный</div>
</div>
<div data-block="control_answer" class="control control_name_answer">
<div class="control__label control__label_name_answer">
<label for="hint_answer">Ответ на контрольный вопрос</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="hint_answer" id="hint_answer" value="" class="control__input control__input_name_answer">
</div>
<div class="control__error control__error__answer_missingvalue g-hidden">Необходимо указать ответ на контрольный вопрос</div>
<div class="control__error control__error__answer_toolong g-hidden">Ответ на контрольный вопрос слишком длинный</div>
</div>
<div data-block="control_phone" class="control control_name_phone">
<div class="control__label control__label_name_phone">
<label for="phone_number">Мобильный телефон</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
<input type="text" autocomplete="off" name="phone_number" id="phone_number" value="" class="control__input control__input_name_phone">
</div>
<div class="phone-comment">например, +7 921 323 12 55</div>
<div class="control__error control__error__phone_badphonenumber g-hidden">Некорректный номер телефона</div>
<div class="control__error control__error__phone_missingvalue g-hidden">Пожалуйста, укажите номер телефона</div>
</div>
<div data-block="control_captcha" class="control control_name_captcha text">
<div class="control__label control__label_name_captcha">
<label for="answer">Введите символы:</label>
</div>
<div class="control__msg">
</div>
<div class="control__cntrl">
</div>
<script src="/st//js/soundmanager/soundmanager2-nodebug-jsmin.js">
</script>
<div class="audio_system_failed g-hidden">Не получилось запустить аудио, попробуйте обновить браузер</div>
<div class="captcha__auto-width-container">
<div class="captcha__recognize">
<div class="captcha__captcha">
<img src="https://i.captcha.yandex.net/image?key=10Y0lVllyEfy0S14mwjsPzWLKWYorNJi" class="captcha__captcha__text">
<button class="button captcha__captcha__audio play" type="button">
<span class="button-content play">
</span>
<span class="button-content playing">
</span>
<span class="button-content loading">
</span>
</button>
</div>
<div class="captcha__arrow">
</div>
<div class="captcha__input-wrap">
<input type="text" autocomplete="off" name="answer" id="answer" class="control__input control__input_name_captcha">
</div>
</div>
<div class="captcha__switch">
<a class="pseudo_link another" href="#">Другой код</a>
<a class="pseudo_link switch_to_audio" href="#">Послушать код</a>
<a class="pseudo_link switch_to_text" href="#">Текстовый код</a>
</div>
</div>
<input type="hidden" value="10Y0lVllyEfy0S14mwjsPzWLKWYorNJi" name="key" class="captcha_key">
<input type="hidden" value="text" name="captcha_mode" class="captcha_mode">
<div class="control__error control__error__captcha_missingvalue g-hidden">Необходимо ввести символы</div>
<div class="control__error control__error__captcha_captchalocate g-hidden">Ошибка проверки контрольных символов. Попробуйте еще раз.</div>
<div class="control__error control__error__captcha_incorrect g-hidden">Вы неверно ввели символы. Попробуйте еще раз</div>
</div>
<div data-block="control_eula" class="control control_name_eula">
<input type="checkbox" checked="" id="eula_accepted" name="eula_accepted">
<div class="control__label control__label_name_eula">
<label for="eula_accepted">Нажимая кнопку «Зарегистрироваться», я принимаю условия <a target="_blank" href="//legal.yandex.ru/rules/" class="b-link b-link_form b-link_pseudo_yes trigger">
<span class="b-link__inner">Пользовательского соглашения</span>
</a> <div class="b-eula content">
<div class="l-indent-small">
<iframe src="//legal.yandex.ru/rules/?mode=text&amp;lang=ru"> </iframe>
</div>
</div> и даю своё согласие Яндексу на обработку моих персональных данных, в соответствии с Федеральным законом от 27.07.2006 года №152-ФЗ «О персональных данных», на условиях и для целей, определенных <a href="//legal.yandex.ru/confidential/" target="_blank" class="b-link b-link_form b-link_pseudo_yes trigger2">
<span class="b-link__inner">Политикой конфиденциальности</span>
</a>.<div class="b-eula content2">
<div class="l-indent-small">
<iframe src="//legal.yandex.ru/confidential/?mode=text&amp;lang=ru"> </iframe>
</div>
</div>
</label>
</div>
<div class="control__error control__error__eula_missingvalue g-hidden">Для продолжения вы должны принять условия Пользовательского соглашения</div>
</div>
<div data-block="control_submit" class="control control_name_submit">
<button type="submit" class="control_name_submit__button">
<span class="button-content">Зарегистрироваться</span>
</button>
</div>
</form>

2. Вторая версия скрипта. Исправлены ошибки и улучшен код
Код:
#cs ----------------------------------------------------------------------------
	
	yandex.mail.reg 2.0
	AutoIt Version: 3.3.10.2
	Author:         alex33
#ce ----------------------------------------------------------------------------

#include <IE.au3>
Global $oReq, $oHTML, $oSC, $sUrl, $sUrlImg, $sUserAgent, $sSendStr
Global $SetCookie = "", $Cookie = ""
$oReq = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oHTML = ObjCreate("HTMLFILE")
$oSC = ObjCreate("ScriptControl")
If Not IsObj($oReq) Or Not IsObj($oHTML) And Not IsObj($oSC) Then
	MsgBox(16, 'Error', 'Create object error')
	Exit 1
EndIf
$oSC.Language = "JavaScript"

$a1 = MsgBox(65, "HttpRequest", "example 1 yandex mail reg")
If $a1 <> 1 Then
	Exit
EndIf

$sUrl = 'https://passport.yandex.ru/registration/mail?from=mail&require_hint=1&origin=hostroot_yellbox_texttags&retpath=https%3A%2F%2Fpassport.yandex.ru%2Fpassport%3Fmode%3Dsubscribe%26from%3Dmail%26retpath%3Dhttps%253A%252F%252Fmail.yandex.ru'
$sUserAgent = 'Mozilla/5.0 (Windows NT 6.1; rv:27.0) Gecko/20100101 Firefox/27.0'
HttpSetUserAgent($sUserAgent)

; цикл (для сокращения кода)
; Я сначала хотел сделать функцию, но потом передумал и сделал цикл, посчитав что это в данном конкретном случае будет удобнее...
$sSendStr = ''
For $iRequestCount = 1 To 2
	$oError = ObjEvent('AutoIt.Error', 'ErrorFunc')
	Switch $iRequestCount
		Case 1
			$oReq.Open('GET', $sUrl, False)
		Case 2
			$oReq.Open('POST', $sUrl, False)
			$oReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
	EndSwitch
	$oReq.SetRequestHeader('User-Agent', $sUserAgent)
	$oReq.SetRequestHeader('Cache-Controle', 'no-cach')
	If $Cookie <> "" Then $oReq.SetRequestHeader('Cookie', $Cookie)
	$oReq.SetRequestHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
	$oReq.SetRequestHeader('Accept-Language', 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3')
	;$oReq.SetRequestHeader('Accept-Encoding', 'gzip, deflate')
	$oReq.SetRequestHeader('Connection', 'keep-alive')
	$oReq.Send($sSendStr)
	$Status = $oReq.Status
	$StatusText = $oReq.StatusText
	$GetAllResponseHeaders = $oReq.GetAllResponseHeaders()
	If StringInStr($GetAllResponseHeaders, "Set-Cookie:") Then
		$SetCookie = $oReq.GetResponseHeader("Set-Cookie")
		$Cookie = _SetCookieParseV2($GetAllResponseHeaders)
	EndIf
	$ResponseText = $oReq.ResponseText
	MsgBox(0, 'Status end StatusText', 'Status: ' & $Status & @CRLF & 'StatusText: ' & $StatusText)
	MsgBox(0, "GetAllResponseHeaders", $GetAllResponseHeaders)
	If $SetCookie <> "" Then MsgBox(0, "Set-Cookie", $SetCookie)
	If $Cookie <> "" Then MsgBox(0, "Cookie", $Cookie)
	;MsgBox(0, "ResponseText", $ResponseText)
	$oError = 0
	If $iRequestCount = 1 Then
		$oHTML.Write($ResponseText)
		$oForm = $oHTML.forms.item(0)
		$oElems = _IETagNameAllGetCollection($oForm)
		$oImg = $oHTML.images.item(1)
		$sUrlImg = $oImg.src
		ConsoleWrite('Image URL: ' & $sUrlImg & @CRLF)
		For $oElem In $oElems
			$nodeName = $oElem.nodeName
			If Not StringRegExp($nodeName, '(INPUT|TEXTAREA|SELECT)') Then ContinueLoop
			$nodeType = $oElem.nodeType
			$type = $oElem.type
			$name = $oElem.name
			Switch $name
				Case 'firstname'
					_IEFormElementSetValue($oElem, "Имя")
				Case 'lastname'
					_IEFormElementSetValue($oElem, "Фамилия")
				Case 'login'
					_IEFormElementSetValue($oElem, "TVOYA_pochta")
				Case 'password'
					_IEFormElementSetValue($oElem, "TVOY_PAROL1234567890")
				Case 'password_confirm'
					_IEFormElementSetValue($oElem, "TVOY_PAROL1234567890")
				Case 'hint_question_id'
					#cs
						0 = не выбран
						1 = Девичья фамилия матери
						2 = Любимое блюдо
						3 = Почтовый индекс родителей
						4 = Дата рождения бабушки
						5 = Ваше прозвище в школе
						6 = Номер паспорта
						7 = Пять последних цифр кред. карты
						8 = Пять последних цифр ИНН
						9 = Ваш любимый номер телефона
						99 = Задайте собственный вопрос
					#ce
					_IEFormElementSetValue($oElem, "5")
				Case 'hint_question'
					; ID 99 only
					; 99 = Задайте собственный вопрос
					_IEFormElementSetValue($oElem, "")
				Case 'hint_answer'
					_IEFormElementSetValue($oElem, "Программист-комповщик")
				Case 'phone_number'
					_IEFormElementSetValue($oElem, "+79004121366")
				Case 'answer'
					; Введите символы
					_IEFormElementSetValue($oElem, "ответ код на картинке")
			EndSwitch
			$value = _IEFormElementGetValue($oElem)
			;ConsoleWrite(StringFormat("----\r\n nodeName: %s\r\n nodeType: %s\r\n type: %s\r\n name: %s\r\n value: %s\r\n----\r\n", $nodeName, $nodeType, $type, $name, $value))
			$sSendStr &= '&' & $name & '=' & encodeURIComponent($value)
		Next
		$sSendStr = StringReplace($sSendStr, '&', '', 1)
		ConsoleWrite($sSendStr & @CRLF)
		$oForm.action = $sUrl
	EndIf
Next

Func ErrorFunc()
	MsgBox(16, 'COM Error', $oError.description)
	Exit 2
EndFunc   ;==>ErrorFunc
Func encodeURIComponent($sTxt)
	Return $oSC.Eval('encodeURIComponent("' & $sTxt & '");')
EndFunc   ;==>encodeURIComponent
Func decodeURIComponent($sTxt)
	Return $oSC.Eval('decodeURIComponent("' & $sTxt & '");')
EndFunc   ;==>decodeURIComponent
Func _SetCookieParseV2($AllResponseHeaders)
	; function copy rus forum
	$sCOOKIES = ""
	$aResponseHeaders = StringSplit($AllResponseHeaders, @CRLF)
	For $i = 1 To $aResponseHeaders[0]
		If StringLeft($aResponseHeaders[$i], 10) = 'Set-Cookie' Then
			$iPozSim = StringInStr($aResponseHeaders[$i], ';')
			$sCOOKIES &= StringMid($aResponseHeaders[$i], 13, $iPozSim - 13) & '; '
		EndIf
	Next
	$sCOOKIES = StringMid($sCOOKIES, 1, StringLen($sCOOKIES) - 2)
	Return $sCOOKIES
EndFunc   ;==>_SetCookieParseV2
Потом функциями GetValue / SetValue из IE.au3 читаем / заполняем форму...

Смотрите, проверяйте, тестируйте...

P.S. Надеюсь каждую строку в скрипте комментировать не потребуется? :D :smile:
 
Верх