Хочу представить для вас проект "Спам бот" разработан для парсинга сетевых ресурсов и предоставления пользователю только той части информации, которая была изменена модератором ресурса. Оповещение пользователя (программиста), как и сам парсинг, осуществляется на сервере 1С и выполняется по регламентному заданию, без участия человека. (Но можно и на клиенте, по нажатию на кнопку)
1. Свойство
"_PJS" (только чтение) - содержит ссылку на инициализированный объект фантома (рудоментальное свойство, так и не придумал, где его использовать)
"URL" (только чтение) - содержит адрес открываемой страницы
"IDSite" (Чтение / Запись) - используется для идентификации ошибки. Было замечено, что при работе с "ВК" 1С возвращает ошибки обработки, только при завершении работы процедуры. Т.е. как только 1С отдаст контроль над формой пользователю, и только тогда вы увидите все ошибки. Но до тех пор, пока выполняется процедура, вы ошибок своей "ВК", так и не увидите.
(Заголовок ошибок предоставляется в следующем виде: "error/" + _IDSite + "/" + DateTime.Now.ToString())
2. Методы
"Initialization_Bot(Path_PJS)" - Инициализация фантома.
Параметр "Path_PJS" - Строка содержащая путь к папке с файлом "phantomjs.exe". (Путь не содержит сам файл, только путь к файлу!)
При передачи в качестве параметра строку: "ChromeDriver" или "InternetExplorerDriver", то будет использован соответствующий дайвер.
Драйвера "ChromeDriver" или "InternetExplorerDriver" использую соответствующий браузер, и парсинг страниц выполняется уже визуально в окне браузера.
п.с. драйвер "InternetExplorerDriver" пока в разработке.
"WindowMaximize_Bot()" - Разворачивает "браузер" фантома на полный экран. (Если окно не развернуть, то не все элементы обрабатываются при парсинге)
"Close_Bot()" - Закрывает и уничтожает объект фантома (Закрытие фантома, деструктор фантома).
"SetCookie_Bot(name, value, domain, path, Data)" - Добавление Cookie.
Параметры:
name - Имя кука
value - значение кука (строка)
domain - имя домена (Пример: releases.1c.ru)
path - путь к ресурсу (Пример: "/" или "/sd", зависит от ресурса.)
Data - Текстовое представление даты (Ограничено функцией "convert.todatetime c#")
"SetCookie2_Bot(Cookie)" - Добавление Cookie по ссылке на объект "Cookie". Параметр "Cookie" содержит ссылку на объект типа "Cookie".
"GetCookies_Bot()" - Получить список ВСЕХ Cookie. Возвращает список. (Список в терминах C#)
"ClearCookie_Bot()" - Удалить ВСЕ Cookie
"GetCookieName_Bot(Cookie)" - Получить имя Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". Возвращает строку.
"GetCookieValue_Bot(Cookie)" - Получить значение Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". Возвращает строку.
"GetCookieDomain_Bot(Cookie)" - Получить имя домена Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". Возвращает строку.
"GetCookiePath_Bot(Cookie)" - Получить путь Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". Возвращает строку.
"GetCookieSecure_Bot(Cookie)" - Получить признак безопасности Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". (Возвращает тип Булево)
"GetCookieExpiry_Bot(Cookie)" - Получить дату Cookie. Параметр "Cookie" содержит ссылку на объект типа "Cookie". (Возвращает тип "строка")
"Navigate_Bot(URL)" - Переход по адресу ссылки, т.е. открыть нужную страницу. Параметр "URL", содержит текст адреса страницы. Т.к. Фантом работает асинхронно, то нужно использовать паузу при открытии страницы.
"PageSource_Bot()" - Получить текст открытой страницы. (При получении страницы, некоторые ссылки на ресурсы сайта используют относительный путь, т.е. нужно будет дописывать ссылку, что бы все работало в офф-лайне). Возвращает строку.
"SaveAsFileJpeg_Bot(PathFile)" - Сохранить скрин-шот в файл в формате "Jpeg". Параметр "PathFile" содержит полный путь к записываемому файлу. (Если вам нужен другой формат, то библиотечку вам придется перекомпелировать)
"Pause(S)" - Вызвать паузу, в секундах. Параметр "S" должно содержать целое число.
"FindElement_Bot(strFind, Metod)" - Найти элемент по методу. Параметр "strFind" содержит строку, метод которого будет искаться. (Например ищем "class="common-container"", то и указать надо "common-container"). Возвращает элемент страницы. Если не найден, то вернет "Неопределено" (в 1С).
Параметр "Metod" должен содержать следующие значения (регистр букв важен!):
"Id" - Поиск по ИД
"Name" - Поиск по имени
"ClassName" - Поиск по имени класса
"TagName" - Поиск по имени тэга
"CssSelector" - Поиск по Css selector
"LinkText" - Поиск по представлению элемента
"PartialLinkText" - Поиск по части представления элемента
"XPath" - Поиск по "XPath" ("thead/tr/th" или "//*[@class='T-I J-J5-Ji T-I-KE L3']")
Если указать любое другое представление "Метод-а", то будет выполнен поиск по "Id".
"FindNextElement_Bot(webElement, strFind, Metod)" - Найти следующий элемент, в найденном, по методу. Параметр "webElement", элемент выступающий в качестве родителя поиска других элементов. Параметр "Metod", такой же, как и в "FindElement_Bot". Возвращает элемент. Если не найден, то вернет "Неопределено" (в 1С).
"FindElements_Bot" - Найти элементы, аналогичен "FindElement_Bot". Возвращает список (в терминах C#, прошу не путаться, в 1С это будет КомОбъект). Если элементы не найдены, то вернет пустой список (#C).
"FindNextElements_Bot(webElement, strFind, Metod)" - Найти элементы в элементе, аналогичен "FindElements_Bot".
"ClearElement_Bot(webElement)" - Очищает содержимое элемента. К примеру, если это текстовый блок, то будет очищен весь текст.
"ClickElement_Bot(webElement)" - Посылает команду элементу команду "Click". (Нажатие на ссылку, кнопку и т.д...)
"SubmitElement_Bot(webElement)" - Кликнуть на элемент (во фрейме). (Команда "Submit")
"GetAttributeElement_Bot(webElement, attributeName)" - Получить содержимого атрибута элемента, к примеру "InnerHTML", "src", "href" и т.д. Возвращает строку. Если атрибут не удастся получить, то вернет пустую строку.
"GetCssValueElement_Bot(webElement, propertyName)" - Получить Css элемента. Возвращает строку.
"SendKeysElement_Bot(webElement, text)" - Ввод текста, или как написал разработчик, послать набор клавиш элементу. DLL написана для ввода текста, но если нужно можно отправлять комбинации клавиш или служебные клавиши, такие как "Enter", "Esc" и т.д. (нужно доработать DLL, что в ваших силах). Параметр "text" строка, которую надо передать элементу.
"ElementToElement_Bot(webElement, webElement2)" - Проверяет, принадлежит ли элемент элементу. Возвращает Булево.
"TagNameElement_Bot(webElement)" - Получить тэг элемента. Возвращает строку.
"innerTextElement_Bot(webElement)" - Получить "innerText" элемента. Из представления элемента убираются начальные и конечные пробелы. Возвращает строку.
"IsNull(element)" - Проверка, содержит ли переданный объект Null или что-то полезное. Возвращает булево. (Проверка на NULL)
"IsWebElement(element)" - Проверка, содержит ли переданный объект, вэб-элемент фантома. Возвращает булево.
"IsCookie(element)" - Проверка, является ли объект куком. Возвращает булево.
"IsList(element)" - Проверка, является ли объект листом (C#). Возвращает булево.
"GetCountList(element)" - Получить размер массива List. Возвращает число.
"GetObjectList(element, Nomber)" - Получить элемент из списка. Параметр "element" список (обрабатывает любой список). Параметр "Nomber" номер элемента, начинаются с нуля. Возвращает элемент списка. (Если это список Элементов страницы, то вернет элемент страницы, если куки, то вернет кук)
"SetEventBufferDepth(depth)" - Установка размер списка ошибок DLL, который будет передан 1С при окончании работы. По умолчанию там всегда единица, но я выставлял до 1000 и неплохо так получал весь список всех ошибок DLL.
"GetEventBufferDepth()" - Получить текущий размер списка ошибок DLL. Возвращает число.
"CleanBuffer()" - Очистить все ошибки DLL.
"Test(int Param1, int Param2)" - простая проверка на функционирование DLL. (Рундоментальная процедура, которая сохранилась из шаблона ВК)
Рекомендации: Все файлы библиотек "Reliz" должны располагаться в одном каталоге!
1. "AddIn_Test_Bot_Service_001" - проект C#, написан на Microsoft Visual Studio Community 2019 (бери любую последнюю версию)
1.1 В папке "AddIn_Test_Bot_Service_001\Reliz" расположены все скомпилированные библиотеки
AddIn_Bot_NET.dll (AddIn_Bot_NET.pdb, AddIn_Bot_NET.tlb) - библиотека "AddIn.BotNET" для работы с фантомом из 1С.
phantomjs.exe - основной файл фантома, в сущности через остальные библиотеки и идет обращение к этому бинарнику.
Файлы (Ionic.Zip.dll, Newtonsoft.Json.dll, WebDriver.dll, WebDriver.xml), полученные при компиляции проекта и были подгружены автоматически и должны так же присутствовать.
RegAsm.bat - Регистрация библиотеки "AddIn_Bot_NET.dll"
RegAsm_UnInstall.bat - Отмена регистрации библиотеки "AddIn_Bot_NET.dll"
*все файлы должны находиться в одной папке.
2. "Обработка отправки почтовых уведомлений" - Содержит файл обработки "СОГ_РассылкаСообщенийПоРегистру.epf".
Обработка отправляет письма, которые были подготовлены ранее. (написано это отдельной обработкой, т.к. уведомления готовятся и другими обработками, не только при парсинге, а отправка при этом осуществляется по регламентному заданию)
3. "Обработка парсинга страниц" - Содержит файл обработки "СОГ_РассылкаИнформацииС_Сайтов.epf".
Обработка выполняет парсинг указанной страницы сайта на предмет внесения изменений и подготавливает отчет результата сравнения.
Обработка "Автозапуск_NETBot.epf" содержится в макете обработки "СОГ_РассылкаИнформацииС_Сайтов.epf", и при запуске на сервере создается автоматически. (разместил в архиве, для примера)
4. "Расширение для работы обработок" - Содержит файл расширения "РасширениеСпамБОТ.cfe".
Расширение необходимо для работы обработок. Без него обработки не работаю.
Расширение содержит пару регистров сведений и Обработку отправки почтовых сообщений. (Обработка "Обработка отправки почтовых уведомлений", нужна только для запуска отправки сообщений по регламентному заданию и регистрации сообщений)
1. Настройка "Обработка для отправки сообщений".
1.1. Описание.
"Идентификатор отправителя" - это просто текст (36 символов), который бы характеризовал настройку. Отправителей может быть и сотня, и они могут служить для различных целей. И нужно было, как-то разграничить отправителей.
Если указали адрес сервера, то необходимо указать и порт.
Остальные поля и так понятны из картинки.
2. Добавить файл "СОГ_РассылкаСообщенийПоРегистру.epf" в состав дополнительных обработок.
Обработка имеет две команды:
а. Для ручной отправки сообщений
б. Для отправки сообщений через регламентные задания.
2.1 Форма обработки содержит одну кнопку для отправки сообщений вручную (удобно если вы тестируете, и у вас отключены регламентные задания)
3. Добавить файл "СОГ_РассылкаИнформацииС_Сайтов.epf" в состав дополнительных обработок.
Обработка имеет две команды:
а. Для ручной отправки сообщений
б. Для отправки сообщений через регламентные задания.
3.1 Форма обработки
3.2 Настройка обработки "Рассылка информации с сайтов"
3.2.1 Общая Настройка, кнопка "Настройка..."
3.2.1.2 Настройка сервисов
Действия по настройке:
а. Добавить две строчки, при этом настраивать надо строку с идентификатором № 2 (Только эта строка будет использована для парсинга ИТС ресурса)
Идентификатор № 1 используется для сайта нашей компании. (Веб программист не возжелал настроить оповещалку на свой сайт, вот проект и возник)
*Конечно вы скажите "Почему так? Нужно по другому!". Просто: Нет времени, сделал по быстрому.
Колонки сервисов:
1. "Наименование" - Указать любой текст, он нужен только вам для идентификации.
2. "Сервер" - Указать сервер ресурса ИТС: releases.1c.ru
3. "Страница" - Указать страницу логина ИТС: https://login.1c.ru/login?service=https%3A%2F%2Fportal.1c.ru%2Fpublic%2Fsecurity_check
4. "Пользователь" и "Пароль" - Указать логин и пароль на ИТС.
3.2.1.3 Настройка "Настройка..."
Описание полей:
"Время запуска парсинга" - Используется только при использовании обработки по регламентным заданиям. По умолчанию парсинг начинается "20:00" по времени сервера 1С.
"Имя пользователя" и "Пароль пользователя" - Используется только при использовании обработки по регламентным заданиям.
"Идентификатор отправителя" - Если вы используете разных отправителей, то нужно указать нужный. При пустом значении будет использован первый попавшийся отправитель, в соответствии настройке "Отправки почтовых уведомлений" из пункта № 1.1.
3.2.2 Настройка табличной части.
Настройки можно копировать, что бы не заполнять все время одно и тоже. (Заполнить одну строку, а другие просто копировать)
Описание колонок:
а. "О" - Признак того, что данную строку не надо обрабатывать. Попросту отключить из обработки.
б. "У" - Признак того, что данная строка помечена на удаление. И при записи настройки будет удалена из базы.
в. "Наименование" - Рекомендую задавать осмысленное наименование, является так же заголовком e-mail при отправки результата парсинга.
г. "Нужная страница" - Указать адрес страницы (или любой другой ресурса "releases.1c.ru "): https://releases.1c.ru/project/AccountingCorp30
д. "Представление настройки запроса" - Колонка кликабильна, и что бы открыть настройку надо по ней два раза кликнуть.
Откроется форма, в основном все настройки заполнятся по умолчанию.
Вам нужно указать только 4 настройки и 5-тую, пожеланию.
- "Идентификатор сервиса" - 2
- "Время паузы" - 5 или выше, в зависимости от качества связи.
- "Чтение первых строк основной таблицы 'Статьи'" - Рекомендую указать 10, будут считаны последних 10 релизов
- "Обработать количество вложений" - Рекомендую там указать число "10" (можно 3), по умолчанию там неопределно (это означает что будут обработаны все версии обновлений, что бесполезно и ненужно для сайта ИТС)
- Дополнительно, если в параметре "Имя драйвера бота" - указать "ChromeDriver", то вместо 'PhantomJS' будет использован драйвер 'ChromeDriver'. 'ChromeDriver' - подразумевает использование браузера chrom, версии х32. В дистрибутивах выложен драйвер версии 103.0.5060.134.
е. "Представление получателей сообщений" - Указать там список получателей почты. Ячейка кликабильна и открывает форму настройки.
По окончанию ввода настройки, нажмите кнопку "Записать настройки" - все запишется.
Если что-то вам покажется, что работает не так, или лишнее, все настройки хранятся в регистре и доступны из меню "Общие настройки формы". Удалите их и заполните настройку повторно.
Парсинг запускается по кнопке "Обновить информацию с сайтов"
Пользователю предоставится диалог вопроса, выбора варианта обработки.
Если вы выбрали сервер, то работу сервера вам можно будет отследить только по информационной строке.
На форме обработчик ожидания, так что раз в пару секунд система ведет опрос работы сервера, по средством считывания информации из регистра.
При завершении работы на клиенте, вы увидите вот такую форму.
И так вы запустили на клиенте, то вы будете лицезреть приложения от фантома.
В данном случае, количество окон равняется количеству "вкладок" (если выражаться образно)
И в итоге, вот страница, которую мы парсили
Где в табличной части тоже страницы.
В результате мы получим уведомления на почту в виде.
Не пугайтесь, размер письма равен только внесенным изменениям на сайте ИТС, т.е. письма будут небольшие.
Небольшая инструкция по установке - Microsoft Visual Studio Community 2019
Скачать Microsoft Visual Studio Community 2019 можно любой версии. не только от 2019 года
При скачивании "Visual Studio Community", её надо зарегистрировать, иначе вы словите триал на 30 дней.
Регистрация бесплатна и дается на всю вашу трудовую деятельность.
Еще вам потребуется до настроить NuGET.
Нужно в консоле вызвать две команды, в таком самом порядке, как по тексту!:
https://www.nuget.org/packages/Selenium.WebDriver
Install-Package Selenium.WebDriver -Version 3.141.0
https://www.nuget.org/packages/Selenium.WebDriver.PhantomJS.Xplatform/
Install-Package Selenium.WebDriver.PhantomJS.Xplatform -Version 2.45.0.1
При успешной регистрации DLL, у вас будут доступны в обозревателе объектов.
Тестирование проводилось:
Компонента протестирована на базе конфигурации Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.119.9) , релиз 1С:Предприятие 8.3 (8.3.18.1741)
Дополнение:
1. Добавлена возможность использовать драйвер "ChromeDriver".
Смотрите в описание метода "Initialization_Bot(Path_PJS)", пункт № 2
2. Расширена возможность отправки писем для тестового примера.
Список ресурсов, которые помогли мне преодолеть трудности разработки проекта "Спам-Бот"
PhantomJS - Scriptable Headless Browser
Самоучитель по C# для начинающих
#9 Бот для сайта - программирование на C# и Selenium. Автоматизация без окна браузера
Программирование на C# и Selenium WebDriver #1. Первые шаги
ДанныеФормыВЗначение для внешней обработки без Контекста (Комментарий № 22)
Get HTML Source of WebElement in Selenium WebDriver using Python
Использование сборок .NET в 1С 7.x b 8.x. Создание внешних Компонент.