Zennoposter: полезные C# сниппеты

Сниппеты — это блоки кода позволяющие расширить функционал ZennoPoster и решающие некоторую задачу или группу задач в вашем проекте. В основном используется язык программирования — C#. Поэтому код нужно оформлять в соответствии с синтаксисом этого языка.

При использовании C# сниппетов вам доступны все возможности языка C#. C# включет в себя обширную библиотеку классов и методов которая покрывает большинство задач которые могут у вас возникнуть. С описанием и возможностями классов библиотеки вы можете ознакомиться на странице http://msdn.microsoft.com/ru-ru/library/gg145045(v=vs.110).aspx

Поиск-замена через снипет на C#

(в примере получаем ид акккаунта от профильной ссылки facebook)

string Test = project.Variables["urlprofile"].Value;
string regexTest = System.Text.RegularExpressions.Regex.Replace(Test, @"https\:|www\.|fb|facebook\.com|/.*?\=|\?.*?$", "");
return regexTest;

Отключение в шаблоне zennoposter ненужных css, ActiveX, Javascript и т.д.

уберите // чтобы раскомментировать

instance.ClearCookie();
instance.ClearCache();
//instance.LoadPictures = false;
//instance.AllowPopUp = true;
//instance.DownloadActiveX = false;
//instance.DownloadFrame = false;
//instance.DownloadVideos = false;
//instance.IgnoreAdditionalRequests = true;
//instance.IgnoreAjaxRequests = true;
//instance.IgnoreFlashRequests = true;
//instance.IgnoreFrameRequests = true;
//instance.RunActiveX = false;
//instance.UseJavaApplets = false;
//instance.UseJavaScripts = true;
//instance.UsePlugins = false;
//instance.UseCSS = false;
//instance.BackGroundSoundsPlay = false;
//instance.UseMedia = false;

Увеличение регистра первой буквы

var str = project.Variables["myString"].Value;
if (str.Length > 1) return char.ToUpper(str[0]) + str.Substring(1);
return str.ToUpper();

Увеличение регистра первой буквы через снипет JS

function ucfirst(str) 
{
var first = str.charAt(0).toUpperCase();
return first + str.substr(1);
}
ucfirst('hello world');

Увеличение регистра первой буквы через старенький макрос от 3 версии

(справка https://help.zennolab.com/ru/v3/zennoposter/)

{-String.ToUpper-|-test string-|-0-}

Проверка наличия через снипет

// берем из переменной текст, который надо искать
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";

Время компьютера в секундах через снипет C#

return TimeSpan.Parse(DateTime.Now.TimeOfDay.ToString()).TotalSeconds;

Оптимизация и ускорение шаблона можно засчет отключения css и/или картинок — но еще вариант ожидание появление элемента

http://zennolab.com/discussion/threads/progruzka-stranicy-i-ehlementov-na-stranice.10529/#post-62000 — тут подробное описане

HtmlElement he;
for(int i=0; i<20; i++)
{
he = instance.ActiveTab.FindElementByAttribute("Your data in parameters");
if(!he.IsVoid)
{
break;
}
System.Threading.Thread.Sleep(2000);
}

Проверка наличия текста в списке, при отсутствии добавить

// берем из переменной текст, который надо искать
var textContains = project.Variables["Text"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["Список"];
// ищем в каждой строчке в списке
lock (SyncObjects.ListSyncer)
{
    for (int i = 0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение, возвращаем "no"
        if (str.Contains(textContains))
            return "no";
            //return null; // если раскомментировать эту строку, а предыдущую закомментировать (или удалить), выход будет по красной ветке (как вариант)
    }
}
// если нет совпадений, добавляем строку в список
sourceList.Add(textContains);

Удаление пустых строк в .txt

// Delete blank lines from file
string path = project.Variables["filePath"].Value; // Gets file path from your project variable with name "filePath"
var lines = System.IO.File.ReadAllLines(path).Where(arg => !string.IsNullOrWhiteSpace(arg));
System.IO.File.WriteAllLines(path, lines);
return 0;

Домен из ссылки

// Get root domain
var url = project.Variables["url"].Value;
return new Uri(url).Host;

Число слов в тексте разделяемых пробелом

// Count words in string
var inputstring = project.Variables["text"].Value;
string texttostring = (inputstring);
int count = texttostring.Split(' ').Length;
return count;

Число символов и букв в тексте

// Count characters
string stringToCount = "Hello World";
return stringToCount.Length.ToString();

// или такой вариант
string str = project.Variables["Var"].Value;
return str.Length;

Преобразование дата Март 30, 2016 в 30.03.2016

string date = project.Variables["Date"].Value;
DateTime formatDate;
DateTime.TryParse(date, out formatDate);
return formatDate.ToString("dd.MM.yyyy");

Определение возраста от даты рождения

string day = "04";
string month = "11";
string year = "1982";
 
var birhDate = DateTime.ParseExact(String.Format("{0}.{1}.{2}",day,month,year), "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
var age = Math.Truncate(DateTime.Now.Subtract(birhDate).TotalDays / 365);
return age;

Взять source по ссылке не используя броузер

List list = new List();
 
var resultHttpGet = ZennoPoster.HttpGet("https://www.yandex.ru/", instance.GetProxy(), "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,30000,"","",true,1,new string[] {""},"");
if (String.IsNullOrEmpty(resultHttpGet))
    throw new Exception("не смогли загрузить страницу");
 
var matches = Regex.Matches(resultHttpGet,@"[\wа-я]+").Cast().Select(match => match.Value).ToList();;
return string.Join("\r\n",matches);

Замена первого вхождения или другого указанного в снипете

var text = "1123123123"; //строка в которой будет вестись поиск
var regex = new Regex("\\d{2}"); // экземпляр регулярного выражения
var replacement = "yep"; //замена
var startat = 2; //порядковый номер найденого регулярного выражения, начинается с 1
var rcount = 1; //количество замен
if(!(startat > 0 && rcount > 0)) //проверяем
    throw new Exception("условия поиска заданы неверно");
var matches = regex.Matches(text); //сначала ищем
if(matches.Count < startat) //проверяем
    throw new Exception("найденое количество совпадений меньше указаного индекса");
return regex.Replace(text, replacement, rcount, matches[startat].Index);

Уникальный заголовок инстанса

instance.AddToTitle("Заголовок!");

Преобразовать цифры с буквами 1.4k в нормальные 1400

string str = project.Variables["text"].Value;
if (!str.Contains("k")) return str;
return double.Parse(str.Replace(".", ",").Replace("k", "")) * 1000;

Взятие первой строки списка с удалением и последующим добавлением в конец списка (по круговой)

var ProxyList = project.Lists["Список 1"];
lock(SyncObjects.ListSyncer)
{
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}

Случайное число от до в переменную

Random num = new Random();
project.Variables["Переменная"].Value = num.Next(10,20).ToString();

Заглавная первая буква

string str = project.Variables["имя_переменной"].Value;
return str[0].ToString().ToUpper() + str.Substring(1);

Проверка содержания текста

string str = project.Variables["Text"].Value;
string text = "текст";
 
if (!str.Contains(text))
    return "Переменная не содержит текст!";

Округление цифр в большую сторону

double num = double.Parse(project.Variables["Num"].Value);
return Math.Ceiling(num / 1000) * 1000; // округлить число в большую сторону
//return Math.Round(num / 1000) * 1000; // округлить число до ближайшего целого

Умножение переменной «а»

float a = float.Parse(project.Variables["var"].Value.Replace(".", ","));
project.Variables["min"].Value = Convert.ToString(a * 0.95).Replace(",", ".");
project.Variables["max"].Value = Convert.ToString(a * 1.05).Replace(",", ".");

Пример использования xpath в c#

var x = instance.ActiveTab.FindElementByXPath("//*[@id='login-form']/div[3]/div[4]", 0);
x.Click();

Тройной клик по координатам

// клик по координатам
instance.ActiveTab.MouseClick(100, 100, "left", "click");
// пауза в мс
System.Threading.Thread.Sleep(500);
// клик по координатам
instance.ActiveTab.MouseClick(100, 100, "left", "click");
// пауза в мс
System.Threading.Thread.Sleep(500);
// клик по координатам
instance.ActiveTab.MouseClick(100, 100, "left", "click");

Отсчет от 000 до 100, когда идет 001…019 и т.д.

return int.Parse(project.Variables["count"].Value).ToString("000");

Имя компьютера в зеннопостер через c#

string UserNameComp = System.Environment.UserName;
return UserNameComp;

Выборка самого наименьшего числа из строки, в примере результат будет 124.99

string[] str = "125.53/124.99/432.78/567.99".Split('/');
 
var list = new List();
list.AddRange(str.OrderBy(s=>s.Length).ThenBy(s=>s).ToList());
project.Variables["Otvet"].Value = list[0];

Проверка содержимого из списка1 в списке2, входящее совпадение:

если есть в списке 2 строки, которые равняются строкам из списка 1, то он удаляет эти строки в списке 2. Вопрос, как можно сделать так, что бы код проверял не полное соответствие строк, а частичное содержание символов в этих строках и если символы из списка 1 содержаться в строках из списка 2, то удалить полностью эти строки из списка 2. Объедините содержимое первого списка через | потом Операции над списком — Удалить строки, соответствующие регулярному выражению и там укажите свою переменную.

//Списки проекта
var baseEmails = project.Lists["baseEmails"];
var blackList = project.Lists["blackList"];
// проверяем каждую строку
//Лочим для многопотока
lock(SyncObjects.ListSyncer)
{
    foreach(string s in blackList)
{
  //Ищем в основном списке
  for(int i = 0; i < baseEmails.Count; i++)
  {
   //Если нашли, удаляем
    string check = baseEmails[i];
   if(check.Contains(s))
    baseEmails.RemoveAt(i);
  }
}
}

Проверка наличия в списке (быстрый метод)

var list = project.Lists["Blacklist"];
string text = project.Variables["ПЕРЕМЕННАЯ С ТЕКСТОМ КОТОРЫЙ ИЩЕМ"].Value;
if (list.Contains(text)) {
   return "Найдено в блеклисте";
}

Проверка наличия в списке, метод №2

//да - по зелёной
//нет - по красной
return project.Lists["SourceList"].First(s=>s.Contains(project.Variables["Url"].Value));

Дата на 3 дня назад

DateTime date = DateTime.Now.AddDays(-3);
return date.ToString("yyyy-MM-dd");

Дата на день назад — проверка

DateTime dt = DateTime.Parse(project.Variables["Переменная1"]); // или DateTime.Parse("02.09.2018"); // Заданное время
DateTime now = DateTime.Now; // Текущее время
var days = (now - dt).Days; // Разница в днях (31)
 
if (days>30)
{
   return "Прошло больше 30 дней";
}
else
{
  return "Еще есть время";
}

Дата, время на 12 часов назад — проверка

DateTime dt = DateTime.Parse("19:00 02.12.2018"); // Заданное время
DateTime now = DateTime.Now; // Текущее время
TimeSpan diff = now - dt; // разница
var Hours = Math.Floor(diff.TotalHours); // переводим разницу в округленные часы
 
if (Hours>12)
{
   return "Прошло больше 12 часов (прошло " + Hours + " часов)";
}
else
{
  return "Еще есть время (прошло " + Hours + " часов)";
}

От настоящего времени -2 часа назад

return DateTime.Now.AddHours(-2).ToString(@"dd.MM.yyyy HH:mm:ss");

Проверить C# в онлайн http://www.tutorialspoint.com/compile_csharp_online.php