gifts2017

API Chrome для 1C -альтернатива ПолеHTMLДокумента для парсера

Опубликовал centurion74 (centurion74) в раздел Программирование - Внешние компоненты

Библиотека, подключаемая по технологии COM, предоставляет доступ к Api awesomiom (www.awesomium.com), браузеру на движке chrome без визуального отображения

Если вы когда-нибудь писали парсер html под 1c, то прекрасно знакомы с кучей багов ПолеHTMLДокумента, которые он наследует от WebBrowser - например событие ДокументСформирован некорректо отрабатывает AJAX, DOM модель работает от случая к случаю на разных машинах и т.д.

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

Итак, по порядку.

Для начала, нужно зарегистрировать библиотеку

regsvr32 altbrowser.dll

Инициализация компоненты:

Попытка
 браузер = новый COMОбъект("AltBrowser.Browser");
Исключение
 Предупреждение("Не удалось загрузить внешнюю компоненту!",,"Ошибка создания");
 Состояние("");
 Возврат;
КонецПопытки;
Браузер.CreateView();

По сути, CreateView() это создание вкладки в браузере. Создание нескольких вкладок не реализовано, не было потребности.

Обязательно надо закрыть ее, когда она не нужна. 

 Браузер.DestroyView();

Перейти на страницу

 Результат=Браузер.Navigate(url);

Переходит на указанный url, выполняется синхронно, возвращает строку outerHTML. В отличии от ПолеXTMLДокумента возвращает значение после полной загрузки документа, корректно отрабатывает AJAX.  Асинхронная загрузка не реализована.

 Результат=Браузер.outerHTML();

 Тут все просто, возвращает outerHTML документа

 Браузер.ExecuteJS(ТекстСкрипта);

 Выполняет javascript, опять же синхронно. Результат можно посмотреть  с помощью outerHTML. выполнение скриптов с возвратом результата не стал реализовывать, т.к. за 2 года работы потребности в этом не было.

 

В качестве примера авторизация на сайте emex.ru

Браузер.Navigate("http://emex.ru/");
браузер.ExecuteJS("var elems = document.getElementsByTagName('input');
|for(var i=0; i | if (elems[i].name=='username'){
| elems[i].value='"+ЛогинEmex+"';
| }};");
браузер.ExecuteJS("var elems = document.getElementsByTagName('input');
|for(var i=0; i | if (elems[i].name=='password'){
| elems[i].value='"+ПарольEmex+"';
| }};");
браузер.ExecuteJS("var elems = document.getElementsByTagName('form');
|for(var i=0; i | var str=elems[i].action;
| if (str.indexOf('Account.mvc')+1){
| elems[i].submit();
| }};");

Скачать файлы

Наименование Файл Версия Размер
Внешняя компонента AltBrowser 47
.dll 30,50Kb
01.06.14
47
.dll 30,50Kb Скачать
Awesomium (распаковать в каталог к AltBrowser.dll) 45
.zip 15,01Mb
01.06.14
45
.zip 15,01Mb Скачать
Исходники на с++ 21
.zip 5,79Mb
01.06.14
21
.zip 5,79Mb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. nsm (nsm) 09.06.14 02:05
Приветствую коллегу по железу (правда я по силовому троеборью в экипировке- IPF).
Вы не думали над тем что бы сделать на основе http://infostart.ru/public/149468/ парсер сайта? Я понимаю, что вы и так попытались донести свою мысль , но к сожалею большинство не понимают как это можно реализовать (ну или только я) ), как ни стараются)
2. centurion74 (centurion74) 09.06.14 11:26
(1) nsm, У меня как раз таки обработка собирает данные о кроссах и ценах с 12 сайтов, включая Exist, и выводит в сводную таблицу, либо тащит с любого из сайта список кросс-номеров к детали и в подборе делает отбор по кроссам
3. centurion74 (centurion74) 09.06.14 11:37
(1) nsm, http://www.youtube.com/watch?v=NMK_-knQb0A вот собственно так работала старая версия без проценки, только в режиме подбора кроссов
4. Валерий Максимов (theshadowco) 11.06.14 11:23
Как я понимаю, компонента по технологии COM, а не NativeAPI
5. centurion74 (centurion74) 11.06.14 17:55
(4) theshadowco, все верно. я в С++ особо не разбираюсь, сделал чтобы работало и то хорошо
6. Александра Афанасьева (Ava_1c) 20.06.14 12:45
Метод объекта не обнаружен (Destroy)
Прикрепленные файлы:
7. centurion74 (centurion74) 20.06.14 13:24
8. Александра Афанасьева (Ava_1c) 20.06.14 13:48
(7) Код как-бы из примера в статье:

	Попытка 
		браузер = новый COMОбъект("AltBrowser.Browser");
	Исключение
		Предупреждение("Не удалось загрузить внешнюю компоненту!",,"Ошибка создания");
		Состояние("");
		Возврат;
	КонецПопытки;
	Браузер.CreateView();
	
	Браузер.Destroy();
...Показать Скрыть
9. centurion74 (centurion74) 20.06.14 16:46
Мой фэйл, в новой версии библиотеки метод называетcя DestroyView()
10. Александра Афанасьева (Ava_1c) 20.06.14 17:07
(9) а где взять новую версию библиотеки? Инфостарт показывает, что дата файла = 01.06.14.
11. Александра Афанасьева (Ava_1c) 20.06.14 17:36
(10) Скачала еще раз библиотеку, переустановила, DestroyView() теперь работает. Спасибо.
Но так и не получилось воспользоваться ExecuteJS(). =(
Открываю страницу со следующим кодом:
<ht ml><body>

<fоrm method="POST" action='http://exist.ru/Profile/Login.aspx' id="loginForm">
<input type="text" id="login" name="login" value="МойЛогинНаЭкзисте" tabindex="1" />
<input type="password" value="МойПарольНаЭкзисте" id="pass" name="pass" tabindex="2" />
<input type="checkbox" name="save" id="tbSave" tabindex="3" value="yes" />
<input id="btnLogin" type="submit" value="" tabindex="4" style="width:30px;" />
</form>

</body></html>
...Показать Скрыть
Пытаюсь сделать
Браузер.ExecuteJS("document.getElementById('loginForm').submit();")
- ничего не происходит..
Пример авторизация на сайте emex из статьи - тоже не рабочий.

enturion74, не могли бы Вы привести хоть один живой пример использования скриптов?
12. centurion74 (centurion74) 20.06.14 18:53
А где вы взяли такую страницу? если генерируете страничку, то сервер не примет ее, с большой долей вероятности, ибо источник неведомо где расположен.
Если уж говорить об экзисте, то вот рабочий кусок кода, который я продал очередной раз не далее как сегодня:
Процедура ВойтиExistНажатие(Элемент)
	Браузер.Navigate("http://exist.ru/");
	браузер.ExecuteJS("document.getElementById('login').value='"+ЛогинExist +"';
	|document.getElementById('pass').value='"+ПарольExist+"';
	|document.getElementById('tbSave').checked=true;
	|document.getElementById('loginForm').submit();");
КонецПроцедуры
...Показать Скрыть
13. centurion74 (centurion74) 20.06.14 18:58
Еще ньюанс, куки сохраняются по умолчанию в рабочую папку программы, как правило это "C:\Program Files (x86)\1cv82\common\" или "C:\Program Files\1cv82\common\", возможно, что UAC не дает записывать туда, либо нет прав на запись
14. Сергей Вн (EmpireSer) 01.07.14 15:05
Я как понял базовая система - это "альтернативный браузер" (с возможностью работы без форм)?
15. centurion74 (centurion74) 01.07.14 15:34
(14) EmpireSer, да, хотя в SDK awesomium в принципе есть функционал для отображения окна
16. Сергей Вн (EmpireSer) 01.07.14 17:33
(15) centurion74,
Это я заметил.
Я ещё заметил, что она кросс-платформенная. Может Вам лучше вместо СОМ сделать Native компоненту? Заодно сможете сделать тоже кросс-платформенную внешнюю компоненту для 1С.
17. centurion74 (centurion74) 02.07.14 08:02
время будет может займусь, хотя потребности нет вроде такой
18. Александр Иванов (tunesoft) 01.10.14 12:50
(13) centurion74, а указать другой путь для сохранения куки нельзя ?
19. Гость 11.11.14 06:26
Добрый день!
Я видел вашу разработку для Гугл Хрома. Мне нужно не грабить страницу, а распечатать её в файл PDF по правилам Гугл Хром. То есть то, что делается с помощью стандартного меню Печать-Сохранить как PDF меня вполне устроит. Нужен ещё один метод к уже загруженной странице. PrintPDF(<path-file>)
Сколько может стоить такая доработка у Вас и в какой срок?
20. Андрей Стручалин (dikd) 13.11.14 21:36
А на 7.7 она будет работать?
21. centurion74 (centurion74) 14.11.14 16:03
(20) dikd, теоретически должно
22. centurion74 (centurion74) 14.11.14 16:04
(19) Гость, посмотрю на выходных
23. Андрей Стручалин (dikd) 19.11.14 14:09
Вот такая ошибка при регистрации dll'ки
Прикрепленные файлы:
24. Андрей Стручалин (dikd) 19.11.14 14:19
Win 7 Prof 32 bit, Пробовал закидывать в System32 и в C:\
регить как regsvr32 altbrowser.dll
regsvr32 C:\altbrowser.dll
25. nsm (nsm) 20.11.14 13:44
centurion74, свяжитесь, пожалуйста, со мной по поводу возмездного сотрудничества 9629095 собака gmail точка com как можно скорее))
26. nsm (nsm) 23.11.14 12:04
(22) centurion74, Жаль, что моё предложение оказалось неинтересным. Думал, что смогу приобрести у вас уже готовый продукт.
27. centurion74 (centurion74) 23.11.14 13:30
(26) nsm, я отписал на почту вроде
28. nsm (nsm) 23.11.14 21:42
(27) centurion74, точно нет) напишите ещё раз, пожалуйста. 9629095@gmail com
29. Евгений Заречкин (keln) 21.02.15 19:14
(9) centurion74, подскажи, а как дела обстоят с куками? Есть один сайт, который не дает залогинится, ругаясь на то, что "В вашем браузере отключены cookies".
30. centurion74 (centurion74) 05.03.15 12:53
(29) keln, да работают, один момент-они сохраняются в рабочую папку программы, как правило, куда указывает путь рабочей папке в ярлыке, там должны быть разрешения на запись
31. Николай Мирутенко (r2d255) 15.04.15 14:41
Вот такая ошибка при регистрации - http://savepic.net/6704820.htm
Windows 7 - 64
Можете подсказать что не так?
32. Андрей Николаев (Andruykha) 29.07.15 18:14
33. Андрей Николаев (Andruykha) 07.09.15 15:47
В клиент-серверной базе не работает
Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован
34. Андрей Лео (Leo_A) 20.02.16 12:12
(31) r2d255,
Всем у кого не регается altbrowser.
Вероятнее всего проблема в файлах:
msvcp120.dll
msvcr120.dll
Так же убедитесь, что вы не забыли распаковать Awesomium в каталог altbrowser.dll
Выяснить, чего реально не хватает можно софтиной dependencywalker. Запускаете исполняемый файл, подсовываете ему библиотеку и смотрите, на что ругается. В первую очередь подкиньте в тот же каталог altbrowser.dll те библиотеки, которые без значка песочных часов.
35. Evgeny Babkov (nkYellOw) 23.06.16 12:47
Спасибо за обработку! Попробую поковырять. Долгие танцы с бубном по нахождению элементов и судя потому что после нажатия кнопки в результате та же страница то я делаю что то не так)))

пример кода на сайте:
<input name="username" class="logininput" type="text">
<input name="password" class="logininput" type="password">
<input name="remember_me" value="true" selected="" class="absmiddle" type="checkbox">
<input id="loginsubmit" class="loginsubmit" src="assets/images/button_login.png" value="Login" alt="Login" onclick="javascript:document.login_form.Ticket.value=gup('ticketID'); document.login_form.Manufacturer.value=gup('manName'); document.login_form.DetailTabNumber.value=gup('partDetailTab'); document.login_form.PartNum.value=gup('partnumber');setTimeout(diableLogin, 1);" type="submit">

как я обрабатываю:
 Браузер.ExecuteJS("document.getElementsByTagName('username')[0].value='"+Логин+"';");
	Браузер.ExecuteJS("document.getElementsByTagName('password')[0].value='"+Пароль+"';");		
	Браузер.ExecuteJS("document.getElementById('remember_me').checked=true;");
	Браузер.ExecuteJS("document.getElementById('loginsubmit').submit();");


Правильно делаю? но не работает =)))




Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа