Что нового

Авторизация на сайтах

oesoes

xor eax,eax
Сообщения
171
Репутация
9
madmasles сказал(а):
oesoes [?]
Эта функция возвращает дочерние объекты формы по имени, Вы путаете ее с _IEGetObjByName().

Тогда я нифика не пойму, простите зу тупость :stars: Читаю в справке:

"Returns an object reference to a Form by name" - Возвращает объектную ссылку на форму по имени. И следом пример:

Код:
Local $oIE = _IECreate("http://www.google.com")
Local $oForm = _IEFormGetObjByName($oIE, "gbqf")
Local $oQuery = _IEFormElementGetObjByName($oForm, "q")
_IEFormElementSetValue($oQuery, "AutoIt IE.au3")
_IEFormSubmit($oForm)


Сначала чувак получает контекст IE в $oIE, потом ссылку на форму одноименной функцией в переменную с именем $oForm (не даром бы он ее так назвал...). А про то, что Вы говорите идет следом - _IEFormElementGetObjByName (получает элемент управления формы)


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

В справке к _IEGetObjByName() вычитал в примере, что с формами работает идентично, что и _IEFormGetObjByName() - https://www.autoitscript.com/autoit3/docs/libfunctions/_IEGetObjByName.htm


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

madmasles [?]
Эта функция возвращает дочерние объекты формы по имени
как раз таки _IEFormElementGetObjByName()
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
oesoes,
Я был не прав, перепутал _IEFormElementGetObjByName() с _IEFormGetObjByName(), извините. :-[
 

fortages

Новичок
Сообщения
81
Репутация
3
oesoes сказал(а):
нужно получить форму с id = "login" функцией $oForm=_IEFormGetObjByName($oIE,'login')
заполнить ее и отправить функцией _IEFormSubmit($oForm).

Есть такая строчка в коде. Id формы, вроде бы, получила. Поля логин/пароль заполняются.
Но если сразу после строчек
Код:
_IEFormElementSetValue($oLogin, $sLogin)
_IEFormElementSetValue($oPass, $sPass)

дописать _IEFormSubmit($oForm), то происходит следующее:
открывается страница, заполняются поля, но после этого она обновляется и открывается уже с пустыми полями логин/пароль

_IEFormSubmit($oForm) пробовала, описала реакцию выше.
_IELinkClickByText($oIE, "Вход") - аналогично, куда-то нажимает и возвращает форму с незаполненными полями
_IENavigate($oIE, "http://site.org/ucp.php?mode=login") то же самое

Уже думаю, а не нажимает ли оно на верхнюю ссылку "Вход", которая расположена над формой? Тогда понятно, почему после выполнения идет пустая форма...

Если смотреть поиском, то
Код:
<a href="./ucp.php?mode=login">Вход</a>  &bull;  <a href="./ucp.php?mode=register">Регистрация</a></h3>
		<fieldset class="quick-login">
			<label for="username">Имя пользователя:</label> <input type="text" name="username" id="username" size="10" class="inputbox" title="Имя пользователя" />  
			<label for="password">Пароль:</label> <input type="password" name="password" id="password" size="10" class="inputbox" title="Пароль" />
			
				| <label for="autologin">Автоматически входить при каждом посещении <input type="checkbox" name="autologin" id="autologin" /></label>
			
			<input type="submit" name="login" value="Вход" class="button2" />
			<input type="hidden" name="redirect" value="./index.php?" />
Кнопка находится под чекбоксом "Входить автоматически", а значит информация про кнопку - две последние строчки, правильно?

Код:
<input type="submit" name="login" value="Вход" class="button2" />
<input type="hidden" name="redirect" value="./index.php?" />

Ведь надо, чтоб совпали type="submit" + name="login" + value="Вход"?
После добавления вот этого куска кода

Код:
$oInputs = _IETagNameGetCollection ($oForm, 'input')
For $oInput In $oInputs
    If $oInput.type = 'submit' And $oInput.value = 'Вход' Then
        _IEAction($oInput, 'click')
        _IELoadWait($oIE)
        ExitLoop
    EndIf
Next



Вход получился)))
Осталось выйти теперь)

Смотрю исходный код страницы

Код:
               <li class="icon-logout"><a href="./ucp.php?mode=logout&amp;sid=a2d1e2df64b523905351617319c6bc0e" title="Выход [ fortages ]" accesskey="x">Выход [ fortages ]</a></li>
Вот этот sid=a2d1e2df64b523905351617319c6bc0e для каждого пользователя будет меняться ведь.
Зато есть ссылка ./ucp.php?mode=logout, если сделать на нее _IENavigate($oIE, "http://site.org/ucp.php?mode=logout"), то получается ошибка

Информация
Вы не вышли из форума, так как запрос не соответствовал параметрам Вашей сессии. Если проблема повторится, свяжитесь с администратором форума.
Вернуться на главную страницу

Сейчас сижу думаю, как выйти...


Используйте для AutoIt кода тег [autoit]
autoit.gif

madmasles.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
fortages [?]
Сейчас сижу думаю, как выйти...
Я бы попробовал семулировать клик по этой ссылке, тогда и за sid не надо будет каждый раз следить.

Код:
_IELinkClickByText ($oIE, "Выход [")


так же там присутствует атрибут accesskey="x", это значит, что при нажатии на Alt+x на клавиатуре будет происходить выход. Попробуйте. :scratch:
 

fortages

Новичок
Сообщения
81
Репутация
3
Все решилось добавлением такого куска
Код:
$sMyString = "Выход"
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
    $sLinkText = _IEPropertyGet($oLink, "innerText")
    If StringInStr($sLinkText, $sMyString) Then
        _IEAction($oLink, "click")
        ExitLoop
    EndIf
Next

:IL_AutoIt_1:
А вот accesskey не хотят в упор работать, уже со всех браузеров пыталась.

Все работает, все отлично, спасибо:smile:

А если можно, подскажите, можно ли как-то выбирать значение $sLogin и $sPass из файла?
Просто сейчас получается так, что у меня

кусок кода
;
;
;
кусок кода
;
;
;

И прямо в коде указаны разные логины/пароли. Неудобно. Открывает для каждого нового логина окно. :stars:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
fortages [?]
выбирать значение $sLogin и $sPass из файла?
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 

fortages

Новичок
Сообщения
81
Репутация
3
Всем огромнейшее спасибо за помощь и ответы! Очень сильно помогли :dance2: :dance1: :IL_AutoIt_1:

Вдруг кому понадобится, конечная версия кода была такая:

Код:
#include <IE.au3>

$sLogin = 'myname'
$sPass = 'mypass'
$sUrl = 'http://mysite.org/ucp.php?mode=login'

$oIE = _IECreate($sUrl)
$oForm   = _IEFormGetObjByName($oIE,"login") 
$oLogin = _IEGetObjById($oIE, 'username')
$oPass = _IEGetObjByName($oIE, 'password')
$oButton = _IEGetObjById($oIE, 'login')

_IEFormElementSetValue($oLogin, $sLogin)
_IEFormElementSetValue($oPass, $sPass)


$oInputs = _IETagNameGetCollection ($oForm, 'input')
For $oInput In $oInputs
    If $oInput.type = 'submit' And $oInput.value = 'Вход' Then
        _IEAction($oInput, 'click')
        _IELoadWait($oIE)
        ExitLoop
    EndIf
Next


$sMyString = "Выход"
$oLinks = _IELinkGetCollection($oIE)
For $oLink In $oLinks
    $sLinkText = _IEPropertyGet($oLink, "innerText")
    If StringInStr($sLinkText, $sMyString) Then
        _IEAction($oLink, "click")
        ExitLoop
    EndIf
Next
;
;


Форум на phpbb. :beer:
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
IMHO, если бы Вы с самого начала сказали бы адрес форума, то получили бы ответ (нужную информацию) гораздо раньше.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
oesoes [?]
IMHO, если бы Вы с самого начала сказали бы адрес форума, то получили бы ответ нужную информацию гораздо раньше.
Это точно.
И еще, тем, кто делает что то похожее, не используйте этот код.
 

fortages

Новичок
Сообщения
81
Репутация
3
Ребята, я понимаю, что вопрос очень глупый... Но справиться не могу. Помогите, пожалуйста, если можно. :'(
Признаю свою ошибку, адрес форума надо было указать сразу: http://chloe.unoforum.ru
Логин fortages
Пароль qwerty
Там все
Код:
type="text/javascript"
и как нажать на кнопку (ссылку?) "Вход-Регистрация" не знаю. При наведении на нее мышкой показывает
706fd7b8209e.png
и как быть в таком случае - не нашла информацию... Подскажите,пожалуйста. :'(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
fortages
Код:
#include<IE.au3>
$oIE = _IECreate('http://chloe.unoforum.ru/')
_IELinkClickByText($oIE, 'Вход-регистрация')
 

fortages

Новичок
Сообщения
81
Репутация
3
Garrett огромное спасибо! Как просто все оказалось... А я в исходном коде страницы поиском искала "вход". Позорище)

А как заполнить поля логин/пароль?

Тот же поиск по исходному коду по слову "form" выдает что-то невнятное.
Начала искать в гугле... Это не тот случай, когда у формы нет имени?
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
У формы может и не быть имени, но может быть ID. Если нет ID, то индекс есть всегда.
 

fortages

Новичок
Сообщения
81
Репутация
3
oesoes сказал(а):
индекс есть всегда.

Нашла в гугле функцию _IETagNameAllGetCollection, которая элемент возвращает по индексу.
После выполнения вот этого кода:
Код:
$oElements = _IETagNameAllGetCollection($oIE)
For $oElement In $oElements
    If $oElement.id Then MsgBox($MB_SYSTEMMODAL, "Element Info", "Tagname: " & $oElement.tagname & @CRLF & "id: " & $oElement.id & @CRLF & "innerText: " & $oElement.innerText)
Next


появляется такое сообщение:
3e13f1328832.jpg


Это ведь как раз то, что нужно, правильно?
Ведь если так посмотреть на странице
42312a37b106.jpg

поля логин/пароль они в "таблице" (рамочке?), а это tagname: table.
id: tabhid - это же то слово, которое в углу экрана было при наведении мышкой на "вход-регистрация".

А дальше я не понимаю... Есть _IETagnameGetCollection и есть _IETableGetCollection , но вот как это все собрать в кучу...
По ID эта форма (таблица?) с логином/паролем тоже не находится.
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Код:
#include <IE.au3>

$oIE = _IECreate('http://chloe.unoforum.ru/')
_IELoadWait($oIE)
_IELinkClickByText($oIE, 'Вход-регистрация')

$Form = _IEFormGetCollection($oIE,1) ; 1 - индекс формы

if IsObj($Form) Then
  $fNick = _IEFormElementGetObjByName($Form,'nick')
  $fPass = _IEFormElementGetObjByName($Form,'pass')

  _IEFormElementSetValue($fNick,'fortages')
  _IEFormElementSetValue($fPass,'qwerty')
  
  ;_IEFormElementCheckBoxSelect($Form,'','newreg',1,'byIndex') ; отметим первый флажок если нужно
  ;_IEFormElementCheckBoxSelect($Form,'','zabilpass',1,'byIndex') ; или второй (раскомментить если нужно)

  _IEFormSubmit($Form)
EndIf


Ищи формы не через просмотр кода страницы, а через просмотр кода элемента. Так и правильнее и быстрее. Могут стоять скрипты, которые тебе всю страницу просто не отдадут.
 

fortages

Новичок
Сообщения
81
Репутация
3
oesoes , спасибо огромное!!! Вот это да))
Все работает)) Видимо, вникать мне в функции *GetObjByName и вникать еще...
oesoes сказал(а):
Ищи формы не через просмотр кода страницы, а через просмотр кода элемента
Спасибо, учту на будущее. :smile:

Кнопка "ОК" по GetObjByName не получается. Думаю мышкой нажимать. Уже и координаты вычислила функцией
Код:
$MousePos = MouseGetPos()
$MousePos[0] ; Mouse X position
$MousePos[1] ; Mouse Y position 
msgbox(0,"Debug","Cursor located at " & $MousePos[0] & "," & $MousePos[1])


OffTopic:
А само окошко IE можно сделать, чтоб открывалось полностью на весь экран, а не "свернутое"?


Кстати, выходить тоже отлично получается
Код:
_IELinkClickByText($oIE, 'Выход')


Огромнейшее спасибо. :IL_AutoIt_1: Это так круто, теперь не придется вручную все делать. Ура-а-а!! я вам так благодарна, народ!! Спасибо огромное
687.gif
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Кнопка OK тебе тут и не нужна, все отлично работает с IEFormSubmit($Form)


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

fortages [?]
А само окошко IE можно сделать, чтоб открывалось полностью на весь экран, а не "свернутое"?

Да, посмотри на новый код. 4 и 5 строка.

Код:
#include <IE.au3>

$oIE = _IECreate('http://chloe.unoforum.ru/')
$hwnd = WinWaitActive('Форум - Internet Explorer')
WinSetState($hwnd,'',@SW_MAXIMIZE)
_IELoadWait($oIE)
_IELinkClickByText($oIE, 'Вход-регистрация')

$Form = _IEFormGetCollection($oIE,1) ; 1 - индекс формы

if IsObj($Form) Then
  $fNick = _IEFormElementGetObjByName($Form,'nick')
  $fPass = _IEFormElementGetObjByName($Form,'pass')

  _IEFormElementSetValue($fNick,'fortages')
  _IEFormElementSetValue($fPass,'qwerty')

  ;_IEFormElementCheckBoxSelect($Form,'','newreg',1,'byIndex') ; отметим первый флажок если нужно
  ;_IEFormElementCheckBoxSelect($Form,'','zabilpass',1,'byIndex') ; или второй (раскомментить если нужно)

  _IEFormSubmit($Form)
EndIf
 

fortages

Новичок
Сообщения
81
Репутация
3
pray.gif
oesoes
2748d41cdd1b9dae2dfe95acb6e73d3a.gif
огромное человеческое спасибо! Благодарю)) Как же все на самом деле выходит просто и красиво... Спасибо еще раз, oesoes и всем отозвавшимся в теме :IL_AutoIt_1: Ребята, вы меня просто спасли!
687.gif
Спасибо за ваш форум и за отзывчивость :beer:
 
A

at

Гость
Час Добрый Всем!
Не получается ввести пароль в форму входа в личный кабинет на сайте Yota. Прошу подсказать, что не верно в скрипте.
Код:
#include <IE.au3>

$sLogin = 'Логин'
$sPass = 'Пароль'
$sUrl = 'https://my.yota.ru/selfcare/login'

$oIE = _IECreate($sUrl)
Sleep (3000)
If @error Then Exit 13
For $i = 1 To 1
    $oForm = _IEGetObjById($oIE, 'customerLoginForm')
    If @error Then MsgBox(0,'','Форма не найдена')
    $oEmail = _IEFormElementGetObjByName($oForm, 'IDToken1')
    If @error Then MsgBox(0,'','ID не найден')
    $oPass = _IEFormElementGetObjByName($oForm, 'IDToken2')
    If @error Then MsgBox(0,'','Password не найден')
    _IEFormElementSetValue($oEmail, $sLogin)
    If @error Then MsgBox(0,'','Ошибка ввода Логина')
    _IEFormElementSetValue($oPass, $sPass)
    If @error Then MsgBox(0,'','Ошибка ввода Пароля')
    _IEFormSubmit($oForm)
    If @error Then MsgBox(0,'','Ошибка отправки данных')
Next
If @error Then
    _IEQuit($oIE)
    Exit 13
Else
    MsgBox(64, 'Info', 'OK')
EndIf
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
at [?]
Не получается ввести пароль в форму
Код:
#include <IE.au3>

$sLogin = 'Логин'
$sPass = 'Пароль'
$sUrl = 'https://my.yota.ru/selfcare/login'

$oIE = _IECreate($sUrl)
$oForm = _IEGetObjById($oIE, 'customerLoginForm')
$oUserName = _IEFormElementGetObjByName($oForm, 'IDToken1')
$oUserPass = _IEFormElementGetObjByName($oForm, 'IDToken2')
$oUserPass = $oUserPass.nextSibling.nextSibling
$oL1 = _IETagNameGetCollection($oIE, 'label', 0)
$oL2 = _IETagNameGetCollection($oIE, 'label', 1)
$oL1.style.visibility = 'hidden'
$oL2.style.visibility = 'hidden'
_IEFormElementSetValue($oUserName, $sLogin)
_IEFormElementSetValue($oUserPass, $sPass)
 
Верх