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

7make

Client
Регистрация
25.06.2011
Сообщения
1 547
Реакции
1 312
Баллы
113
Intro

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

Типы данных

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

29d66ad3ac8fbdb6565222bb824b0a21.png

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

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

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

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.



 
Номер конкурса статей
  1. Первый конкурс статей
Тема статьи
  1. Другое
Тип string - работа со строками

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

//Пустая строка.
string result = string.Empty;

String.Format - метод (String, Object, Object)
Составная строка в некотором формате.
09d3aa0898cb312a82ad75c73584f2ad.png
09d3aa0898cb312a82ad75c73584f2ad.png
25157758a07ea1e340b320d431048ed4.png


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

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


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();



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

82de7e4230cf0c2ab74552d80d0fbd40.jpg

Смотря на эту капчу можно увидеть массив. Массив состоящий из 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 - Создание базы

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


6009f3aa85eec1b74367d31956f07ebb.png



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


Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить 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 минут получим базу в таком виде

cb545a1ff4506f8ea771c09e61b17623.png

 
Последнее редактирование:
Шаг #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;

Делаем клик по соответствующей картинке :-)
 
Последнее редактирование:
Очень неплохо. Зачет. Особенно для тех кто немного все таки дружит с программированием. Обязательно сохраню как мини мануал.
 
Круто!
Спасибо за качественный и понятный мануал!
Даже не представлял что можно так разгадывать капчу :-)
Главное чтобы база вопросов была не на лям.
 
Круто!
Спасибо за качественный и понятный мануал!
Даже не представлял что можно так разгадывать капчу :-)
Главное чтобы база вопросов была не на лям.
На этой капче было 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(пересечений), берем другую строку.

Можно реалтайм алгоритм использовать, можно отдельным проектом составить базу.
 
Последнее редактирование:
Отличная статья. Подозреваю что ТС уже давно успешно разгадывает кей капчу и другие виды "картиночных" капч.
 
Все хорошо. Только вы можете попасть в неприятную ситуацию, когда хеши md5 одинаковы. Если возьмете сниппет и будуте работать со строками. Лучше переделайте SHA1
http://zennolab.com/discussion/threads/pochemu-md5-xesh-odinakov.13595/#post-81076
в той теме, ошибка в проекте.
берете хеш для одной строки input в обоих случаях.
ответил в теме
 
Аааа.. вот это статья =) ничего не понял, но как мне кажется это очень круто =) После ее прочтения понимаешь что зенопостер с C# бог
 
  • Спасибо
Реакции: BraG.A, Lankorn и GreenWay
мне кажется если так разбираться в си шарпе, то самому легко писать свои проги)
 
Кто подскажет как из примера выше, когда считали картинку в переменную, тип как в примере выглядит base64 строка одной картинки из капчи. Как сохранить эту картинку в файл из переменной ??? использую zennoposter demo варианты через модуль капчи не подходят.
 
KQUSZefp.png
KQUSZefq.png
 
System.IO.File.WriteAllBytes("путь", Convert.FromBase64String(toBitmap2));
 
LexxWork Спасибо! но System.IO.File.WriteAllBytes("путь", Convert.FromBase64String(toBitmap2));
Не распознанная управляющая последовательность Ошибка !
KQUSZefr.png
KQUSZefs.png
 
@"c:\1.png"
 
УРА работает спасибо LexxWork
Правильно так System.IO.File.WriteAllBytes("c:/1.png", Convert.FromBase64String(toBitmap2));
 
(facepalm)
 
Ну я путь то вначале скопировал с окна, а там наоброт слешь. Вот и ошибка выскочила, а так ещё не побывал @"c:\1.png" наверное тоже нужно вот так @"c:/1.png" :bt:
 
Добрый день!
Ничего не понял, но чувствую что это то что мне нужно!
Задача: Есть ссылка на товар интернет-магазина. Нужно спарсить ссылки на картинки + md5 картинок. В итоге должно получиться
Код:
Развернуть Свернуть Копировать
<foto-remote url="http://site1.ru/pictures/image/1.jpg" md5="123456"/>
Я смог спарсить картинки, но не могу получить их md5/

Прошу, помогите!!:)
 
это всгда должно быть в топе, а то я потом найти немогу!:ay:
 
Ни че не понятно) если б шаблон хотя бы был :D
 
  • Спасибо
Реакции: nikolaj24
Массивы на примере одной капчи
В качестве примера решил привести практическую реализацию распознавания одной капчи.
Основа всего алгоритма распознавания полностью завязана на возможностях одномерных массивов.
Этот пример может служить базой при написании распознавалок для подобного вида капч.
Есть сайт http://radiostationawards.ru На нем такая капча.

82de7e4230cf0c2ab74552d80d0fbd40.jpg

Смотря на эту капчу можно увидеть массив. Массив состоящий из 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 - Создание базы

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


6009f3aa85eec1b74367d31956f07ebb.png



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


Парсим сам текст картинки которую просят найти.
Передаем индекс в следующий код.
Для работы кода нужно добавить 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 минут получим базу в таком виде

cb545a1ff4506f8ea771c09e61b17623.png

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

капча похожая, только надо выбрать три варианта в ответе?
 
А как такую капчу разгадать подобным образом
tpnKY7m.png

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

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