Что нового

Залогиниться на сайт, форма которого на JavaScript

Velmor

Новичок
Сообщения
27
Репутация
0
Доброго времени суток.
Ув. пользователи, подскажите, пожалуйста, как залогиниться на сайт и перейти на нужнуу вкладку, если там почти все реализовано на JS. Я новичок, по этому огромная просьба, пожалуйста, объясните как делать.
Код странички с формой логина выглядит так, хотя в браузере отрабатывает JS и форма есть (тыками мышей и клавиатурой можно зайти)
Код странички
Код:
<!doctype html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
	<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
       <link type="text/css" rel="stylesheet" href="tme.css">
	<link rel="icon" href="images/favicon.ico">
        <title>Program Tool</title>
    
    <script type="text/javascript" language="javascript" src="tme/tme.nocache.js"></script>
  </head>
  <body>
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
    <noscript>
      <div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
        Your web browser must have JavaScript enabled
        in order for this application to display correctly.
      </div>
    </noscript>

  <div id= "loginContainer"> </div> 
    
  </body>
</html>
Находил такой вариант для gmail, но не получилось, возращает пустой результат...
Код:
#include <IE.au3>

$login = InputBox("Enter User Name", "Enter user name:", "", "", "200", "130")
$pass = InputBox("Enter Password", "Enter password:", "", "", "200", "130")


$oIE = ObjCreate("InternetExplorer.Application.1")
With $oIE
	.Visible = 1
	.Height = 768
	.Width = 1024
	.Navigate("https://accounts.google.com/ServiceLogin?sacu=1&scc=1&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&hl=ru&service=mail")
EndWith
_IELoadWait ($oIE)

$oForm = _IEGetObjById($oIE, "gaia_loginform")
$iLogin = _IEFormElementGetObjByName($oForm, "Email")
_IEFormElementSetValue($iLogin, $login)
$iPass = _IEFormElementGetObjByName($oForm, "Passwd")
_IEFormElementSetValue($iPass, $pass)
$oTik_galochka = _IEGetObjByName($oIE, "PersistentCookie")
_IEAction($oTik_galochka, "click") 
_IEFormSubmit($oForm)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
#cs ===========================================================================
						   Вход на Google аккаунт.
#ce ===========================================================================

#include <IE.au3>
$sEmail = '[email protected]'
$sPassw = '12345678'
$iPersistentCookie = 0

$oIE = _IECreate('https://accounts.google.com/ServiceLoginAuth')
$oForm = _IEFormGetObjByName($oIE, 'gaia_loginform')
$oEmail = _IEFormElementGetObjByName($oForm, 'Email')
$oPassw = _IEFormElementGetObjByName($oForm, 'Passwd')
$oSignIn = _IEFormElementGetObjByName($oForm, 'signIn')
$oPersistentCookie = _IEFormElementGetObjByName($oForm, 'PersistentCookie')
_IEFormElementSetValue($oEmail, $sEmail)
_IEFormElementSetValue($oPassw, $sPassw)

If Not $iPersistentCookie Then _
_IEFormElementCheckBoxSelect($oForm, "yes", "PersistentCookie", 0)
_IEFormSubmit($oForm)
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Добрый день.
Спасибо за ответ.
Прошу прощения, я, видимо, не корректно написал. Мне нужно не на gmail зайти, а на сайт, внутри моей сети (по этому не могу привести вам URL). А код странички я привел именно того сайта, на который нужно зайти. Данный способ для входа на gmail мне не помог.
Как я понял, дело в том, что весь код отрабатывает посредством JavaScript и IE не может получить исходный код странички на HTML.
С данным вопросом и обращаюсь к вам - как же заполнить форму на JS или может нужен какой-то способ для того, чтобы из JS получить HTML и дальше с ним работать как обычно. К сожалению, я не знаю как сделать ни то, ни другое, а может вообще нужен совсем доругой подход.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Velmor,
Вы можете получить реальный HTML код функцией
Код:
_IEBodyReadHTML()
А в нем найти нужные элементы.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Спасибо за предложенный вариант. Вот только не пойму что дальше делать, как заполнить форму и отправить?
Так не получилось:
Код:
Global $pass, $login
$login = "asd"
$pass = "123"


$oIE = ObjCreate("InternetExplorer.Application.1")
With $oIE
	.Visible = 1
	.Height = 768
	.Width = 1024
	.Navigate("https://tme.com/tme/")
EndWith
_IELoadWait($oIE)
$sHTML = _IEBodyReadHTML($oIE)

$oForm = _IEGetObjById($sHTML, "isc_3S")
$iLogin = _IEFormElementGetObjByName($oForm, "userName") 
_IEFormElementSetValue($iLogin, $login) 
$iPass = _IEFormElementGetObjByName($oForm, "password") 
_IEFormElementSetValue($iPass, $pass) 
$oTik_galochka = _IEGetObjById($oIE, "isc_47") 
_IEAction($oTik_galochka, "click") 
_IEFormSubmit($oForm)
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Сделал Send($sHTML) в notepad.exe, вот результат:
Код:
<- OPTIONAL: include this if you want history support --><IFRAME style="POSITION: absolute; BORDER-RIGHT-WIDTH: 0px; WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; HEIGHT: 0px; BORDER-LEFT-WIDTH: 0px" id=__gwt_historyFrame tabIndex=-1 src="javascript:''"></IFRAME><- RECOMMENDED if your web app will not function without JavaScript enabled --><NOSCRIPT></NOSCRIPT><-  <h2 align="center">TM</h2>-->

<DIV id=loginContainer></DIV><IFRAME style="POSITION: absolute; BORDER-BOTTOM-STYLE: none; BORDER-LEFT-STYLE: none; WIDTH: 0px; BORDER-TOP-STYLE: none; HEIGHT: 0px; BORDER-RIGHT-STYLE: none" id=tm tabIndex=-1 src="javascript:''"></IFRAME>
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Velmor [?]
Да, код получился малоинформативным. Посмотрите, что покажет этот код.
Код:
#include <IE.au3>

$oIE = _IECreate('Адрес Вашего сайта')
$oHead = _IETagNameGetCollection($oIE, 'head', 0)

ConsoleWrite(_IEPropertyGet($oHead, 'innerhtml') & @LF)


Можно установить DebugBar и с его помощью найти нужные элементы.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Результат вытягивания "head":
Код:
<TITLE>TM</TITLE>

<META content="text/html; charset=UTF-8" http-equiv=content-type>

<META content=IE=EmulateIE7 http-equiv=X-UA-Compatible><-                                                               --><- Consider inlining CSS to reduce the number of requested files --><-                                                               --><LINK rel=stylesheet type=text/css href="tme.css"><LINK rel=icon href="images/favicon.ico"><-                                           --><- Any title is fine                         --><-                                           --><-                                           --><- This script loads your compiled module.   --><- If you add any GWT meta tags, they must   --><- be added before this line.                --><-                                           -->

<SCRIPT language=javascript type=text/javascript src="tme/tme.nocache.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Core.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Foundation.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Containers.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Grids.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Forms.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_RichTextEditor.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_Calendar.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/modules/ISC_DataBinding.js"></SCRIPT>



<SCRIPT language=javascript src="https://tme.com/tme/tme/sc/skins/Enterprise/load_skin.js"></SCRIPT>



<SCRIPT defer>tme.onInjectionDone('tme')</SCRIPT>

<LINK rel=stylesheet type=text/css href="https://tme.com/tme/tme/sc/skins/Enterprise/skin_styles.css"><-                                           --><- The body can have arbitrary html, or      --><- you can leave the body empty if you want  --><- to create a completely dynamic UI.        --><-                                           --><LINK rel=stylesheet href="https://tme.com/tme/tme/gwt/chrome/chrome.css">
Можно ли это сделать силами AutoIT? Ведь я даже с ним не могу толком разобраться)
А данное приложение DebugBar - это не что-то вроде Developer Tool в Chrome или FireBug в FireFox? Ими я умею пользоваться и с помощью них я и получил ID элементов, но вот IE не видит исходный код, как и получилось при вызове $oHead или _IEBodyReadHTML().
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Добрый день.
С Новым Годом вас!
У меня по-прежнему не получается выполнить данную задачу. Как я не крутил эти функции, все равно не вытягиваются элементы..
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor [?]
по-прежнему не получается
Когда ничего не помогает - используйте AutoIt по прямому назначению (имитация действий пользователя). Пример для Google
Код:
#include <IE.au3>
$sEmail = '[email protected]'
$sPassw = '12345678'
$sAuth = "{tab}" & $sEmail & "{tab}" & $sPassw & "{tab}{enter}"
$oIE = _IECreate('https://accounts.google.com/ServiceLoginAuth')
ControlClick("[class:IEFrame]", "", "Internet Explorer_Server1", "", 1, 10, 10)
ControlSend("[class:IEFrame]", "", "Internet Explorer_Server1", $sAuth)
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI, спасибо за предложенный способ.
Такой вариант оставляю на самый крайний случай потому, что если вдруг окно браузера станет не активным или появится сообщени про обновление (к примеру), то часть тыков проходит мимо.
Может Вы знаете, можно ли как-то отправить данную форму сразу на сервак - не проходить весь пусть получения элементов по ID или имение, а потом заполнения формы, а сразу отправить заполенную форму? Ведь IDшники у меня есть, можно ли с ними какой-нить POST запрос отправить?..
Мне-то, по сути, нужно зайти под юзером на локальный сайт (не gmail) и скачать файл и может есть другой путь (пример логина на gmail мне не помог)? А не получается, как мне кажется, т.к. браузер не может сдеть "_IEGet..." из JS (похоже т.к. это хранится в DOM), ведь, как я привел выше, в исходном коде HTML нету данных элементов, только подключение JS.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor
Посмотрите соседнюю тему Нажать на кнопку без ID Может какой вариант вам подойдёт...

какой-нить POST запрос
Поищите по форуму - примеры есть.

скачать файл и может есть другой путь
Попробуйте функции
Код:
InetGet()
InetRead()
В справке указано, как их использовать с логином-паролем.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI
Тему "Нажать на кнопку без ID" я читал, прежде чем эту создать, но ниодин из приведенных там вариантов, мне не помог, т.к. там как раз идет упор на "_IEAction" или "_IEGet...", которые не работают с JS. Правда этот "$oIe.document.querySelector('#jsLoginPopupWidget__SignIn').click()" момент мне не понятен вообще.
Функция
Код:
InetGet()
не подходит, как мне кажется, потому что весь сайт сделан на JS у меня нет прямой ссылки к файлу - данный файл тоже генерируется с помощью JS (если точнее то JS отправляет SQL запрос на сервер в соответствии с моими юзерскими параметрами, сервер создает у себя файл и присылает ссылку на файл, но имя каждый раз меняется т.к. файл заново создается на серваке) и на протяжении всего процесса у меня не меняется URL.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor [?]
ниодин из приведенных там вариантов, мне не помог
Ну, если даже UIAutomate не помогает, то используйте вариант, оставленный на крайний случай.
Или ждите специалиста по сниферам и запросам.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI
Вы не подумайте, что я отмахиваюсь от Ваших предложений/помощи. Просто хочется сделать функциональный способ без костылей, но мне не хватает для этого знаний. По этому решил обратиться за помощью к специалистам, т.к. они могут увидеть ситуацию лучше меня и предложить правильный шаг. Не судите строго, я нуб в этом деле, как видите, даже не с первого раза понятно описал задачу. Вы скажите, что я еще могу показать, что бы можно было точнее определить ситуацию.
Если можете, подскажите, пожалуйста, где можно прочитать подробно о предложенном Вами "UIAutomate" и HTTP-запросах (по справке мне не понятно). У меня есть wireshark, пакеты я могу отследить, только как потом это правильно использовать в функциях - не знаю.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Добрый день.
Проблему с "отсутствием сорс-кода" решил, ответ оказался довольно банальным - поставить задержку после загрузки, что бы отработал JS.
Код:
_IELoadWait ($oIE, 1000)


Но теперь натолкнулся на такую проблему. Кто сталкивался с таким, подскажите, пожалуйста, как отметить CheckBox, если его код выглядит так:
Код:
<div id="isc_47" $89="isc_CheckboxItem_1" $9a="$9d" class="labelAnchor" style="min-width:240px;white-space:nowrap;"><img src="checked.png" width="13" height="13" align="TEXTTOP" id="isc_48" eventpart="valueicon" style="vertical-align:middle;margin-left:4px;margin-right:3px;" border="0" suppress="TRUE">User?</div>

Пробовал так, картинку находит но CheckBox не активируется:
Код:
$iImgs = _IEImgGetCollection($oIE)
For $iImg In $iImgs
	Select
		Case $iImg.id = "isc_48"
			_IEAction($iImg, "isc_48")
			MsgBox(0, "yes", "img")
	EndSelect
Next


И так же нажать на кнопку:
Код:
<td nowrap="true" class="buttonTitle" style="padding-top:0px;padding-bottom:0px;" '="" align="center" valign="center">Sign In</td>
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
madmasles
Прошу прощения, ошибся указав ID вместо "click" - не работает.
 
Верх