2 место Снипеты от А до Я

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Intro

Эта статья о снипетах на языке С# (Си шарп). Статья ориентирована на тех пользователей, которые слышали о его поддержке в ZennoPoster, но их пугало слово программирование и им казалось что это сложно. В этой статье не будет акцента на углубление в изучении языка C#. В этой статье акцент на тех базовых возможностях языка которые собственно и достаточно знать для решения большинства задач с которыми Вы сталкиваетесь при каждом новом проекте для ZennoPoster. Только в первом блоке мы затронем немного теории и понятий которые нельзя не затронуть. Только самое используемое из личного опыта.

Типы данных

Язык C# - язык со строгой типизацией. Любые данные имеют некий тип, и этот тип нужно указывать.
На схеме мы видим множество типов, но только с несколькими из них Вы будете сталкиваться в 90% случаев при написании проектов.


Синтаксис оформления переменных:

тип имя = значение;

Основные типы которых будет достаточно знать.

C#:
//Логический тип. Принимает true или false
bool flag = false;

//Тип char. Символы
char symbol = 'Z';

//Тип string. Строки/Текст
string str = "Zenno";

//Тип int. Число от -2147483648 до 2147483647
int x = 0;

//Тип var. Универсальный /Динамический тип. Может включать любой тип.
var dyn = SomeType;
Тип string - имеет свойство Length которое вернет число знаков в строке.

C#:
string str = "некоторая строка";
//В переменной strLenght будет число знаков  строке
int strLenght = str.Length;
Массивы

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

*Первый элемент массива имеет индекс 0!

Синтаксис оформления одномерных массивов:

тип[] имя;
тип[] имя = new тип[кол-во элементов];
тип[] имя = new тип [] {элемент0, элемент1, элемент2}

В первом случае у нас массив с отложенной инициализацией.
Достаточно знать первую конструкцию.


C#:
// Объявляем массив типа int 
int[] myArr;

// Инициализируем каждый элемент массива вручную
myArr[0] = 8;
myArr[1] = 6;
myArr[2] = 2;
myArr[3] = -1;
myArr[4] = -13;
Как и строки, массивы имеют свойство Length которое вернет кол-во элементов массива.

Списки

Синтаксис объявления списков

List<тип> имя = new List<тип>();
C#:
//Список myList с элементами типа string
 List<string> myList= new List<string>();

//Добавим в конец списка элемент
myList.Add("Строка1");

//Кол-во строк в списке
int listSize = myList.Count;
Как строки и массивы имеет свойство которое вернет кол-во элементов - Count.
Условные операторы

Оператор if (если)

Синтаксис:


if (условие)
{
действия;
}
else
{

действия;
}


C#:
//Объявим переменные и установим им значения
int x =1;
int y= 5;

//Если x меньше чем y 
if(x<y)
{
//Увеличим значение в переменной х на 1
x = x+1;
}
//Иначе
else
{
//Уменьшим значение в переменной х на 1
x = x-1;
}
else - необязательный оператор.

Циклы for, while и foreach

Цикл for (счетчик)

Синтаксис:

for (начальное значение; условие; шаг)
{
//действия
}

C#:
//обьявим массив типа string который содержит дни недели
string[] days = new string [] {"Понедельник","Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"};

//Переберм все элементы массива
for(int =0; i<days.Length; i++)
{
//если это Среда  
if(days[i]=="Среда")
{
//вернем индекс этого элемента
return i;
} 
}
Цикл while

while
(true)
{
//Действия
}


Как и for можно использовать как счетчик.

Цикл foreach

foreach (тип имя_переменной_цикла in коллекция)
{
//действия;
}

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


Для понимания дальнейшей практической части к которой мы перейдем после этого теоретического блока, стоит обозначить такие понятия как Класс и Метод.

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

Метод(Функция) - "Черный ящик" выполняющий некие действия над обьектом. Главной особенностью которого является многократное его использование. Все методы принадлежат классам. Передаем в метод аргументы, он выполняет на ними действия и возвращает нам результат. Но методы могут и не принимать аргументов, такие методы называются статическими.

Когда мы создавали список выше, мы создавали обьект принадлежащий к классу List со свойством Count, которое и придавало ему физическу сущность - размерность.

C#:
//myList - обьект типа string (строка) принадлежащий к классу List
 List<string> myList= new List<string>();

//Add() - метод добавляющий к обьекту строку
myList.Add("Строка1");

//Count - свойство обьекта. Его размерность.
int listSize = myList.Count;
Теперь перейдем от нудной но необходимой теории к практической части :-)
Где собственно и будет практическое применение тех базовых, но достаточных знаний для решения повседневных задач при написании проектов для ZennoPoster.



 

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Тип string - работа со строками

Перед использованием, переменную нужно проинициализировать значением.
Обычно используют такую конструкцию, присваивают пустоту.

//Пустая строка.
string result = string.Empty;
String.Format - метод (String, Object, Object)
Составная строка в некотором формате.


String.Split - метод (Char[])

Разбиваем строку на массив по разделителю


String.Trim - метод
Удалить пробелы в начале и конце строки

C#:
string str = " Some string ";
str = str.Trim();

String.Replace - метод (String, String)
Заменить часть строки

C#:
string str = "Some string";
//Replace(старое значение, новое значение);
str = str.Replace("Some","My Some");
String.ToLower - метод

String.ToUpper - метод

Перевод строки в нижний и верхний регистр

C#:
string str = "text";

//ToLower -  в нижний регистр
str = str.ToLower();

//ToUpper - в верхний
str = str.ToUpper();


 
Последнее редактирование:

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Массивы на примере одной капчи
В качестве примера решил привести практическую реализацию распознавания одной капчи.
Основа всего алгоритма распознавания полностью завязана на возможностях одномерных массивов.
Этот пример может служить базой при написании распознавалок для подобного вида капч.
Есть сайт http://radiostationawards.ru На нем такая капча.


Смотря на эту капчу можно увидеть массив. Массив состоящий из 7 элементов = 7 картинок.
Помнить что нумерация в массивах идет от нуля. Первый элемент массива имеет индекс = 0!

Когда в Зенно вы выбираете капчу(обьект картинка) за это отвечает метод DrawToBitmap
который входит в библиотеку классов ZennoLab.CommandCenter. Метод передает эту картинку модулю распознавания, который передает ее уже на сервис распознавания в виде картинки.
Мы воспользуемся этим методом для своих целей. Целей идентификации картинки.

Синтаксис метода:

C#:
//Метод вернет base64 представление нашей картинки в виде строки
public string DrawToBitmap(
   bool isImage
)
Вот так выглядит base64 строка одной картинки из этой капчи. Такую строку вернет нам метод DrawToBitmap.
iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAOESURBVGhD7ZpLKG1RGMePN1GkkAkDkeQ5UMqE8khKISPGKEPJgKRQ8pgoIQOKIiUjpWTkMZAijyQDj7wG3m9x/G//r31291xO+zrWLbu7//XV2Wt19vf91v5We61vL9vJyQlox8fH2NnZwdraGlZWVkxhjJUxHx0dQUAODg6wvr6Oi4sLvL6+QrWenp5QVVWFoKAgZGRkSAAq/Ly8vEjMjF1A+ONfAFC879TUFAICAmCz2eDt7Y3Kykqcnp7i4eEBw8PDqKurw/T0NK6vr7V/fU1vb2+w8dGQSoXsdrs85snJSSwtLck1R623txdeXl4CQisqKsLh4SE6OjoQGxuLwMBAxMTEYGJiwu0Btal6zAx6dXUVubm5iIiIQEJCAgYGBgSkp6fHCaSwsBD7+/soLi6Gv7+/tLG/vb0dV1dX2h2/JhsnjQrd399jdHQUfn5+Epivr69APT8/uwTJz8+Hj4+P3t7S0oLz83Ptjl+TMhDmd39/vx4UA09NTcXj46NLkLy8vE9Bdnd30d3djerqaoyPj+P29lbz4lpKQfr6+vSgOKmTk5O/DLK3t4e2tjZERUUhJCQEWVlZMueM9ONAlpeXUVFRobdFRkaitbVV8+JaPw5kYWEBZWVleltoaCgaGxs1L67140Dm5+ctEO3n92SBWCDO+j9B3t/fcXl5KXsAvn1vbm60HhOBcFG4vb0tK1nuLWpqajA0NCRvYgJ+BpKUlCTgXV1dTiAFBQVyr5ycHCeQpqYmzM3NoaSkRG9TDnJ2dob6+nqEhYXpTqKjo9Hc3Cx9f4J4enpK/+DgIMrLy+Xa0ZeSkiJwiYmJToClpaVoaGhAenq63qYcZGZmBpmZmboDhzF9xsbGPoCoMuUgDDYtLe2DI+49mBKmAVlcXJTcZu7/7sh0INwgMa+Z9x4eHroj04FQnNS1tbUIDg7WHZkShNrc3JT9giPFTAtCzc7OIjs7W1LM1CCsI42MjCAuLs7cIBTLNpz88fHx5gbhsoTLk87OTtlTmxaEYopx8ceSq6lBKMKwmmh6EIcsEAOzQNyVBWJgFoi7skAMzAJxVxaIgVkg7soCMTALxF0RhN/ZWV1RaeHh4bKVNpKyIxx3d3fyPZwFaJXG0xMcICPJoRqW/r8r7uE5IDzxo9L4feVvBlqOOW1sbMj3j++IJVU+XRYjVBqPQW1tbWlePpfdbscvhtSOsbw7okYAAAAASUVORK5CYII=
Как видим, длина такой строки имеет неудобный вид для работы.
Воспользуемся Снипетом получения MD5 для строки

C#:
string input = "base64 строка";

// Создаем объект этого класса.
System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create();
// Преобразуем входную строку в массив байт и вычисляем хэш
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
// Создаем новый Stringbuilder (Изменяемую строку) для набора байт
StringBuilder md5hash = new StringBuilder();
// Преобразуем каждый байт хэша в шестнадцатеричную строку
for (int i = 0; i < data.Length; i++)
{
    //преобразуем элемент в шестнадцатиричную строку длиной в два символа
    md5hash.Append(data[i].ToString("x2"));
}
//Возвращаем MD5 хеш для строки
return md5hash.ToString();
В результате получим md5 хеш нашей строки.
1fbabb01b6a5376b925c42f9a6f97cf4
Шаг #1 - Создание базы

Алгоритм действий





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


Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить using:
using System.Security.Cryptography;

C#:
//Индекс нужной картинки
int index  = Convert.ToInt32(project.Variables["index"].Value);

//Массив хешей картинок на странице
string[] md5source = new string[7];

//Результат. Будет содержать нужный хеш по индексу
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));
    StringBuilder md5hash = new StringBuilder();
    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;
После этого у нас в переменной {-Variable.text-} будет текст вопроса, а в переменной {-Variable.md5-} буде md5 хеш соответствующей картинки.
Сохраняем все это в список в формате text;md5
Запустим проект в 5 потоков. Вбиваем индексы нужных нам картинок.Через 30-60 минут получим базу в таком виде


 
Последнее редактирование:

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Шаг #2 - Использование базы

Создаем рабочий проект.
Подключаем базу как список.
Используем следующий снипет.

C#:
//База признаков text;md5
var baselist = project.Lists["base"];

//Текст на странице
string text  = project.Variables["text"].Value;

//Массив хешей картинок на странице
string[] md5source = new string[7];

//Будет содержать md5 найденный из базы признаков
string  md5 = String.Empty;

//Будет содержать найденный индекс нужной нам капчи
string index = String.Empty;

//Заполняем массив md5source
for(int i=0; i<md5source.Length; i++)
{
    //Находим капчи
    Tab tab = instance.ActiveTab;
    Document doc = tab.MainDocument;
    HtmlElement he = doc.FindElementByAttribute("img", "src", "http://radiostationawards.ru/image.php\\?show=.*", "regexp", i);
  
    //Получаем BASE64 представление каптчи
    string base64 = he.DrawToBitmap(true);

    //Получаем md5 от строки base64
    MD5 md5Hasher = MD5.Create();
    byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(base64));
    StringBuilder md5hash = new StringBuilder();
    for (int j=0; j < data.Length; j++)
    {
        md5hash.Append(data[j].ToString("x2"));
    }
    //Заполняем массив md5 хешами капч
    md5source[i] = md5hash.ToString();
}

//Перебираем все строки из базы признаков
foreach(string str in baselist)
{
    //Если строка содержит text
    if(str.Contains(text))
    {
        //Отделим text от md5 и поместим в массив
        string [] split = str.Split(';');
        //split[0] - text
        //split[1] - md5
        md5 = split[1];  
    }
}
//Сравниваем массив хешей капч со страницы с хешем из базы
for(int i=0; i<md5source.Length; i++)
{
    if(md5source[i] == md5)
    {
        //получим его индекс
        index = i.ToString();
    }
}

//вернем индекс нужной нам капчи :)
return index;
Делаем клик по соответствующей картинке :-)
 
Последнее редактирование:

izubr

Client
Регистрация
11.05.2011
Сообщения
245
Благодарностей
71
Баллы
28
Очень неплохо. Зачет. Особенно для тех кто немного все таки дружит с программированием. Обязательно сохраню как мини мануал.
 

strannic

Client
Регистрация
05.12.2010
Сообщения
219
Благодарностей
8
Баллы
18
Круто!
Спасибо за качественный и понятный мануал!
Даже не представлял что можно так разгадывать капчу :-)
Главное чтобы база вопросов была не на лям.
 

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Круто!
Спасибо за качественный и понятный мануал!
Даже не представлял что можно так разгадывать капчу :-)
Главное чтобы база вопросов была не на лям.
На этой капче было 40 уникальных картинок, и целесообразнее их руками забить в базу.
На самом деле, если будет лям картинок, то можно на полном автомате составить базу.
Точнее даже не базу, а алгоритм выбора нужной нам пары текст - хеш.
Берем и сохраняем базу в таком формате:
текст;md5(0);md5(1);md5(2);md5(3);md5(4);md5(5);md5(6);
Мы точно знаем что один из 7 хешей точно верный для этого вопроса.
Парсим таких строк некое кол-во. Я обычно беру факториал числа от кол-ва картинок.
Если 7 картинок, я беру выборку 7! = 5040 =~6k строк
А далее по такому алго обрабатываем.
К примеру, просят выбрать самолет.

1. Кидаем в массив хеши картинок с текущей капчи.
2. Дергаем с файла базы в список=>массив temp все строки в которых есть текст вопроса
3. Сравниваем попарно,и ищем пересечения, с условием что должно быть 1 пересечение значения в обоих массивах. Просто может быть другая картинка которая не соответствует вопросу, но она есть в обоих массивах. Если их больше чем 1(пересечений), берем другую строку.

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

Gerero

Client
Регистрация
20.12.2010
Сообщения
75
Благодарностей
69
Баллы
18
Отличная статья. Подозреваю что ТС уже давно успешно разгадывает кей капчу и другие виды "картиночных" капч.
 

myweb101

Client
Регистрация
29.04.2013
Сообщения
175
Благодарностей
29
Баллы
28

7make

Moderator
Регистрация
25.06.2011
Сообщения
1 518
Благодарностей
1 235
Баллы
113
Все хорошо. Только вы можете попасть в неприятную ситуацию, когда хеши md5 одинаковы. Если возьмете сниппет и будуте работать со строками. Лучше переделайте SHA1
http://zennolab.com/discussion/threads/pochemu-md5-xesh-odinakov.13595/#post-81076
в той теме, ошибка в проекте.
берете хеш для одной строки input в обоих случаях.
ответил в теме
 

smarchenko

Client
Регистрация
18.01.2014
Сообщения
92
Благодарностей
7
Баллы
8
Аааа.. вот это статья =) ничего не понял, но как мне кажется это очень круто =) После ее прочтения понимаешь что зенопостер с C# бог
 
  • Спасибо
Реакции: BraG.A, Lankorn и GreenWay
Регистрация
21.05.2014
Сообщения
140
Благодарностей
10
Баллы
18
мне кажется если так разбираться в си шарпе, то самому легко писать свои проги)
 

lokiys

Moderator
Регистрация
01.02.2012
Сообщения
4 113
Благодарностей
973
Баллы
113

swiniks

Client
Регистрация
19.02.2015
Сообщения
226
Благодарностей
144
Баллы
43
Кто подскажет как из примера выше, когда считали картинку в переменную, тип как в примере выглядит base64 строка одной картинки из капчи. Как сохранить эту картинку в файл из переменной ??? использую zennoposter demo варианты через модуль капчи не подходят.
 

swiniks

Client
Регистрация
19.02.2015
Сообщения
226
Благодарностей
144
Баллы
43

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 194
Благодарностей
755
Баллы
113
System.IO.File.WriteAllBytes("путь", Convert.FromBase64String(toBitmap2));
 

swiniks

Client
Регистрация
19.02.2015
Сообщения
226
Благодарностей
144
Баллы
43
LexxWork Спасибо! но System.IO.File.WriteAllBytes("путь", Convert.FromBase64String(toBitmap2));
Не распознанная управляющая последовательность Ошибка !
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 194
Благодарностей
755
Баллы
113
@"c:\1.png"
 

swiniks

Client
Регистрация
19.02.2015
Сообщения
226
Благодарностей
144
Баллы
43
УРА работает спасибо LexxWork
Правильно так System.IO.File.WriteAllBytes("c:/1.png", Convert.FromBase64String(toBitmap2));
 

LexxWork

Client
Регистрация
31.10.2013
Сообщения
1 194
Благодарностей
755
Баллы
113

swiniks

Client
Регистрация
19.02.2015
Сообщения
226
Благодарностей
144
Баллы
43
Ну я путь то вначале скопировал с окна, а там наоброт слешь. Вот и ошибка выскочила, а так ещё не побывал @"c:\1.png" наверное тоже нужно вот так @"c:/1.png" :bt:
 

Ilant

Client
Регистрация
25.12.2015
Сообщения
6
Благодарностей
0
Баллы
1
Добрый день!
Ничего не понял, но чувствую что это то что мне нужно!
Задача: Есть ссылка на товар интернет-магазина. Нужно спарсить ссылки на картинки + md5 картинок. В итоге должно получиться
Код:
<foto-remote url="http://site1.ru/pictures/image/1.jpg" md5="123456"/>
Я смог спарсить картинки, но не могу получить их md5/

Прошу, помогите!!:-)
 
Регистрация
08.07.2015
Сообщения
2 854
Благодарностей
706
Баллы
113
это всгда должно быть в топе, а то я потом найти немогу!:ay:
 

BraG.A

Пользователь
Регистрация
05.08.2016
Сообщения
81
Благодарностей
6
Баллы
8
Ни че не понятно) если б шаблон хотя бы был :D
 

An_To_Ha

Client
Регистрация
27.09.2010
Сообщения
19
Благодарностей
3
Баллы
3
Массивы на примере одной капчи
В качестве примера решил привести практическую реализацию распознавания одной капчи.
Основа всего алгоритма распознавания полностью завязана на возможностях одномерных массивов.
Этот пример может служить базой при написании распознавалок для подобного вида капч.
Есть сайт http://radiostationawards.ru На нем такая капча.


Смотря на эту капчу можно увидеть массив. Массив состоящий из 7 элементов = 7 картинок.
Помнить что нумерация в массивах идет от нуля. Первый элемент массива имеет индекс = 0!

Когда в Зенно вы выбираете капчу(обьект картинка) за это отвечает метод DrawToBitmap
который входит в библиотеку классов ZennoLab.CommandCenter. Метод передает эту картинку модулю распознавания, который передает ее уже на сервис распознавания в виде картинки.
Мы воспользуемся этим методом для своих целей. Целей идентификации картинки.

Синтаксис метода:

C#:
//Метод вернет base64 представление нашей картинки в виде строки
public string DrawToBitmap(
   bool isImage
)
Вот так выглядит base64 строка одной картинки из этой капчи. Такую строку вернет нам метод DrawToBitmap.


Как видим, длина такой строки имеет неудобный вид для работы.
Воспользуемся Снипетом получения MD5 для строки

C#:
string input = "base64 строка";

// Создаем объект этого класса.
System.Security.Cryptography.MD5 md5Hasher = System.Security.Cryptography.MD5.Create();
// Преобразуем входную строку в массив байт и вычисляем хэш
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
// Создаем новый Stringbuilder (Изменяемую строку) для набора байт
StringBuilder md5hash = new StringBuilder();
// Преобразуем каждый байт хэша в шестнадцатеричную строку
for (int i = 0; i < data.Length; i++)
{
    //преобразуем элемент в шестнадцатиричную строку длиной в два символа
    md5hash.Append(data[i].ToString("x2"));
}
//Возвращаем MD5 хеш для строки
return md5hash.ToString();
В результате получим md5 хеш нашей строки.


Шаг #1 - Создание базы

Алгоритм действий





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


Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить using:
using System.Security.Cryptography;

C#:
//Индекс нужной картинки
int index  = Convert.ToInt32(project.Variables["index"].Value);

//Массив хешей картинок на странице
string[] md5source = new string[7];

//Результат. Будет содержать нужный хеш по индексу
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));
    StringBuilder md5hash = new StringBuilder();
    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;
После этого у нас в переменной {-Variable.text-} будет текст вопроса, а в переменной {-Variable.md5-} буде md5 хеш соответствующей картинки.
Сохраняем все это в список в формате text;md5
Запустим проект в 5 потоков. Вбиваем индексы нужных нам картинок.Через 30-60 минут получим базу в таком виде


А как такую капчу разгадать подобным образом

капча похожая, только надо выбрать три варианта в ответе?
 

AZANIR

Client
Регистрация
09.06.2014
Сообщения
395
Благодарностей
179
Баллы
43
А как такую капчу разгадать подобным образом

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

AZANIR

Client
Регистрация
09.06.2014
Сообщения
395
Благодарностей
179
Баллы
43
задам тут вопрос
проект работает без подгрузки картинок , и если через кубик указать что данная картинка капча , то в процессе работы , картинка подгружается , а если делать тоже самое сниппетом то вылетает ошибка и картинка не грузится.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)