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 не будет опубликован. Обязательные поля помечены *