1

Тема: Jscript:Доступ к логин странице

Все чаще программы для аунтификации  используют НТМЛ страницы.
К большому сожалению Логины в программе  не совпадают с системными именами. Пришлось писать скрипты для заполнения  логина пользователя.
Доступ к странице может осуществляется следующими способами:
 Страница загружается сразу
 Страница перегружается 
 Станица загружается во фрейме

Страница загружается сразу

var ie = WScript.createObject('InternetExplorer.Application');
ie.visible = 1;
ie.navigate('http://Super_program1/login')
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

ie.document.all.userName.value = "Super_" + WScript.CreateObject("WScript.Network").UserName.toUpperCase()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

ie.document.all.password.focus()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

Страница http://Super_program2/start  перегружается. По этому будем использовать событие DocumentComplete ожидая загрузки нужной страницы http://Super_program2/login

var ie = WScript.createObject('InternetExplorer.Application', "ie_");
ie.visible = 1;
ie.navigate('http://Super_program2/start')
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

var li = true

while (li) {
    if (!ie) {
        break;
    }
    WScript.Sleep(1000);
}

ie.document.all.usernameField.value = "Super2_" + WScript.CreateObject("WScript.Network").UserName.toUpperCase()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)
ie.document.all.passwordField.focus()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

function ie_DocumentComplete(ie, url) {
    if (url.indexOf("http://Super_program2/login") == 0) {
        li = false
    }
}

Станица загружается во фрейме. Перехват страницы осуществляем также как и в предыдущем случаи. Сохраняя ссылки на элементы диалога. Имена  полей ввода разработчики выбрали оригинальные

var xL
var xP

var ie = WScript.createObject('InternetExplorer.Application', "ie_");
ie.visible = 1;
ie.navigate('http://Super_program3/index')
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

var li = true
while (li) {
    if (!ie) {
        break;
    }
    WScript.Sleep(1000);
}


xL.value = WScript.CreateObject("WScript.Network").UserName.toLowerCase()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)
xP.focus()
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)

function ie_DocumentComplete(ie, url) {
    if (url.indexOf("http://Super_program3/login") == 0) {
        var elements = ie.Document.getElementsByTagName('input')
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            if (element.name == 'var/user.id') {
                xL = element
            }
            if (element.name == 'var/old.password') {
                xP = element
            }
        }
        li = false
    }
}

Имена полей ввода удобно искать с помощью следующего скрипта являющегося хорошим примером использования  событий  InternetExplorer.Application

var ie = WScript.CreateObject("InternetExplorer.Application", "ie_");
//----------------------------------------------------------

var console = {
  log: function(msg) {
    WScript.StdErr.Write(msg + "\n");
  },

	event: function(operation, xpath, value)
	{
		var s = operation + "," + xpath + "," + value;
    WScript.StdErr.Write(s + "\n");
	}

};
//----------------------------------------------------------
function ie_BeforeNavigate2(browser, url, flags, target, postdata, headers, cancel) {
  console.log("[event] BeforeNavigate2");
  console.log("document -> " + typeof ie.Document);

  with({ window: ie.Document.parentWindow }) {
    console.log("window -> " + typeof window);
  }
}
//----------------------------------------------------------
function ie_NavigateComplete2(ie, url) {
  console.log("[event] NavigateComplete2");
  console.log("document -> " + typeof ie.Document);
  with({ window: ie.Document.parentWindow }) {
    console.log("window -> " + typeof window);
  }
}
//----------------------------------------------------------
function ie_DocumentComplete(ie, url) {
	console.log("\n");
  console.log("[event] DocumentComplete = " + url);
	console.log("TITLE = " + ie.Document.title);
	console.log("\n");
	ie.Document.attachEvent('onclick', function() {
		console.log('onclick');
	});
	setEventHandler(ie.Document.getElementsByTagName('a'));
	setEventHandler(ie.Document.getElementsByTagName('input'));
	setEventHandler(ie.Document.getElementsByTagName('select'));
	setEventHandler(ie.Document.getElementsByTagName('textarea'));
}
//----------------------------------------------------------
function ie_NewWindow2()
{
  console.log("[event] NewWindow2");
}
//----------------------------------------------------------
function ie_NewWindow3()
{
  console.log("[event] NewWindow3");
}
//----------------------------------------------------------
function ie_OnQuit() {
  console.log("[event] OnQuit");
  ie = null;
}
//----------------------------------------------------------
function setEventHandler(elements)
{
	for (var i=0; i<elements.length; i++) {
		var element = elements[i];
		element.attachEvent('onclick', eventHandler);
//		element.attachEvent('onfocus', eventHandler);
		element.attachEvent('onblur', eventHandler);
		element.attachEvent('onchange', eventHandler);
	}
}
//----------------------------------------------------------
function eventHandler(evt)
{
	console.event(
		evt.type,
		getElementLocation(evt.srcElement),
		getElementValue(evt.srcElement)
	);
}
//----------------------------------------------------------
function getElementLocation(element)
{
	var s = '';
	var tagName = element.tagName.toLowerCase();
	if (element.id) {
//		return '#' + element.id;
	}
	switch (tagName) {
		case 'a':
			var t = element.innerText;
			if (t) {
				return tagName + "[@href='" + t + "']";
			} else {
				var imgs = a.getElementsByTagName('img');
				if (0 < imgs.length) {
					t = imgs[0].alt;
					return tagName + ".img.alt='" + t + "']";
				}
			}
		break;
		case 'input':
			switch (element.type) {
				case 'radio':
				case 'checkbox':
					return tagName + "[@name='" + element.name + "' and @value='" + element.value + "']";
					break;
				default:
					return tagName + "[@name='" + element.name + "']";
					break;
		}
	}

}
//----------------------------------------------------------
function getElementValue(element)
{
	var tagName = element.tagName.toLowerCase();

	switch (tagName) {
		case 'input':
			switch (element.type) {
				case 'radio':
				case 'checkbox':
					return element.checked;
					break;

				default:
					return element.value;
			}
			break;

		case 'textarea':
			return element.value;
			break;

		case 'select':
			break;

		case 'a':
			return element.href;
			break;
	}

}
//----------------------------------------------------------
function getElementBySelector(tagName, name)
{
	var elements = ie.Document.getElementsByTagName(tagName);
}
//----------------------------------------------------------


ie.Visible = true;
ie.Navigate2("http://ya.ru");
ie.width = 800;
ie.height = 1000;
while (ie.Busy || (ie.READYSTATE != 4))
WScript.Sleep(100)
//ie.visible=1;

while (true) {
  if (!ie) {
    break;
  }
  WScript.Sleep(1000);
}

2 (изменено: badik, 2012-04-23 07:14:24)

Re: Jscript:Доступ к логин странице

Возникла проблема с интернет-клиентом (ИК) необходимо выгружать все выписки за день. Счетов больше 400
ИК использует в качестве ключей токены и экспортирует выписки по одной. Аундефикация происходит по токену.
Используя свойство ie_DocumentComplete можно получил список url выписок.
Последовательно загружаем страницы в свой iframe для получения списка.
Список счетов->список выписок по каждому счету->нужная выписка

function iFrame(url)
{
    if (ie.Document.all.vv) ie.Document.all.vv.outerHTML = "";
    var html = "<iframe name='ifrPrint' id='vv' style='width:100%;height:0' src="+url+"></iframe>";
    ie.Document.body.insertAdjacentHTML("beforeEnd", html);
}

iFrame(myurl)

function ie_DocumentComplete(iE,url)
{
if (url.indexOf(myurl)==0)
{
var a=iE.Document.getElementsByTagName("TD")
....
}
}

Список url был получен. Каждый url вернет zip файл и если загрузить в iframe  IExplorer каждый раз будет показывать окна
"Сохранить как" и "Загрузка завершена". Для  файлов > 100 это большая проблема.

Если использовать в скрипте oXMLHTTP = CreateObject("MSXML2.XMLHTTP") то отправленный запрос не пройдет аундефикацию ИК. Что делать?

После долгих мучений нашел ВЫХОД:
Создаем объект Microsoft.XMLHTTP в InternetExplorer.Application c помощью динамического скрипта.
Созданный объект наследует свойства IE и прекрасно работает


function ie_DocumentComplete(iE,url)
{
...
//var HttpReq = CreateObject("MSXML2.XMLHTTP")

var head = iE.Document.getElementsByTagName("head");
var script = iE.Document.createElement("script");
head[0].appendChild(script);
script.type = "text/javascript";
script.text = "  var myHTTP = new ActiveXObject(\"Microsoft.XMLHTTP\");"

for (var j=0; j<Vip.length;j++)
{
var HttpReq = iE.Document.parentWindow.myHTTP
HttpReq.Open("GET",Vip[j],false)
HttpReq.send(null)
var File1 = new ActiveXObject("ADODB.Stream")
File1.Mode = 3
File1.Type = 1
File1.Open()
File1.Write(HttpReq.responseBody)
File1.SaveToFile("Vip"+j+".zip",2)
File1.Close()
File1=null
}

.....

3

Re: Jscript:Доступ к логин странице

OFF: Каждый Колумб открывают Америку заново...:) Только не "токИны", а токЕны - tokens. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: Jscript:Доступ к логин странице

Тоже хочу открыть свою Америку и стать немного Колумбом в данной теме...
Позвольте проверить, правильно ли я понял затею...
т.е. прошла авторизация и имеем сессию на сервере с открытой страницей, затем не теряя сессию, в эту же страницу внедряем её же HTML содержимое + свой скрипт, который всё выгружает ? - я правильно понял ?

Времени не хватает... :-(

5 (изменено: badik, 2012-04-23 07:15:00)

Re: Jscript:Доступ к логин странице

Евген пишет:

Тоже хочу открыть свою Америку и стать немного Колумбом в данной теме...
Позвольте проверить, правильно ли я понял затею...
т.е. прошла авторизация и имеем сессию на сервере с открытой страницей, затем не теряя сессию, в эту же страницу внедряем её же HTML содержимое + свой скрипт, который всё выгружает ? - я правильно понял ?

Все правильно
При иницилизации объекта XMLHTTP в InternetExplorer.Application он наследует свойста (область видимости).
Применительно к интернет-клиенту XMLHTTP использует настройки безопасности сохраненные в IE.
Интернет Клиент сбербанка сделан на базе популярного нынче интернет-бакинга Faktura.ru разработанный ЦФТ.

Xameleon  можно ли получить  ссылочку на Америку (где есть похожий код с внедрением )?

var head = iE.Document.getElementsByTagName("head");
var script = iE.Document.createElement("script");
head[0].appendChild(script);
script.type = "text/javascript";
script.text = "  var myHTTP = new ActiveXObject(\"Microsoft.XMLHTTP\");"
... 
var HttpReq = iE.Document.parentWindow.myHTTP

Насчет Колумба - XMLHTTP  использую в своем скрипте для СПО СВК уже давно. Никогда не использовал УТА.