Что нового

[Сеть, интернет] Авторизация на сайте и скачивание файла

dbs

Новичок
Сообщения
2
Репутация
0
Пытаюсь автоматизировать получение файла (прайс-лист). Для получения файла требуется авторизация на сайте. Авторизуюсь успешно при помощи кода:

Код:
$sLogin = '*******'
$sPass = '*******'
$sUrl = 'http://***.ru/****/Login?ReturnUrl=%2F'

$oIE = _IECreate($sUrl)
If @error Then Exit 13
For $i = 1 To 1
    ;$oForm = _IEGetObjById($oIE, 'loginbox')
	$oForm = _IEFormGetCollection($oIE,1)
    If @error Then ExitLoop
    $oEmail = _IEFormElementGetObjByName($oForm, 'Username')
    If @error Then ExitLoop
    $oPass = _IEFormElementGetObjByName($oForm, 'Password')
    If @error Then ExitLoop
    _IEFormElementSetValue($oEmail, $sLogin)
    If @error Then ExitLoop
    _IEFormElementSetValue($oPass, $sPass)    
    If @error Then ExitLoop
    _IEFormSubmit($oForm)
    If @error Then ExitLoop
Next
If @error Then
    _IEQuit($oIE)
    Exit 13
EndIf


Далее нужно скачать файл, который генерируется при переходе по ссылке, т.е. прямой ссылки на него нет.
Здесь я вижу 2 пути:
1. Скачивание средствами IE, но здесь упираюсь в всплывающий диалог сохранения файла.
2. Скачивание при помощи InetGet - но он сохраняет мне html-страницу при переходе по ссылке, а не сгенерированный файл.
Здесь хотел бы уточнить - функция InetGet, как я понимаю использует dll InternetExplorer'a, а моя авторизация при этом остается актуальной в этой функции?

В общем, подскажите как лучше реализовать решение данной задачи.
C AutoIt знаком не более нескольких часов, из которых 2 часа осваивал ф-ции библиотеки Excel, так что не обижайтесь если вопросы покажутся глупыми.
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
dbs [?]
1. Скачивание средствами IE, но здесь упираюсь в всплывающий диалог сохранения файла.
В этом диалоге можно нажать на сохранить.
Вам понадобится эта библиотека
Код:
$notificationHandle = ControlGetHandle($oIe.hwnd,'','[CLASS:Frame Notification Bar; INSTANCE:1]')
$notificationObject = _UIA_GetElementFromHandle($notificationHandle)
$propertyCondition = _UIA_CreatePropertyCondition('Name', 'Сохранить')
$saveButton = _UIA_GetElementFromCondition($notificationObject, $propertyCondition)
_UIA_ElementDoDefaultAction($saveButton)
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
inververs
Пример обхода диалогового окна для сохранения файла на форуме есть, нужно только поискать.
UIAutomate в данном случае не оправдана.

dbs
OffTopic:
Для того чтобы сказать почему телевизор не работает, нужно как минимум знать как он устроен и принципы работы электронных компонентов!!!
Можно попросить помощи у знающих людей, однако для того чтобы вам помогли, нужно суметь как можно точнее описать неисправность и предоставить сам телевизор!
 

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
462
Может и есть, но на форуме искать не удобно, нужно хотя бы wiki.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
InnI [?]
Интересно узнать - почему?
Потому как, проще сделать это с помощью JScript.

dbs [?]
1. Скачивание средствами IE, но здесь упираюсь в всплывающий диалог сохранения файла.
Вот вам пример обхода блокировки.

Код:
#include <IE.au3>

$sURL = 'http://autoit-script.ru/index.php?action=downloads;sa=view;down=6'

$oIE = _IECreate($sURL)
$oIE.document.parentWindow.execScript("setTimeout(function(){var link = ''; for(i=0; i < document.links.length; i++){if(document.links[i].outerText == 'Encoding.zip'){link = document.links[i]}} link.click();}, 1)")

$hWnd = WinWaitActive('Загрузка файла')
Sleep(250)
ControlClick($hWnd, '', '[CLASS:Button;INSTANCE:2]')

$hWnd = WinWaitActive('Сохранить как')
Sleep(250)
ControlClick($hWnd, '', '[CLASS:Button;INSTANCE:2]')

$hWnd = WinWaitActive('Сохранить как', '', 1)
If $hWnd Then
	ControlClick($hWnd, '', '[CLASS:Button;INSTANCE:1]')
EndIf

$hWnd = WinWaitActive('Загрузка завершена')
Sleep(250)
ControlClick($hWnd, '', '[CLASS:Button;INSTANCE:3]')
 

InnI

AutoIT Гуру
Сообщения
4 368
Репутация
1 174
Garrett
проще сделать это с помощью JScript.
А если я не знаю JScript? Если плохо разбираюсь в DOM и методах IE? Зачем всё это, если интерфейс IUIAutomation превращает любую программу в набор панелей, кнопок, полей ввода? Проблема будет решена, цель достигнута. Что ещё нужно?

пример обхода блокировки
Вы забыли указать версию IE. На IE10 данный пример не работает, т.к. там нет окна загрузки. Какими функциями JScript можно нажать кнопку "Сохранить" на всплывающей внизу панели?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
InnI [?]
А если я не знаю JScript?
Вот, вот к этому всё и сводится! JScript достаточно прост в освоении, это не ассемблер.
Если вы не хотите ничего знать то зачем вам программирование?!

IE10 данный пример не работает
Не имею возможности проверить. За всем новым не гонюсь в принципе. Если так рассуждать, то скоро IE как таковой перестанет существовать, и что тогда? Наверно тогда и пригодится ваша UDF!
Я дал пример и в IE < 10 он работает. Что с ним делать дальше - каждый решает для себя сам.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
OffTopic:
InnI
Признаться, я не вижу связи между вашим намёком и моими словами.
Постараюсь объяснить мои слова.
IMHO если вы пишите скрипт для автоматизации программ связанных с определённой областью (в частности WEB), то будет очень кстати (хотя бы поверхностно) проштудировать DHTML, PHP, JScript, ASP и т.д. Да это муторно и долго, но так устроен мир, только негативное в нём получается быстро, позитивное же рождается мучительно и долго. Поэтому, если вы не готовы долго и мучительно идти к поставленной цели, то лучшим вариантом будет обратиться в стол заказов.

За всем новым не гонюсь в принципе, потому, что в старом нахожу для себя ещё много полезного и интересного.

Хотелось бы услышать ваши мысли по поводу вот этого предложения.
dbs [?]
Далее нужно скачать файл, который генерируется при переходе по ссылке, т.е. прямой ссылки на него нет.
 
Автор
D

dbs

Новичок
Сообщения
2
Репутация
0
Спасибо за помощь, советы и комментарии.

Авторизоваться POST-запросом, WinHTTP - не удалось, видимо не разобрался (в форме авторизации используется токен)

В итоге задачу решил посредством эмуляции нажатия клавиш в Firefox/Chrome :'(
И мой внутренний перфекционист крайне недоволен данным решением ;D ;D
 

InnI

AutoIT Гуру
Сообщения
4 368
Репутация
1 174
Garrett
Хотелось бы услышать ваши мысли по поводу вот этого предложения.
dbs
В итоге задачу решил посредством эмуляции нажатия клавиш в Firefox/Chrome
Вот и все мысли. Нажми на кнопку - получишь результат. Это и есть AutoIt.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
OffTopic:
InnI [?]
Вот и все мысли.
Что и требовалось доказать. Далее смысла дискутировать не вижу.



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

dbs [?]
В итоге задачу решил
[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
Тема не решена
[/info]
 

InnI

AutoIT Гуру
Сообщения
4 368
Репутация
1 174
OffTopic:
Garrett
Что и требовалось доказать. Далее смысла дискутировать не вижу.
Согласен. Хоть я и не понял кому и что вы доказали, но, в целом, ваше мнение мне понятно. Спасибо.
 
Верх