http://zennolab.com/discussion/threads/snipety-ot-a-do-ja.13515/
Intro
Эта статья о снипетах на языке С# (Си шарп). Статья ориентирована на тех пользователей, которые слышали о его поддержке в ZennoPoster, но их пугало слово программирование и им казалось что это сложно. В этой статье не будет акцента на углубление в изучении языка C#. В этой статье акцент на тех базовых возможностях языка которые собственно и достаточно знать для решения большинства задач с которыми Вы сталкиваетесь при каждом новом проекте для ZennoPoster. Только в первом блоке мы затронем немного теории и понятий которые нельзя не затронуть. Только самое используемое из личного опыта.
Типы данных
Язык C# - язык со строгой типизацией. Любые данные имеют некий тип, и этот тип нужно указывать.
На схеме мы видим множество типов, но только с несколькими из них Вы будете сталкиваться в 90% случаев при написании проектов.
Синтаксис оформления переменных:
тип имя = значение;
Основные типы которых будет достаточно знать.
Тип string - имеет свойство Length которое вернет число знаков в строке.
Массивы
Массивы - коллекция (данных)переменных одного типа с общим именем, и доступом к ним по их числовому индексу. Массивы бывают одномерные, многомерные и ступенчатые. Достаточно знать одномерных массивов.
Синтаксис оформления одномерных массивов:
тип[] имя;
тип[] имя = new тип[кол-во элементов];
тип[] имя = new тип [] {элемент0, элемент1, элемент2}
В первом случае у нас массив с отложенной инициализацией.
Достаточно знать первую конструкцию.
Списки
Синтаксис объявления списков
List<тип> имя = new List<тип>();
Условные операторы
Оператор if (если)
Синтаксис:
if (условие)
{
действия;
}
else
{
действия;
}
else - необязательный оператор.
Циклы for, while и foreach
Цикл for (счетчик)
Синтаксис:
for (начальное значение; условие; шаг)
{
//действия
}
Цикл while
while(true)
{
//Действия
}
Как и for можно использовать как счетчик.
Цикл foreach
foreach (тип имя_переменной_цикла in коллекция)
{
//действия;
}
Счетчик без условия. Когда нужно перебрать все элементы некой коллекции без необходимости получения индекса элемента.
Для понимания дальнейшей практической части к которой мы перейдем после этого теоретического блока, стоит обозначить такие понятия как Класс и Метод.
Класс - структура, позволяющая нам описать некий обьект.
Включает в себя методы и свойства для взаимодействия с нашим обьектом и придает ему физическую сущность.
Метод(Функция) - "Черный ящик" выполняющий некие действия над обьектом. Главной особенностью которого является многократное его использование. Все методы принадлежат классам. Передаем в метод аргументы, он выполняет на ними действия и возвращает нам результат. Но методы могут и не принимать аргументов, такие методы называются статическими.
Когда мы создавали список выше, мы создавали обьект принадлежащий к классу List со свойством Count, которое и придавало ему физическу сущность - размерность.
Теперь перейдем от нудной но необходимой теории к практической части
Где собственно и будет практическое применение тех базовых, но достаточных знаний для решения повседневных задач при написании проектов для ZennoPoster.
String.Format - метод (String, Object, Object)
Составная строка в некотором формате.
![[IMG]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tNNFuIo7n9BNZVoDiQTNSXkeVf9UmPfqiXhlUFcjS-XuH-h21fXhjnZ_eVed5r39VUSG2b1pXzKGAAJH3huOePt53cca1CMEL1pAcTsjG3VFtH2bQr-NYO19PP7zlnj5gjVRgpY12M_hT52NPofQ=s0-d)
String.Split - метод (Char[])
Разбиваем строку на массив по разделителю
![[IMG]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_vZ3r5Bv26VV2BilpwoYt59LaxagDhq4NdKBEHlFFr4VO9pUpzfU--MQJDQv-agwL00zf_o6ZUUhVjZTAi_WGtil5ruch9OKrAIALSDV38jQjwa63XLzgf9h0NGPsfudOPMZqYz35s7f3yk27R8=s0-d)
String.Trim - метод
Удалить пробелы в начале и конце строки
String.Replace - метод (String, String)
Заменить часть строки
String.ToLower - метод
String.ToUpper - метод
Перевод строки в нижний и верхний регистр
Основа всего алгоритма распознавания полностью завязана на возможностях одномерных массивов.
Этот пример может служить базой при написании распознавалок для подобного вида капч.
Есть сайт http://radiostationawards.ru На нем такая капча.
![[IMG]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tiU87_PpufcPqaomGVwvADjjoxOW-cN5Xh7NSU0wcqU86OLYPW228oliXs_oE3rMsu41GPvKVL-4YqPu-hyPSCcs7C5IRN3W17gExk2KcOeTEXWF_HYpqwFv6_xSNi_1ppHJeBDH0ydhOBrBwHSA=s0-d)
Смотря на эту капчу можно увидеть массив. Массив состоящий из 7 элементов = 7 картинок.
Помнить что нумерация в массивах идет от нуля. Первый элемент массива имеет индекс = 0!
Когда в Зенно вы выбираете капчу(обьект картинка) за это отвечает метод DrawToBitmap
который входит в библиотеку классов ZennoLab.CommandCenter. Метод передает эту картинку модулю распознавания, который передает ее уже на сервис распознавания в виде картинки.
Мы воспользуемся этим методом для своих целей. Целей идентификации картинки.
Синтаксис метода:
Вот так выглядит base64 строка одной картинки из этой капчи. Такую строку вернет нам метод DrawToBitmap.
Как видим, длина такой строки имеет неудобный вид для работы.
Воспользуемся Снипетом получения MD5 для строки
В результате получим md5 хеш нашей строки.
Шаг #1 - Создание базы
Алгоритм действий
После этого нам нужно сохранить в базу текст вопроса и соответствующий хеш.
Для этого на форму для ручного ввода капчи выведем весь блок капчи с текстом вопроса.
В качестве ответа вбиваем индекс картинки которую просят выбрать.(Нумерация от нуля!!)
![[IMG]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_vsed4ZWI8nIOII7LZI79kbws2wxc_KQsdvsGG-ufeT1Di8BFMSph90037W30m4FpFWW5lf_DPkCAJuxczwH4GCruAxUUbjY2Jo08WqzcK-J0-GZB3CHAEZMExuYkQyYfhvDpGBR7PapvOIbZEmjQ=s0-d)
Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить using:
using System.Security.Cryptography;
После этого у нас в переменной {-Variable.text-} будет текст
вопроса, а в переменной {-Variable.md5-} буде md5 хеш соответствующей
картинки.
Сохраняем все это в список в формате text;md5
Запустим проект в 5 потоков. Вбиваем индексы нужных нам картинок.Через 30-60 минут получим базу в таком виде
![[IMG]](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_sc6gqgwc7MhKADFRQ5BPpFO6g4JXERQcIoTOfXf6-DMsXZOYx2iAUNYtyc7lG6yc643Pi4vHKUBVa61TiPtOnF-yBnEdHJ5wrSzj7j3J6L9fS1WSquT6qUK46kYAxgZikkzLn9VMraRFm5pOTnrg=s0-d)
Intro
Эта статья о снипетах на языке С# (Си шарп). Статья ориентирована на тех пользователей, которые слышали о его поддержке в ZennoPoster, но их пугало слово программирование и им казалось что это сложно. В этой статье не будет акцента на углубление в изучении языка C#. В этой статье акцент на тех базовых возможностях языка которые собственно и достаточно знать для решения большинства задач с которыми Вы сталкиваетесь при каждом новом проекте для ZennoPoster. Только в первом блоке мы затронем немного теории и понятий которые нельзя не затронуть. Только самое используемое из личного опыта.
Типы данных
Язык C# - язык со строгой типизацией. Любые данные имеют некий тип, и этот тип нужно указывать.
На схеме мы видим множество типов, но только с несколькими из них Вы будете сталкиваться в 90% случаев при написании проектов.
тип имя = значение;
Основные типы которых будет достаточно знать.
Code (csharp):
//Логический тип. Принимает true или false
bool flag = false;
//Тип char. Символы
char symbol = 'Z';
//Тип string. Строки/Текст
string str = "Zenno";
//Тип int. Число от -2147483648 до 2147483647
int x = 0;
//Тип var. Универсальный /Динамический тип. Может включать любой тип.
var dyn = SomeType;
Code (csharp):
string str = "некоторая строка";
//В переменной strLenght будет число знаков строке
int strLenght = str.Length;
Массивы - коллекция (данных)переменных одного типа с общим именем, и доступом к ним по их числовому индексу. Массивы бывают одномерные, многомерные и ступенчатые. Достаточно знать одномерных массивов.
Синтаксис оформления одномерных массивов:
тип[] имя;
тип[] имя = new тип[кол-во элементов];
тип[] имя = new тип [] {элемент0, элемент1, элемент2}
В первом случае у нас массив с отложенной инициализацией.
Достаточно знать первую конструкцию.
Code (csharp):
// Объявляем массив типа int
int[] myArr;
// Инициализируем каждый элемент массива вручную
myArr[0] = 8;
myArr[1] = 6;
myArr[2] = 2;
myArr[3] = -1;
myArr[4] = -13;
Списки
Синтаксис объявления списков
List<тип> имя = new List<тип>();
Code (csharp):
//Список myList с элементами типа string
//Добавим в конец списка элемент
myList.Add("Строка1");
//Кол-во строк в списке
int listSize = myList.Count;
Оператор if (если)
Синтаксис:
if (условие)
{
действия;
}
else
{
действия;
}
Code (csharp):
//Объявим переменные и установим им значения
int x =1;
int y= 5;
//Если x меньше чем y
if(x<y)
{
//Увеличим значение в переменной х на 1
x = x+1;
}
//Иначе
else
{
//Уменьшим значение в переменной х на 1
x = x-1;
}
Циклы for, while и foreach
Цикл for (счетчик)
Синтаксис:
for (начальное значение; условие; шаг)
{
//действия
}
Code (csharp):
//обьявим массив типа string который содержит дни недели
string[] days = new string [] {"Понедельник","Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"};
//Переберм все элементы массива
for(int =0; i<days.Length; i++)
{
//если это Среда
if(days[i]=="Среда")
{
//вернем индекс этого элемента
return i;
}
}
while(true)
{
//Действия
}
Как и for можно использовать как счетчик.
Цикл foreach
foreach (тип имя_переменной_цикла in коллекция)
{
//действия;
}
Счетчик без условия. Когда нужно перебрать все элементы некой коллекции без необходимости получения индекса элемента.
Для понимания дальнейшей практической части к которой мы перейдем после этого теоретического блока, стоит обозначить такие понятия как Класс и Метод.
Класс - структура, позволяющая нам описать некий обьект.
Включает в себя методы и свойства для взаимодействия с нашим обьектом и придает ему физическую сущность.
Метод(Функция) - "Черный ящик" выполняющий некие действия над обьектом. Главной особенностью которого является многократное его использование. Все методы принадлежат классам. Передаем в метод аргументы, он выполняет на ними действия и возвращает нам результат. Но методы могут и не принимать аргументов, такие методы называются статическими.
Когда мы создавали список выше, мы создавали обьект принадлежащий к классу List со свойством Count, которое и придавало ему физическу сущность - размерность.
Code (csharp):
//myList - обьект типа string (строка) принадлежащий к классу List
//Add() - метод добавляющий к обьекту строку
myList.Add("Строка1");
//Count - свойство обьекта. Его размерность.
int listSize = myList.Count;
Где собственно и будет практическое применение тех базовых, но достаточных знаний для решения повседневных задач при написании проектов для ZennoPoster.
Тип string - работа со строками
Составная строка в некотором формате.
String.Split - метод (Char[])
Разбиваем строку на массив по разделителю
String.Trim - метод
Удалить пробелы в начале и конце строки
Code (csharp):
string str = " Some string ";
str = str.Trim();
String.Replace - метод (String, String)
Заменить часть строки
Code (csharp):
string str = "Some string";
//Replace(старое значение, новое значение);
str = str.Replace("Some","My Some");
String.ToUpper - метод
Перевод строки в нижний и верхний регистр
Code (csharp):
string str = "text";
//ToLower - в нижний регистр
str = str.ToLower();
//ToUpper - в верхний
str = str.ToUpper();
Массивы на примере одной капчи
В качестве примера решил привести практическую реализацию распознавания одной капчи.
Основа всего алгоритма распознавания полностью завязана на возможностях одномерных массивов.
Этот пример может служить базой при написании распознавалок для подобного вида капч.
Есть сайт http://radiostationawards.ru На нем такая капча.
Помнить что нумерация в массивах идет от нуля. Первый элемент массива имеет индекс = 0!
Когда в Зенно вы выбираете капчу(обьект картинка) за это отвечает метод DrawToBitmap
который входит в библиотеку классов ZennoLab.CommandCenter. Метод передает эту картинку модулю распознавания, который передает ее уже на сервис распознавания в виде картинки.
Мы воспользуемся этим методом для своих целей. Целей идентификации картинки.
Синтаксис метода:
Code (csharp):
//Метод вернет base64 представление нашей картинки в виде строки
public string DrawToBitmap(
bool isImage
)
Воспользуемся Снипетом получения MD5 для строки
Code (csharp):
string input = "base64 строка";
// Создаем объект этого класса.
System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create();
// Преобразуем входную строку в массив байт и вычисляем хэш
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
// Создаем новый Stringbuilder (Изменяемую строку) для набора байт
// Преобразуем каждый байт хэша в шестнадцатеричную строку
for (int i = 0; i < data.Length; i++)
{
//преобразуем элемент в шестнадцатиричную строку длиной в два символа
md5hash.Append(data[i].ToString("x2"));
}
//Возвращаем MD5 хеш для строки
return md5hash.ToString();
Алгоритм действий
После этого нам нужно сохранить в базу текст вопроса и соответствующий хеш.
Для этого на форму для ручного ввода капчи выведем весь блок капчи с текстом вопроса.
В качестве ответа вбиваем индекс картинки которую просят выбрать.(Нумерация от нуля!!)
Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить using:
using System.Security.Cryptography;
Code (csharp):
//Индекс нужной картинки
int index = Convert.ToInt32(project.Variables["index"].Value);
//Массив хешей картинок на странице
//Результат. Будет содержать нужный хеш по индексу
string md5 = String.Empty;
//Заполняем массив md5source
for(int i=0; i<md5source.Length; i++)
{
//Пауза 2с
System.Threading.Thread.Sleep(2000);
//Находим капчи
Tab tab = instance.ActiveTab;
Document doc = tab.MainDocument;
HtmlElement he = doc.FindElementByAttribute("img", "src", "http://radiostationawards.ru/image.php\\?show=.*", "regexp", i);
//Получаем BASE64 представление каптчи. Стат.метод DrawToBitmap(); возвращает тип string
string base64 = he.DrawToBitmap(true);
//Получаем md5 от строки base64
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(base64));
for (int j=0; j < data.Length; j++)
{
md5hash.Append(data[j].ToString("x2"));
}
//Заполняем массив md5 хешами каптч
md5source[i] = md5hash.ToString();
}
//Хеш нужной картинки каптчи по ее индексу
md5 = md5source[index].ToString();
//Вернем результат
return md5;
Сохраняем все это в список в формате text;md5
Запустим проект в 5 потоков. Вбиваем индексы нужных нам картинок.Через 30-60 минут получим базу в таком виде
Комментариев нет:
Отправить комментарий