Сниппеты C# Zennoposter / Зеннопостер
322 subscribers
3 photos
14 links
Админы:
@cmvvo
@MrSHILY
Download Telegram
Forwarded from 🧬SHILY🧬
Вот так можешь попробовать:
Tab tab = instance.ActiveTab;
if (tab.IsVoid || tab.IsNull) return -1;
// Получаем атрибут "innerText" всех элементов, соответствующих пути "html>body>div>div>div>div>div>h3"
var attributes = ZennoPoster.Parser.ParseByCssSelector(tab, ZennoLab.InterfacesLibrary.Enums.Parser.SourceType.Dom, "html>body>div>div>div>div>div>h3", "innerText", true).ToList();
// Фильтруем элементы
attributes.Filter(ZennoLab.InterfacesLibrary.Enums.Parser.FilterType.None, "");
// Выбираем элементы из диапазона "all"
attributes.Range("all");

//Сейв в переменную с переносом на новую строку (если без переноса, то убери \n)
project.Variables["result"].Value = String.Join("\n", attributes);

//Сейв в список
project.Lists["мой список"].Clear(); // предварительная очистка списка
project.Lists["мой список"].AddRange(attributes);
Forwarded from 🧬SHILY🧬
Ток создай такой список в зенке самой, если что, если нужно в список результат "мой список"
\(.*
- Удалить скобки и всё содержимое в них. Если поставить вместо ( точку, то всё после точки удалится.
project.Variables["result"].Value = Regex.Replace(project.Variables["text"].Value, @"<br></br>.*?", Environment.NewLine);

Замена <br></br> на перенос строки
Forwarded from 🧬SHILY🧬
Я никогда ещё не делал так, но сейчас написал и проверил на своём примере - работает:
//Получаем элемент
(первое совпадение)
HtmlElement _elClick = instance.ActiveTab.FindElementByXPath("//li[@class='serp-item']", 0);

//Проверяем элемент
if (_elClick.IsNull || _elClick.IsVoid) throw new Exception("Элемент не найден, бро");

//Наводим мышкой на элемент
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(_elClick);

//Кликаем по элементу левой клавишей
instance.ActiveTab.FullEmulationMouseClick("left", "click");
А если нужно не нажать на элемент, а вставить текст, то:
_elClick.SetValue("ghj", "Full", true, false);
Forwarded from 🧬SHILY🧬
Это ты меня по обработке ошибки просил:
//Создаем переменную таб и наделяем её магическими свойствами активной вкладки инстанса
Tab tab1 = instance.ActiveTab;

//Инициализируем переменную - счетчик
int _countIterationError = 0;

//Идем на сайт
tab1.Navigate("ya.ru");

//Ожидаем полной загрузки сайта
tab1.WaitDownloading();

/*
Цикл, который будет отробатывать 5-ть раз до ошибки (если быть точным, то упадет в исключение)
Туда можно впихнуть повторый переход на сайт или ещё что-то, всё от задачи зависит кароч.
*/
while (true)
{
//Проверяем урл на "about:blank" (если не равно, то сразу выходим из цикла)
if (tab1.URL != "about:blank") break;

//Таймаут в миллисекундах
Thread.Sleep(1000);

//Чек на количество ошибок (если ошибок больше 5-ти, то выкидывать исключение)
if (++_countIterationError > 5) throw new Exception("Слишком много ошибок");
}
Forwarded from 🧬SHILY🧬
Если тебе что-то конкретное надо, по типу: если "about:blank", то пробовать перейти ещё раз пять на тот же сайт (куда топали изначально), если пять ошибок, то идти на другой сайт, если тоже самое (тоже 5-ть ошибок), то бросать исключение.
Поиск элемента > проверка найден ли элемент > клик на элемент > проверка нажатия кнопки
Forwarded from 🧬SHILY🧬
Вот с чеком, на то, что галочка тыкнулась или нить:
//Номер совпадения
int _numbEl = 0;

//Создаем переменную таб и наделяем её магическими свойствами нашей активной вкладки
Tab ActTab = instance.ActiveTab;
//Получаем элемент
HtmlElement el = ActTab.FindElementByXPath("//ul[@class='attachments ui-sortable ui-sortable-disabled']/li/div", _numbEl);
//Проверяем элемент
if (el.IsNull || el.IsVoid) throw new Exception("Элемент не найден, бро");
//Клик по элементу
el.Click();
//Таймаут 300 миллисекунд
Thread.Sleep(300);
//Проверка клика
if (ActTab.FindElementByXPath("//ul[@class='attachments ui-sortable ui-sortable-disabled']/li/button", _numbEl).Width == -1) throw new Exception("Элемент не отметился, как выбранный");
Парсим DOM и записываем в переменную спарсенное
Forwarded from 🧬SHILY🧬
//Объявляем переменную таб и говорим, что она Мерлин и умеет творить магию
Tab tab = instance.ActiveTab;

//Чек таба на занятость и ожидать полной загрузки, если оно требуется
if (tab.IsBusy) tab.WaitDownloading();

//Парсим распарсиваем дом
string result = Regex.Match(tab.DomText, "(?<=<div\\ id=\"message\"\\ class=\"updated\\ notice\\ notice-success\\ is-dismissible\"><p>).*?(?=\\ <a\\ href=\")").Value;

//Записываем результат в зеновскую переменную, если он не пустота и не пробелы и не нулл
if (!String.IsNullOrWhiteSpace(result)) project.Variables["prov_dom"].Value = result;
Замена текста c#
string text = project.Variables["text"].Value; // переменная с текстом
text = text
.Replace("11", "успешно")
.Replace("22", "успешно2")
.Replace("33", "успешно3")
.Replace("44", "успешно4");
return text;
Переименование файла
Forwarded from 🧬SHILY🧬
//Новое имя файла (просто текст)
string textName = "тополяяя"; // сюда можешь свою переменную присобачить project.Variables["zagolovok_tovara_sparsenniy"].Value вместо текста

//Чекаем имя на наличие бякошных символов
if (!Regex.IsMatch(textName, "\\\\.*?|/.*?|<.*?|>.*?|:.*?|\\*.*?|\\?.*?|\".*?|\\|.*?"))
{
//путь к файлу (который будем перемещать)
string PathFileToMove = project.Directory + @"\ляляля.txt";

//наделяем перменную магическими свойствами для получения данных о файле, который перемещаем
var _f = new FileInfo(PathFileToMove);

//новый путь + имя + расширение
string NewPathFile = _f.DirectoryName + @"\" + textName + _f.Extension;

//перемешаем файл
File.Move(PathFileToMove, NewPathFile);
}
else
{
project.SendWarningToLog("Есть бякошные символы в новом имени для файла: " + textName, true);
}
Forwarded from 🧬SHILY🧬
Такой вариант ещё, где все ошибки обработал:
//Новое имя файла (просто текст)
string textName = "тополяяя";

//путь к файлу (который будем перемещать)
string PathFileToMove = project.Directory + @"\ляляля.txt";

if (File.Exists(PathFileToMove))
{
//Чекаем имя на наличие бякошных символов
if (!Regex.IsMatch(textName, "\\\\.*?|/.*?|<.*?|>.*?|:.*?|\\*.*?|\\?.*?|\".*?|\\|.*?"))
{
//наделяем перменную магическими свойствами для получения данных о файле, который перемещаем
var _f = new FileInfo(PathFileToMove);

//новый путь + имя + расширение
string NewPathFile = _f.DirectoryName + @"\" + textName + _f.Extension;

if (!File.Exists(NewPathFile))
{
//перемешаем файл
File.Move(PathFileToMove, NewPathFile);
}
else
{
project.SendWarningToLog("Файла c таким именем уже существует: " + NewPathFile, true);
}
}
else
{
project.SendWarningToLog("Есть бякошные символы в новом имени для файла: " + textName, true);
}
}
else
{
project.SendWarningToLog("Файла не существует: " + PathFileToMove, true);
}
Проверка, загружено ли то, что спарсено, если нет, то пауза, и так по кругу
do {
if (tab.IsBusy) tab.WaitDownloading();
string result1 = Regex.Match(tab.DomText, "Новая[\\w\\W]*?версию").Value;
if (!String.IsNullOrWhiteSpace(result1)) project.Variables["novaya_tvorcheskaya_studiya"].Value = result1;
}
while (project.Variables["novaya_tvorcheskaya_studiya"].Value != "Новая Творческая студия окончательно сменила классическую версию");
project.SendInfoToLog("Вошли в творческую студию", true);
System.Threading.Thread.Sleep(700);
Присваиваем значение перемменной, исходя из значения другой переменной
Если переменная month нашего проекта будет равна "янв", то результат сниппета будет = 1, если "фев", то результат выполнения сниппета будет = 2 и т.д.
В лучшем виде заменяет switch шаг+установку значения переменой.
return "янв|1,фев|2,март|3,апр|4,май|5,июн|6,июл|7,авг|8,сен|9,окт|10,ноя|11,дек|12".Split(',').First(s=>s.Contains(project.Variables["month"].Value)).Split('|')[1];
Разбиваем строку (т.е. сплитуем) по разделителю | и раскидываю полученные части по переменным.
string acc_full = project.Variables["account_source"].Value;
var account = acc_full.Split('|').ToList();
project.Variables["login"].Value = account[0];
project.Variables["pass"].Value = account[1];
project.Variables["hz"].Value = account[2];
Проверка наличия строки в списке. С учетом регистра и т.д., т.е. текст в переменной и строка списка должны быть идентичны. Если нашлась строка то выводит true, а иначе false.
var list = project.Lists["BlackList"];
string id = project.Variables["id"].Value;
if(list.Contains(id))
{
return "true";
}
else
{
return "false";
}



Проверка другим методом:
// берем из переменной текст, который надо искать
var textContains = project.Variables["listSearchTextContains"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["SourceList"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
for(int i=0; i < sourceList.Count; i++)
{
// читаем строку из списка
var str = sourceList[i];
// проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
if (str.Contains(textContains))
return "yes";
}
}
// если ничего не нашли возвращаем "no"
return "no";
Вернуть номер потока:
string thread = Thread.CurrentThread.ManagedThreadId.ToString();