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

Библиотека, подключаемая по технологии 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();
| }};»);

48 Comments

  1. nsm

    Приветствую коллегу по железу (правда я по силовому троеборью в экипировке- IPF).

    Вы не думали над тем что бы сделать на основе http://infostart.ru/public/149468/ парсер сайта? Я понимаю, что вы и так попытались донести свою мысль , но к сожалею большинство не понимают как это можно реализовать (ну или только я) ), как ни стараются)

    Reply
  2. centurion74

    (1) nsm, У меня как раз таки обработка собирает данные о кроссах и ценах с 12 сайтов, включая Exist, и выводит в сводную таблицу, либо тащит с любого из сайта список кросс-номеров к детали и в подборе делает отбор по кроссам

    Reply
  3. centurion74

    (1) nsm, http://www.youtube.com/watch?v=NMK_-knQb0A вот собственно так работала старая версия без проценки, только в режиме подбора кроссов

    Reply
  4. theshadowco

    Как я понимаю, компонента по технологии COM, а не NativeAPI

    Reply
  5. centurion74

    (4) theshadowco, все верно. я в С++ особо не разбираюсь, сделал чтобы работало и то хорошо

    Reply
  6. Ava_1c

    Метод объекта не обнаружен (Destroy)

    Reply
  7. centurion74

    Можно кусок кода?

    Reply
  8. Ava_1c

    (7) Код как-бы из примера в статье:

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

    Показать

    Reply
  9. centurion74

    Мой фэйл, в новой версии библиотеки метод называетcя DestroyView()

    Reply
  10. Ava_1c

    (9) а где взять новую версию библиотеки? Инфостарт показывает, что дата файла = 01.06.14.

    Reply
  11. Ava_1c

    (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, не могли бы Вы привести хоть один живой пример использования скриптов?

    Reply
  12. centurion74

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

    Если уж говорить об экзисте, то вот рабочий кусок кода, который я продал очередной раз не далее как сегодня:

    Процедура Войти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();»);
    КонецПроцедуры
    
    Reply
  13. centurion74

    Еще ньюанс, куки сохраняются по умолчанию в рабочую папку программы, как правило это «C:Program Files (x86)1cv82common» или «C:Program Files1cv82common», возможно, что UAC не дает записывать туда, либо нет прав на запись

    Reply
  14. EmpireSer

    Я как понял базовая система — это «альтернативный браузер» (с возможностью работы без форм)?

    Reply
  15. centurion74

    (14) EmpireSer, да, хотя в SDK awesomium в принципе есть функционал для отображения окна

    Reply
  16. EmpireSer

    (15)

    Это я заметил.

    Я ещё заметил, что она кросс-платформенная. Может Вам лучше вместо СОМ сделать Native компоненту? Заодно сможете сделать тоже кросс-платформенную внешнюю компоненту для 1С.

    Reply
  17. centurion74

    время будет может займусь, хотя потребности нет вроде такой

    Reply
  18. tunesoft

    (13) а указать другой путь для сохранения куки нельзя ?

    Reply
  19. Гость

    Добрый день!

    Я видел вашу разработку для Гугл Хрома. Мне нужно не грабить страницу, а распечатать её в файл PDF по правилам Гугл Хром. То есть то, что делается с помощью стандартного меню Печать-Сохранить как PDF меня вполне устроит. Нужен ещё один метод к уже загруженной странице. PrintPDF(<path-file>)

    Сколько может стоить такая доработка у Вас и в какой срок?

    Reply
  20. dikd

    А на 7.7 она будет работать?

    Reply
  21. centurion74

    (20) dikd, теоретически должно

    Reply
  22. centurion74

    (19) Гость, посмотрю на выходных

    Reply
  23. dikd

    Вот такая ошибка при регистрации dll’ки

    Reply
  24. dikd

    Win 7 Prof 32 bit, Пробовал закидывать в System32 и в C:\r

    регить как regsvr32 altbrowser.dll

    regsvr32 C:altbrowser.dll

    Reply
  25. nsm

    centurion74, свяжитесь, пожалуйста, со мной по поводу возмездного сотрудничества 9629095 собака gmail точка com как можно скорее))

    Reply
  26. nsm

    (22) Жаль, что моё предложение оказалось неинтересным. Думал, что смогу приобрести у вас уже готовый продукт.

    Reply
  27. centurion74

    (26) nsm, я отписал на почту вроде

    Reply
  28. nsm

    (27) точно нет) напишите ещё раз, пожалуйста. 9629095@gmail com

    Reply
  29. keln

    (9) подскажи, а как дела обстоят с куками? Есть один сайт, который не дает залогинится, ругаясь на то, что «В вашем браузере отключены cookies».

    Reply
  30. centurion74

    (29) keln, да работают, один момент-они сохраняются в рабочую папку программы, как правило, куда указывает путь рабочей папке в ярлыке, там должны быть разрешения на запись

    Reply
  31. r2d255

    Вот такая ошибка при регистрации — http://savepic.net/6704820.htm

    Windows 7 — 64

    Можете подсказать что не так?

    Reply
  32. Andruykha

    Спасибо! Пригодился!

    Reply
  33. Andruykha

    В клиент-серверной базе не работает

    Ошибка при вызове конструктора (COMОбъект): -2147221164(0x80040154): Класс не зарегистрирован

    Reply
  34. Leo_A

    (31) r2d255,

    Всем у кого не регается altbrowser.

    Вероятнее всего проблема в файлах:

    msvcp120.dll

    msvcr120.dll

    Так же убедитесь, что вы не забыли распаковать Awesomium в каталог altbrowser.dll

    Выяснить, чего реально не хватает можно софтиной dependencywalker. Запускаете исполняемый файл, подсовываете ему библиотеку и смотрите, на что ругается. В первую очередь подкиньте в тот же каталог altbrowser.dll те библиотеки, которые без значка песочных часов.

    Reply
  35. nkYellOw

    Спасибо за обработку! Попробую поковырять. Долгие танцы с бубном по нахождению элементов и судя потому что после нажатия кнопки в результате та же страница то я делаю что то не так)))

    пример кода на сайте:

    <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();»);

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

    Reply
  36. Serginio
  37. sondarium

    Сайт требует TLS 1.1 и не хочет работать с TLS 1.0. Как это решить? Подскажите, кто разбирается, пожалуйста.

    Transport Layer Security — Протокол защиты транспортного уровня.

    Reply
  38. MsDjuice

    В этой разработке есть возможность перейти на страницу и распечатать ее программно? Без открытия диалогов и окон. Спасибо

    Reply
  39. centurion74

    (38) печать не реализована, но сам движок это позволяет, можете скачать исходники и дописать по аналогии с другими методами

    Reply
  40. man-trid

    Добрый день,

    стоит задача настроить взаимодействие между 1с и контур.фокус.

    Основная проблема — авторизоваться в сервисе. Для авторизации на электронный адрес высылается одноразовая ссылка. По ней выполняется обращение к ресурсу auth.kontur.ru с уникальным ключом, после чего происходит редирект на сайт фокус.контур.

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

    Reply
  41. centurion74

    (40) авторизация по ссылке скорее всего сработает, а насчет пост-запросов-только если средствами Javascript пробовать

    Reply
  42. wild83

    Возникла проблема. При загрузке страницы на одном сайте появляется «выберите ваш город» и дальше загрузке страницы не идет.

    Попробовал открыть через Chrome (полная версия), выбрал город, окно больше не появлялось. Однако через компоненту проблема по-прежнему осталась.

    Есть ли возможность как-то отобразить визуально окно страницы при работе с компонентой или может есть какой-нибудь другой вариант как обойти всплывающие окна препятствующие загрузке страницы?

    Reply
  43. GoodZone

    Так и не получилось зарегистрировать dll, ошибка как в 23. 2 стратмани (последних) потрачены в пустую. Есть рекомендации как мне выполнить регистрацию?

    Reply
  44. centurion74

    (43) обычно помогает установка https://www.microsoft.com/en-us/download/details.aspx?id=5555

    Reply
  45. GoodZone

    (44) а можете исходники скинуть, стартмани кончились ((. Проект Awesomium теперь Ultralight называется, хочу нативную компоненту написать. Или может занимались таким?

    Reply
  46. centurion74

    (45) почту в личку скиньте

    Reply
  47. GoodZone

    (46) что-то в личку не уходит сообщение infoСОБАКАbizon22.ru

    Reply
  48. user633364_seleznev.ua

    а впн прикрутить есть какие-то варианты?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *