Открыто

[Повтор] Швейцарский нож разработчика ZennoPoster

Тема в разделе "Бизнес и свое дело", создана пользователем shtift, 18 янв 2018.

Цена: 2500р.
Взнос: 2500р.

Список пока что пуст. Запишитесь первым!

Статус обсуждения:
Комментирование ограничено.
  1. 18 янв 2018
    #1
    shtift
    shtift ОргОрганизатор (А)

    [Повтор] Швейцарский нож разработчика ZennoPoster

    [​IMG]


    [​IMG] Отзывы проверяющих


    [​IMG][​IMG][​IMG][​IMG][​IMG]

    [​IMG] Проблемы при создании шаблонов


    В каждом шаблоне ZennoPoster приходится использовать однотипные действия будь то проверка или конвертация данных, которые пользователь указал во входных настройках, или же загрузка страниц и поиск элементов с последующей проверкой были ли они найдены.

    В больших шаблонах все это превращается в нагромождение экшенов или же в простыни однообразного кода, а порой и в комбинацию этих факторов.



    Самые распространенные проблемы
    —————————————————————————————————

    [​IMG] Большой объем однотипного кода
    [​IMG] Плохочитаемый код
    [​IMG] Трудности с поиском и исправлением багов


    Рассмотрим небольшой кусок кода, который загружает страницу Яндекса, вводит поисковой запрос и нажимает кнопку поиска.

    Как это выглядит в коде:

    PHP:
    <?php
    instance.ClearCache();
    instance.ClearCookie();
    
    var tab = instance.ActiveTab;
    tab.Navigate("ya.ru");
    
    if(tab.IsBusy)
    {
        tab.WaitDownloading();
    }
    
    var searchInput = tab.FindElementByXPath("//input", 0);
    if(searchInput.IsVoid)
    {
        throw new Exception("Поле ввода запроса не найдено.");
    }
    
    searchInput.SetValue("test request", "full", false);
    
    var findButton = tab.FindElementByXPath("//button" , 0);
    if(findButton.IsVoid)
    {
        throw new Exception("Кнопка \"Найти\" не найдена");
    }
    
    findButton.Click();
    

    Наверняка подобный код вам знаком. Проверка загрузки страницы, проверка найденных элементов на странице. Все эти рутинные действия есть в каждом шаблоне, работающем с браузером.

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


    PHP:
    <?php
    instance.ClearCacheAndCookie();
    
    var tab = instance.ActiveTab;
    tab.Go("ya.ru").WaitLoading();
    
    tab.GetElementByXpath("//input").ThrowIfNull("Поле ввода запроса не найдено.").SetVal("test request");
    tab.GetElementByXpath("//button").ThrowIfNull("Кнопка \"Найти\" не найдена").Click();
    

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



    [​IMG]

    Продукт складчины состоит из следующего
    —————————————————————————————————

    [​IMG] DLL файл библиотеки ZennoExtensions
    [​IMG] Файлы проекта с исходным кодом для самостоятельного изучения и доработки
    [​IMG] Документация и инструкции по использованию
    [​IMG] Демо шаблоны с примерами использования, открытые для просмотра

    [​IMG] Что представляет из себя библиотека ZennoExtensions?
    ZennoExtensions - DLL библиотека, расширяющая стандартный набор методов классов ZennoPoster. С ее помощью вы сможете разрабатывать шаблоны быстрее, повысить удобство разработки и качество продуктов, улучшить отладку и исправление багов.

    Содержимое
    —————————————————————————————————
    [​IMG] Методы расширения для работы с типами ZennoPoster:
    Instance, Project, Tab, HtmlElement, LocalVariable
    [​IMG] Модуль для работы с аккаунтами
    [​IMG] Модуль для работы с настройками браузера
    [​IMG] Модуль логирования
    [​IMG] Дополнительные классы-помощники

    Ниже будут рассмотрены примеры использования разных частей библиотеки.


    [​IMG]

    Значительный функционал библиотеки представляет из себя набор методов расширения, благодаря чему можно напрямую работать с объектами стандартных классов ZennoPoster'а, не прибегая к созданию экземпляров сторонних классов.

    Большинство из методов расширений в библиотеке реализованы в стиле Fluent Interface.


    Fluent interface или текучий интерфейс — способ реализации объектно-ориентированного API, нацеленный на повышение читабельности исходного кода программы.

    Те, кто работал с LINQ уже знакомы с этим понятием. Методы LINQ возвращают результирующую коллекцию, на которой мы вновь можем использовать методы LINQ:

    list.Select(…).Where(…).Select(…).Where(…) и т.д.

    То есть вызовы методов объединяются в цепочки вызовов. Это и есть Fluent Interface.

    [​IMG] Методы расширения библиотеки

    В библиотеке представлены методы расширения для следующих классов:

    [​IMG] Instance (ZennoLab.CommandCenter.Instance)
    [​IMG] Project (ZennoLab.InterfacesLibrary.ProjectModel.IZennoPosterProjectModel)
    [​IMG] LocalVariable (ZennoLab.InterfacesLibrary.ProjectModel.ILocalVariable)
    [​IMG] Tab (ZennoLab.CommandCenter.Tab)
    [​IMG] HtmlElement (ZennoLab.CommandCenter.HtmlElement)
    [​IMG] Некоторые системные типы


    [​IMG] Проверка входных настроек

    Рассмотрим использование методов расширения на примере проверки входных настроек шаблона.
    Проверка входных настроек при запуске является хорошей практикой разработки шаблона.
    Она несет следующие преимущества:

    [​IMG] Быстрая настройка и запуск шаблона за счет подробных уведомлений в логе
    [​IMG] Устранение багов из-за некорректно введенных данных
    [​IMG] Пользователи смогут понять и исправить свою ошибку во входных настройках не прибегая к вашей помощи

    Принцип проверки состоит в том, чтобы проверять корректность всех введенных в настройках данных. Если какие-то данные введены не правильно, нужно оповестить об этом в логе и прекратить дальнейшее выполнение шаблона.

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


    PHP:
    <?php
    // Указываем чтобы сообщения выводились в лог с восклицательным знаком (Warning)
    Throw.InvokeBeforeExceptionThrowing = args =>
        project.SendWarningToLog(args.Message, true);
    
    project.Variables["AccountsPath"]
        .ThrowIfEmpty("Не указан путь к файлу с аккаунтами.")
        .ThrowIfFileNotExists("Файл с аккаунтами не найден.")
        .ThrowIfTextFileIsEmpty("Файл с аккаунтами пуст.");
    

    Здесь проверяются сразу 3 различных ситуации:
    1. Задал ли вообще пользователь файл с аккаунтами. Если файл задан, переходим ко второму шагу.
    2. Существует ли такой файл. Если файл существует, переходим к третьему шагу.
    3. Есть ли в файле содержимое.
    В случае если какое-то условие не выполнено, будет выведено Warning сообщение в лог и выкинуто исключение (экшн завершится по ветви BadEnd). Сообщение можно не указывать, тогда будет выдано исключение с сообщение по умолчанию. Но ваши сообщения помогут пользователю лучше понять в чем именно проблема.

    А вот как выглядит логика проверки без использования библиотеки.


    PHP:
    <?php
    var path = project.Variables["AccountsPath"].Value;
    
    if (string.IsNullOrWhiteSpace(path))
    {
        project.SendWarningToLog("Не указан путь к файлу с аккаунтами.", true);
        throw new Exception("Не указан путь к файлу с аккаунтами.");
    }
    
    if (!File.Exists(path))
    {
        project.SendWarningToLog("Файл с аккаунтами не найден.", true);
        throw new Exception("Файл с аккаунтами не найден.");
    }
    
    bool fileIsEmpty = new FileInfo(path).Length == 0;
    if (fileIsEmpty)
    {
        project.SendWarningToLog("Файл с аккаунтами пуст.", true);
        throw new Exception("Файл с аккаунтами пуст.");
    }
    

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


    [​IMG]

    [​IMG] Мультилогер


    В библиотеке представлен класс MultiLogger который позволяет удобно логировать в несколько мест одновременно. Одной строчкой кода вы можете записать сообщение в файл, вывести его пользователю в виде MessageBox и в лог ZennoPoster. Также можно добавить в мультилогер свой вариант логирования, например, в БД.

    PHP:
    <?php
    var logger = project.GetLogger();
    
    // Указываем чтобы логировалось одновременно в ZennoPoster и в файл
    logger.LogTo = Logger.ZennoPoster | Logger.File;
    logger.FileLogPath = @"C:\mylog.txt";
    
    logger.MultiLog("Тестовая запись в лог 1");
    logger.MultiLog("Тестовая запись в лог 2", MessageType.Warning);
    

    Класс мультилогера предоставляет возможность логирования в режиме разработки, логи будут писаться только при откладке из ProjectMaker или CodeCreator.
    PHP:
    <?php
    // Сообщение будет выведено только если исполняемой средой является ProjectMaker или CodeCreator
    logger.MultiLogDebug("Тестовая запись в лог");
    

    [​IMG]

    [​IMG] Менеджер аккаунтов


    Практически каждый шаблон выполняет работу с аккаунтами, который предоставляет пользователь. Менеджер аккаунтов призван решить проблемы многопоточной работы со списком аккаунтов, а также позволить закреплять ваши данные за аккаунтами, например, прокси.
    Особенности
    —————————————————————————————————
    [​IMG] Файл аккаунтов не подвергается изменениям
    [​IMG] Для файла аккаунтов создается свой файл конфигурации, в котором содержатся все необходимые данные для последовательного выполнения аккаунтов как при работе в одном, так и в нескольких потоках
    [​IMG] Аккаунты для работы распределяются равномерно - не возникнет такой ситуации, что один аккаунт отработает 10 раз, а другой 15
    [​IMG] Для каждого аккаунта можно сохранять дополнительную информацию


    [​IMG]

    [​IMG] Менеджер браузера


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

    Генерируемые параметры
    —————————————————————————————————
    [​IMG] Используемый браузер (Firefox, Chrome)
    [​IMG] Используемое устройство (на данный момент только Windows)

    [​IMG] Настройки браузера:
    [​IMG] Использование JavaScript
    [​IMG] Блокировка рекламы
    [​IMG] Использование веб хранилищ (LocalStorage, SessionStorage, Global Storage, Database Storage)
    [​IMG] Использование IndexedDB
    [​IMG] Использование WebGL
    [​IMG] Использование плагинов
    [​IMG] DoNotTrack
    [​IMG] Подмена часового пояса
    [​IMG] Эмуляция WebRTC
    [​IMG] Эмуляция Canvas
    [​IMG] Свойства навигатора и HTTP заголовки
    [​IMG] UserAgent
    [​IMG] Language

    PHP:
    <?php
    var profile = BrowserManager.Generate();
    
    // Применение настроек
    BrowserManager.Setup(profile, instance, project);
    
    // Сохранение в файл
    string path = "C:\\1.xml";
    BrowserManager.Save(profile, instance, path);
    
    // Загрузка
    profile = BrowserManager.Load(path);
    


    [​IMG]

    [​IMG] Парсер строк


    Данный класс-помощник позволяет в удобном формате работать с элементами строк. С помощью него можно дать возможность пользователям самостоятельно указывать формат используемых ресурсов. Это добавит гибкости в настройке и избавит от подстраивания используемых файлов под ваш шаблон.

    Например, можно вынести задание формата файла аккаунтов во входные настройки. Тогда пользователю нужно будет указать шаблон, содержащий ключевые слова и используемые разделители:

    Вот так выглядит разбор строки в коде:

    PHP:
    <?php
    var accountString = "12345;wqerty:123.123.123.00:1111";
    
    // Шаблон для разбора строки, можно вынести во входные настройки
    var pattern = "login;password:proxy";
    
    var accountDictionary = ZennoExtensions.Utils.StringParser.Parse(accountString, pattern);
    
    var login = accountDictionary["login"];          // 12345
    var password = accountDictionary["password"];    // wqerty
    var proxy = accountDictionary["proxy"];          // 123.123.123.00:1111
    


    [​IMG]

    Библиотека активно используется и дорабатывается. Участники складчины будут получать обновления бесплатно и смогут вносить предложения по доработке. Помимо самой библиотеки всем участникам будет также доступен проект Visual Studio с исходным кодом, что даст возможность изучать и дорабатывать функционал самостоятельно.


    [​IMG]


    [​IMG] Инструкция по разработке шаблонов через Visual Studio
    [​IMG] Способы подключения библиотек к шаблону без использования ExternalAssemblies
    [​IMG] Список полезных сервисов и инструментов для разработки
    [​IMG] Подборка ссылок на обучающие материалы для самостоятельного изучения
    [​IMG] Способы дополнительного заработка на шаблонах

    Библиотека ориентирована на версию ZennoPoster 5.11.7.0 и выше.
     
    3 пользователям это понравилось.
  2. Последние события

    1. stvlad
      stvlad не участвует.
      14 апр 2024 в 20:17
    2. sazonik
      sazonik не участвует.
      30 дек 2023
    3. sazonik
      sazonik участвует.
      30 дек 2023
    4. stvlad
      stvlad участвует.
      25 май 2021
  3. Обсуждение
  4. 20 янв 2018
    #2
    Flubber
    Flubber ОргОрганизатор (А)
    @shtift может тебе перспективней открыть доступ к предыдущей складчине?
     
  5. 21 янв 2018
    #3
    shtift
    shtift ОргОрганизатор (А)
    Возможно. Подождем еще недельку, а там посмотрим.
     
    1 человеку нравится это.
  6. 29 янв 2018
    #4
    shtift
    shtift ОргОрганизатор (А)
    Бонусы получите.
     
    1 человеку нравится это.
Статус обсуждения:
Комментирование ограничено.

Поделиться этой страницей