Сниппеты — это блоки кода позволяющие расширить функционал 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
С# сниппет: получение имени файла с раширением из пути
var path = @project.Variables["Variable"].Value;;
string name = Path.GetFileName(path);
return name;
Как закодировать в base64 С# сниппет:
string str = project.Variables["text"].Value;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(str));
Как декодировать из base64:
var key = project.ExecuteMacro(@"{-Variable.Base64-}");
var input = @"{-Variable.Base64-}";
var text = Encoding.Default.GetString(Convert.FromBase64String(input));
project.SendInfoToLog(text);
return text;
Замена специальных символов HTML
string y = project.Variables ["jobDescription"]. Value;
string result = System.Net.WebUtility.HtmlDecode (y);
return result;
C# сниппеты выбраны мной из форума https://zennolab.com/discussion/
Не нашли нужный сниппет? Гляньте тут ещё: https://github.com/ZennoHelpers/Snippets/tree/master/%D0%A1%D0%BD%D0%B8%D0%BF%D0%BF%D0%B5%D1%82%D1%8B