Перейти к содержимому














Фотография
Скачать

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



  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 trex

trex
  • Сливапер LVL 7
  • Сообщений: 488
  • Регистрация: 22.07.2014
  • Заработано: 1 471 руб.
Репутация: 2 593

Награды: 26

  
  
  
  
  
  
  
  

Отправлено 07 Май 2018 - 10:09

*
Мегаслив!

930f2a068912.jpg

 

21518542733a.jpg Проблемы при создании шаблонов

 

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

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

 

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

 

dbbb60e1a195.jpgБольшой объем однотипного кода

dbbb60e1a195.jpgПлохочитаемый код
dbbb60e1a195.jpgТрудности с поиском и исправлением багов

 

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

 

 

 

Примечание: здесь и далее приведенный код написан на языке C#.
Блоки кода PHP используются только для подсветки синтаксиса ввиду отсутствия блоков C#.

Как это выглядит в коде: Обычный код
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();

 

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

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

 

Код с использованием библиотеки
instance.ClearCacheAndCookie();

var tab = instance.ActiveTab;
tab.Go("ya.ru").WaitLoading();

tab.GetElementByXpath("//input").ThrowIfNull("Поле ввода запроса не найдено.").SetVal("test request");
tab.GetElementByXpath("//button").ThrowIfNull("Кнопка \"Найти\" не найдена").Click();

 

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

 

c0324ae686b5.jpg

 

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

 

- DLL файл библиотеки ZennoExtensions

 

- Файлы проекта с исходным кодом для самостоятельного изучения и доработки

- Документация и инструкции по использованию

- Демо шаблоны с примерами использования, открытые для просмотра

 

21518542733a.jpg Что представляет из себя библиотека ZennoExtensions?

 

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


Содержимое

 

- Методы расширения для работы с типами ZennoPoster:

Instance, Project, Tab, HtmlElement, LocalVariable
 

- Модуль для работы с аккаунтами

 

- Модуль для работы с настройками браузера

- Модуль логирования

- Дополнительные классы-помощники

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

 

9c1b58fe2dd0.jpg

 

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

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

 

 

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

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

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

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

 

21518542733a.jpg Методы расширения библиотеки

 

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


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

 

21518542733a.jpg Проверка входных настроек

 

Рассмотрим использование методов расширения на примере проверки входных настроек шаблона.



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

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

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

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

 

Пример кода:
// Указываем чтобы сообщения выводились в лог с восклицательным знаком (Warning)
Throw.InvokeBeforeExceptionThrowing = args =>
project.SendWarningToLog(args.Message, true);

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

 

Здесь проверяются сразу 3 различных ситуации:

  1. Задал ли вообще пользователь файл с аккаунтами. Если файл задан, переходим ко второму шагу.
  2. Существует ли такой файл. Если файл существует, переходим к третьему шагу.
  3. Есть ли в файле содержимое.

В случае если какое-то условие не выполнено, будет выведено Warning сообщение в лог и выкинуто исключение (экшн завершится по ветви BadEnd). Сообщение можно не указывать, тогда будет выдано исключение с сообщение по умолчанию. Но ваши сообщения помогут пользователю лучше понять в чем именно проблема.

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

 

Пример кода:
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 раза больше, читаемость кода хуже, а если понадобится проверить еще несколько переменных, то проверка и вовсе станет огромной. К тому же поддерживать такой код будет сложнее - если вы захотите изменить логирование, придется менять его во всех местах.

 

8e28ee276d50.jpg

 

21518542733a.jpg Мультилогер

 

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

 

Пример кода:
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.

 

 

 

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

 

55a9dd0f52e0.jpg

 

21518542733a.jpg Менеджер аккаунтов

 

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

Особенности
—————————————————————————————————

- Файл аккаунтов не подвергается изменениям
- Для файла аккаунтов создается свой файл конфигурации, в котором содержатся все необходимые данные для последовательного выполнения аккаунтов как при работе в одном, так и в нескольких потоках
- Аккаунты для работы распределяются равномерно - не возникнет такой ситуации, что один аккаунт отработает 10 раз, а другой 15
- Для каждого аккаунта можно сохранять дополнительную информацию

 

f425a3b485fd.jpg

 

 

21518542733a.jpg Менеджер браузера

 

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


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

- Использование JavaScript
- Блокировка рекламы
- Использование веб хранилищ (LocalStorage, SessionStorage, Global Storage, Database Storage)
- Использование IndexedDB
- Использование WebGL
- Использование плагинов
- DoNotTrack
- Подмена часового пояса
- Эмуляция WebRTC
- Эмуляция Canvas
- Свойства навигатора и HTTP заголовки
- UserAgent
- Language
 
Пример кода:
var profile = BrowserManager.Generate();

// Применение настроек
BrowserManager.Setup(profile, instance, project);

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

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

 

74eaa65e418c.jpg

 

21518542733a.jpg Парсер строк

 

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

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

 

login;password:proxy

 

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

 

Пример кода:
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

 

6b52aa234768.jpg

 

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

 

87144dd39cf3.jpg

 

 Инструкция по разработке шаблонов через Visual Studio

 Способы подключения библиотек к шаблону без использования ExternalAssemblies
 Список полезных сервисов и инструментов для разработки
 Подборка ссылок на обучающие материалы для самостоятельного изучения
 Способы дополнительного заработка на шаблонах

 

Продажник:

Скрытый контент:

  Для просмотра содержимого необходимо 1 очков репутации (вам не хватает 1)

 Скачать без ограничений   Купить этот материал за 390 руб.

 

Скачать:

Скрытый контент:

  Для просмотра содержимого необходимо 101 очков репутации (вам не хватает 101)

 Скачать без ограничений   Купить этот материал за 390 руб.


Сообщение отредактировал William Drake: 08 Май 2018 - 14:51


🔔 Подпишись на наш канал telegram @slivup_live и бота @kurs_slivup, что бы следить за крутыми новинками форума

  • 23

#2 doca

doca
  • Platinum
  • Сообщений: 346
  • Регистрация: 16.08.2016
  • Заработано: 40 руб.
Репутация: 66

Награды: 20

  
  
  
  
  
  
  
  

Отправлено 07 Май 2018 - 13:12

Я правильно понимаю, что здесь zennopost сломанная? и какие-то на ней есть ограничения?


  • 0

#3 evgen_sorgin

evgen_sorgin
  • Platinum
  • Сообщений: 206
  • Регистрация: 15.10.2014
  • Заработано: 15 руб.
Репутация: 253

Награды: 22

  
  
  
  
  
  
  
  

Отправлено 07 Май 2018 - 13:20

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


  • 0

#4 doca

doca
  • Platinum
  • Сообщений: 346
  • Регистрация: 16.08.2016
  • Заработано: 40 руб.
Репутация: 66

Награды: 20

  
  
  
  
  
  
  
  

Отправлено 07 Май 2018 - 13:40

Да извиняюсь, уже увидел что в папке zenno только dll лежат.


  • 0

#5 RusZarj

RusZarj
  • Сливапер LVL 6
  • Сообщений: 1 398
  • Регистрация: 27.01.2014
  • Заработано: 102 руб.
Репутация: 754

Награды: 24

  
  
  
  
  
  
  
  

Отправлено 10 Май 2018 - 18:08

У этой библиотеки не работает метод 
account.SaveChanges(); // Обновляем файл конфигурации.

Так что его можете не тыкать)
НО! После account.Release(); изменения автоматом записываются в конфиг базы аккаунтов.

Всё остальное работает как заявлено (если я сам случайно не пропустил)

trex,  Обновления будут со складчика?


  • 0

#6 trex

trex
  • Сливапер LVL 7
  • Сообщений: 488
  • Регистрация: 22.07.2014
  • Заработано: 1 471 руб.
Репутация: 2 593

Награды: 26

  
  
  
  
  
  
  
  

Отправлено 10 Май 2018 - 19:55

RusZarj, Возможно


  • 2

#7 RusZarj

RusZarj
  • Сливапер LVL 6
  • Сообщений: 1 398
  • Регистрация: 27.01.2014
  • Заработано: 102 руб.
Репутация: 754

Награды: 24

  
  
  
  
  
  
  
  

Отправлено 17 Июнь 2018 - 08:04

trex, привет! Обнов не было?


  • 0

#8 trex

trex
  • Сливапер LVL 7
  • Сообщений: 488
  • Регистрация: 22.07.2014
  • Заработано: 1 471 руб.
Репутация: 2 593

Награды: 26

  
  
  
  
  
  
  
  

Отправлено 17 Июнь 2018 - 10:11

RusZarj, Обнов не будет. Я за темой не слежу и доступа нет к обновам.


  • 0

#9 SlivUp_08

SlivUp_08
  • Сливапер LVL 7
  • Сообщений: 934
  • Регистрация: 26.04.2014
  • Заработано: 836 руб.
Репутация: 2 512

Награды: 27

  
  
  
  
  
  
  
  

Отправлено 30 Август 2018 - 00:18

Скрытый контент:

  Для просмотра содержимого необходимо 101 очков репутации (вам не хватает 101)

 Скачать без ограничений   Купить этот материал за 390 руб.


  • 3

#10 Delirium

Delirium
  • Platinum
  • Сообщений: 2
  • Регистрация: 11.03.2016
  • Заработано: 0 руб.
Репутация: 0

Награды: 15

  
  
  
  
  
  
  
  

Отправлено 15 Апрель 2020 - 21:35

trex, прошу обновить ссылку, а так же делаю запрос на восстановление в специальном разделе.
  • 0

#11 OXAS

OXAS
  • Сливапер LVL 7
  • Сообщений: 11 464
  • Регистрация: 08.01.2015
  • Заработано: 19 549 руб.
Репутация: 18 833

Награды: 53

  
  
  
  
  
  
  
  

Отправлено 15 Апрель 2020 - 21:36

Delirium,

Скрытый контент:
    Необходимо написать 1 полезных сообщений (вам не хватает 1)

 Скачать без ограничений   Купить этот материал за 390 руб.


  • 0

#12 igz

igz
  • Platinum
  • Сообщений: 1 572
  • Регистрация: 11.05.2014
  • Заработано: 123 руб.
Репутация: 301

Награды: 33

  
  
  
  
  
  
  
  

Отправлено 24 Июнь 2022 - 15:19

Обновите плиз


  • 0



Похожие темы Collapse

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

×

Зарегистрируйся моментально!