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

Статус
В этой теме нельзя размещать новые ответы.
VkurseBot

VkurseBot

Модератор
20 Сен 2020
0
640
50
Голосов: 0
#1
[​IMG]


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


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

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


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

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



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

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


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

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

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:
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:
// Указываем чтобы сообщения выводились в лог с восклицательным знаком (Warning)
Throw.InvokeBeforeExceptionThrowing args =>
    
project.SendWarningToLog(args.Messagetrue);

project.Variables["AccountsPath"]
    .
ThrowIfEmpty("Не указан путь к файлу с аккаунтами.")
    .
ThrowIfFileNotExists("Файл с аккаунтами не найден.")
    .
ThrowIfTextFileIsEmpty("Файл с аккаунтами пуст.");

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

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


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:
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:
// Сообщение будет выведено только если исполняемой средой является 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:
var profile BrowserManager.Generate();

// Применение настроек
BrowserManager.Setup(profileinstanceproject);

// Сохранение в файл
string path "C:\\1.xml";
BrowserManager.Save(profileinstancepath);

// Загрузка
profile BrowserManager.Load(path);


[​IMG]

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


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

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

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

PHP:
var accountString "12345;wqerty:123.123.123.00:1111";

// Шаблон для разбора строки, можно вынести во входные настройки
var pattern "login;password:proxy";

var 
accountDictionary ZennoExtensions.Utils.StringParser.Parse(accountStringpattern);

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 и выше.
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.

О нас

Слив платных курсов - скачать бесплатно

На форуме мы делимся сливами популярных курсов в различных областях знаний! Если вы хотите повысить свою профессиональную квалификацию, но не хотите тратить много на курсы, то вы попали по адресу.

VKURSE.INFO регулярно публикует:

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

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

Быстрая навигация

Меню пользователя