Закрыто

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

Тема в разделе "Бизнес и свое дело", создана пользователем shtift, 16 дек 2017.

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

Основной список: 29 участников

Резервный список: 1 участников

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

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

    [​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] Способы дополнительного заработка на шаблонах

    Для ЧК: подпись + 3 рекламных сообщения в смежных темах
    Для складчиков: 5 рекламных сообщений в смежных темах
    Соблюдайте правила клуба при отправке рекламных сообщений.

    Библиотека ориентирована на версию ZennoPoster 5.10.6.0 и выше.
     
    Последнее редактирование модератором: 9 янв 2018
    14 пользователям это понравилось.
  2. Последние события

    1. skladchik.com
      Складчина закрыта.
      31 мар 2022
    2. Padovan
      Padovan участвует.
      28 мар 2020
    3. Frodo
      Frodo участвует.
      20 июл 2019
    4. Ashkeron
      Ashkeron участвует.
      22 дек 2018

    Последние важные события

    1. skladchik.com
      Складчина закрыта.
      31 мар 2022
    2. skladchik.com
      Складчина доступна.
      29 янв 2018
    3. skladchik.com
      Складчина закрыта.
      16 янв 2018
    4. skladchik.com
      Складчина доступна.
      14 янв 2018
  3. Обсуждение
  4. 16 дек 2017
    #2
    Ragnar Lodbrok
    Ragnar Lodbrok АдминАдминистратор Команда форума
    @shtift
     
    1 человеку нравится это.
  5. 16 дек 2017
    #3
    shtift
    shtift ОргОрганизатор (А)
    1 человеку нравится это.
  6. 16 дек 2017
    #4
    RoyalBank
    RoyalBank ОргОрганизатор (А)
    @shtift, отдельный лайк за оформление, приятно читать.
    Могу взять на проверку, если необходим проверяющий.
     
    2 пользователям это понравилось.
  7. 16 дек 2017
    #5
    shtift
    shtift ОргОрганизатор (А)
    Спасибо, приятно слышать. Проверяющие нужны, отписал в ЛС.
     
    1 человеку нравится это.
  8. 16 дек 2017
    #6
    kapelan28
    kapelan28 ЧКЧлен клуба (А)
    библиотеку можно будет использовать в своих проектах на продажу? (ограничений на это не будет?)
    и второй момент - инструкция по каждой доступной функции в библиотеке будет? (не получится, как у Сибборы - библиотека есть, а файл с инструкцией от устаревшей версии?)
     
  9. 16 дек 2017
    #7
    shtift
    shtift ОргОрганизатор (А)
    Ограничение на использование никаких не будет. Более того, т.к. доступны исходники вы можете перекроить библиотеку как пожелаете. Инструкция уже есть в виде сайта. Надеюсь, что администрация разрешит выдать её участникам складчины в такой форме, т.к. это как раз-таки решает проблему "устаревания" документации. Ну а если не разрешат, то буду выпускать обновления документации вместе с обновлением библиотеки.
     
    2 пользователям это понравилось.
  10. 16 дек 2017
    #8
    Basill
    Basill ОргОрганизатор (А)
    Какие знание нужны для понимания DLL?
     
  11. 16 дек 2017
    #9
    shtift
    shtift ОргОрганизатор (А)
    Базовые знания C# и основы написания шаблонов ZP кодом.
     
  12. 16 дек 2017
    #10
    Mr-Grey
    Mr-Grey ОргОрганизатор (А)
    Проще сделать оффлайн журнал. То есть выкачать сайт. или сделать на мюс его. Ссылки не будет однозначно.
     
  13. 16 дек 2017
    #11
    shtift
    shtift ОргОрганизатор (А)
    Тогда при обновлении функционала библиотеки придется выпускать новый журнал с обновлениями. Да и сайт в целом удобнее в использовании, чем оффлайн документация.
     
  14. 16 дек 2017
    #12
    Mr-Grey
    Mr-Grey ОргОрганизатор (А)
    Достаточно просто сообщать о текущих обновления в ветке обновлений. Самую инструкцию можно делать и в пдф. В любом случае как угодно, но не сайт.
     
  15. 16 дек 2017
    #13
    Sharoun
    Sharoun МодерМодератор Команда форума
    @shtift по поводу проверки написал в личку
     
    1 человеку нравится это.
  16. 17 дек 2017
    #14
    InnaStepanova
    InnaStepanova ЧКЧлен клуба
    Тема интересная, цена адекватная! Но "
    [​IMG]Бонусы будут выданы при выполнении следующих условий
    Для ЧК: подпись + 3 рекламных сообщения в смежных темах"! Не много ли рекламы стало в клубе? Раньше сообщения в темах были по теме, а сейчас ....Поэтому записалась бы в складчину при условии только подписи! А так - удачи в проведении без меня! Я к тому, что если думается, что так будет больше участников, то я думаю, что будет меньше! Многих это отпугнет! Я так думаю!!!!!
     
    2 пользователям это понравилось.
  17. 17 дек 2017
    #15
    shtift
    shtift ОргОрганизатор (А)
    Есть продукт, который получат все участники складчины, и есть дополнительные плюшки для тех, кто помог с рекламой складчины. Как это может кого-то отпугнуть, честно говоря, мне не ясно.
     
    1 человеку нравится это.
  18. 17 дек 2017
    #16
    Mousse
    Mousse ЧКЧлен клуба
    Конечно автор имеет полное право..

    Однако я заметила что: для ЧК ставить рекламу в подпись — самая эффективная реклама; Складчик — пробежаться по смежным темам.

    На то он и ЧК и Складчик сможет внести свой равнозначный вклад. :)
     
    1 человеку нравится это.
  19. 17 дек 2017
    #17
    Авраам Линкольн
    Авраам Линкольн ДолжникДолжник
    @analytic,
     
    1 человеку нравится это.
  20. 17 дек 2017
    #18
    analytic
    analytic ОргОрганизатор (А)
    Вопросы следующие...
    1) использование плагинов - только снимок текущего Firefox?
    2) Эмуляция WebRtc - что показывает? Генерируется только локальный IP или также Ipv6(если есть) и (ipv4)
    3) Useragent PHP и Useragent js - совпадают?

    п.с. а что если я вам скажу , что ваши подмены определяются на уровне рукописных скриптов=) Хотите битву технологий? - дайте мне материал на проверку и скажу по какому количеству параметров обычный вебмастер определит - что вы бот (всё будет в отзыве с доказательной базой) ;)
     
    Последнее редактирование модератором: 17 дек 2017
    3 пользователям это понравилось.
  21. 17 дек 2017
    #19
    InnaStepanova
    InnaStepanova ЧКЧлен клуба
    По мне лучше продукт с бонусами - или ни чего! С получением по таким условиям Бонусов заморачиваться не буду - значит второе! Вот такая логика!
    А чего не написали типа так: Для ЧК: подпись + 10 рекламных сообщения в смежных темах!??? Наверное много было бы рекламы? Или должен быть предел?
    Если должен - значит для меня предел: Для ЧК: подпись!
     
    1 человеку нравится это.
  22. 17 дек 2017
    #20
    shtift
    shtift ОргОрганизатор (А)
    Для начала проясню, что такое менеджер браузера, чтобы убедиться, что мы понимаем под этим названием одно и то же.
    Я не позиционирую его как супер-пупер-антифингерпринт. Менеджер браузера представляет из себя обертку над методами ZennoPoster, которые позволяют изменять характеристики браузера. Все это приведено в гораздо более удобную форму, чем в зенке по дефолту. Все.

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

    P.S. Я имею некоторое представление о веб-разработке и знаю, что достаточно вызывать JS-функцию, которая реализована, например, только в Firefox, чтобы убедиться, что хром, за который вы выдаете себя, вовсе не является хромом. Только эту претензию вы можете высказать сразу разработчикам зенки, минуя меня. Ибо, повторюсь, менеджер браузера не позиционируется как антифингерпринт и меняет конфигурацию браузера через методы зенки.

    По поводу проверяющего, хоть я и без того уже договорился с 5-ю людьми. Чтобы не произвести впечатление, что я чего-то опасаюсь или толкаю пустышку, могу предоставить на проверку и вам. :D
     
    2 пользователям это понравилось.
Статус обсуждения:
Комментирование ограничено.