Работа с фейковыми данными в Human Emulator

Создание случайных данных пользователя для автозаполнения различных форм в интернете с помощью программы Хуман Эмулятор.

Сайт программы

Присоединяйтесь к нам в ВК:
https://vk.com/humanemulator
https://vk.com/xscripts
https://vk.com/club130582676

Скрипт регистратор мыла на примере mail.ru. Часть 2.

Итак, из предыдущей статьи у нас есть следующий скрипт, который регистрирует один аккаунт за один запуск скрипта:

Наша задача добавить в скрипт работу с прокси, различные проверки на удачную регистрацию и запись удачных логинов и паролей в файл.

Начнём с прокси. Допустим у нас есть какой то файл с прокси proxy.txt, который лежит в той же папке что и скрипт. Формат файла следующий:

175.145.221.223:3128
202.53.255.68:3128
196.214.70.60:80
180.242.62.150:8088
95.159.29.116:80
186.193.99.222:3128

Добавим в скрипт код для получения данных из файла с проксями в массив $proxies= file(«proxy.txt»); и сразу же создадим цикл, который будет основан на количестве проксей — то есть мы будем регистрировать столько же аккаунтов сколько у нас рабочих проксей в файле, для этого добавим следующий код:

Примечание: как работать с файлами в XHE описано в статье работа с файлами. Как организовывать циклы описано в статье работа с циклами

В итоге наш скрипт будет выглядеть теперь так:

Теперь добавим проверку и запись удачно зарегистрированного аккаунта в файл. Для записи в файл будем использовать функцию объекта для работы c текстовыми
файлами $textfile->add_string_to_file. Код в скрипте будет $textfile->add_string_to_file($res_file,»$mail_login;$pwd\n»);, где $res_file переменная, которая настраивается в начале скрипта $res_file = «mail_accs.txt»;, а «$mail_login;$pwd\n» это записываемая строка с данными в файл.

Теперь нужно добавить проверку удачной регистрации нового аккаунта. Сразу после удачной регистрации открывается ящик и в верхнем правом углу отображается аккаунт под которым мы зашли. Вот на наличие его на странице мы и будем проверять. Если такая строка есть значит зашли в аккаунт, а значит мы его зарегистрировали. Простой анализ страницы показал, что это span элемент и к тому же с id

. Это нам даёт возможность использовать функцию объекта $element->get_element_innerText_by_id следующим образом:

Теперь осталась добавить проверку через оператор if. в Результате мы получили:

Примечание: команда echo служит для вывода информации в панель отладки.

Теперь наш скрипт выглядит следующим образом:

Если запустить этот скрипт то у нас возникнут проблемы при регистрации второго и последующих аккаунтов так как прежде чем регистрировать новый аккаунт желательно выйти из последнего зареганного аккаунта. К тому же нам нужно ещё менять данные браузера, чистить кэш и менять user-agent строку, можно менять размер браузера и т.д..

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

Так же до цикла делаем переход основного браузера на пустую страницу: $browser->navigate(‘about:blank’);

В конце цикла добавим следующий код, который будет чистить данные браузера, а потом закрывать открытый в начале скрипта браузер:

В итоге наш скрипт стал:

Теперь добавим работу с user-agent строкой. Для этого у нас есть файл user-agents.txt, который содержит данные в следующем формате:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; (R1 1.5); .NET CLR 1.1.4322)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; InfoPath.2; Windows-Media-Player/10.00.00.3990)

По аналогии с прокси получим данные из файла в массив добавим в начало скрипта следующий код:
$useragents = file(«useragent.txt»); Задавать эти строки мы будем случайным образом сразу после того как делаем активным 1 браузер, используя следующий код: $browser->set_user_agent($useragents[rand(0,count($useragents)-1)]);, где ($useragents[rand(0,count($useragents)-1)] это случайный элемент массива от 0 до количества элементов в массиве-1.

В конце скрипта перед $app->quit(); добавим код отключения прокси: $browser->disable_proxy(«all connections»);

Теперь наш скрипт имеет вид:

Производительность скрипта очень сильно зависит от скорости и качества используемых прокси.
Скрипт написан 18.01.2012 в Human Emulator 4.2 Advanced.
На момент публикации статьи 23.01.2012 скрипт был рабочий.

скачать скрипт

Скрипт регистратор мыла на примере mail.ru. Часть 1.

Пожалуй, самое распространённое требование при регистрации каких либо аккаунтов на сайтах это рабочий e-mail. На примере mail.ru напишем скрипт, который будет регать для нас email-ы, которые мы потом сможем использовать в других регистрациях.

Итак, первое что мы сделаем это создадим новый скрипт через меню Файл->Новый. Заменим в скрипте http://www.google.com на mail.ru. Запустим скрипт на выполнение и перейдём на сайт mail.ru. После находим на странице ссылку с текстом «Регистрация в почте», кликаем на ней правой кнопкой мыши и выбираем пункт меню $anchor в развернувшемся подменю кликаем на пункт меню $anchor->click_by_inner_text(‘Регистрация в почте ‘,true);. Нужная нам функция добавилась в скрипт и теперь наш скрипт выглядит следующим образом:

Примечание: После любых функций клика, которые делают переход на другую страницу или выполняют какие либо действия после которых браузер обновляется, нужно добавлять функцию $browser->wait_for();. Эта функция ожидает пока браузер выполнит необходимые действия, не давая скрипту идти дальше.

Запускаем скрипт на выполнение и переходим на страницу регистрации mail.ru. Перед нами страница с полями, которые нужно заполнить данными. Первые два поля это Имя и Фамилия. Для генерации данных в XHE используется объект submitter. У этого объекта есть функции для генерации имени и фамилии — generate_random_name и generate_random_second_name, соответственно. Вставляем эти функции в скрипт через диалог добавления кода. Этот диалог можно вызвать горячими клавишами Ctrl+Alt+Right(стрелка вправо). В диалоге выбираем объект submitter и затем выбираем нужные нам функции из правого поля.

Теперь наш скрипт выглядит следующим образом:

Для работы с полями вставки текста в XHE служит объект input. Для вставки значений в поля Имя и Фамилия используем контекстное меню аналогично с тем как мы кликали на ссылку «Регистрация в почте». В открывшемся подменю меню $input выберем функцию «$input->set_value_by_number(‘0’,»);», а для второго поля «$input->set_value_by_number(‘1’,»);».

Примечание: Помимо функции работы по номеру поля в контекстном меню можно увидеть и функцию работы с полем по имени, типа: «$input->set_value_by_name(‘x_29f24908ee4918a4’,»);». На практике лучше использовать функции, которые работают с элементом по его имени, так как при добавлении нового элемента такого же типа нумерация полей меняется и это может привести к неработоспособности скрипта, тогда как имя элемента остаётся постоянным. НО в данном случае, судя по именам элементов они скорее всего меняются чаще, чем добавляются новые поля на страницу, поэтому будет надёжнее работать по номерам элементов.

Теперь вставим генерацию имени и фамилии в поля с нужными для нас параметрами. Скрипт будет выглядеть так:

Параметры «RU» и «man» говорят о том что нужно генерить только русские мужские имена и фамилии. Допустим что стоит задача случайным образом создавать в том числе и женские имена и фамилии. Тогда добавим следующий код в скрипт:

После добавления этого кода скрипт будет выглядеть следующим образом:

Теперь выберем дату рождения. Для работы с элементами выбора в XHE используется объект listbox. Значения даты будем выбирать случайным образом используя функцию select_random_value_by_number.

Таким образом получим следующее:

Теперь выберем пол. В скрипте уже пол выбран его содержит переменная $gnd. Теперь с помощью неё выберем нужный пол на странице. Для работы с так называемыми радиобоксами в XHE есть элемент radiobox. Используя контекстное меню для элемента выбираем функцию $radiobox->set_checked_by_value(‘1’,true); и меняем ‘1’ на $gnd.

Примечаение: Тут можно было использовать функции работы по номеру $radiobox->set_checked_by_number(0,true);, но тогда наш код выбора пола имел бы такой вот вид:

В итоге имеем скрипт в следующем виде:

Примечание: Периодически можно запускать скрипт что бы проверять всё ли срабатывает так как надо.

Теперь нам нужно сгенерить логин для мыла и вставить его в поле логина. Для этого используем функцию $input->set_value_by_number(‘3’,»); вместе с функцией $submitter->generate_random_nick_name. Для того что бы сделать длину генерируемого пароля случайной используем оператор rand и тогда получем следующий код $input->set_value_by_number(‘3’,$submitter->generate_random_nick_name(rand(5,9));. Этот код будет вставлять случайный логин длиной от 5 до 9 символов. Для того что ещё больше сделать логин уникальным можно добавить опять таки оператор rand. Тогда вызов функции будет выглядеть так $input->set_value_by_number(‘3’,$submitter->generate_random_nick_name(rand(5,9)).rand(100,10000));

Так как при удачной регистрации нам понадобится записать получившийся логин мы введём переменную $mail_login и перепишем код следующим образом:

Примечание: Не ленитесь расставлять комментарии это поможет вам понять как работает скрипт, в том случае если вы его решите переделать через месяц другой.

После всех манипуляций получим:

По аналогии делаем тоже самое с заполнением паролем, только для генерации пароля используем функцию $submitter->generate_random_text. В итоге для пароля добавим такой вот код:

Дальше если надо, то добавляем в поле телефон, если делать регистрацию без телефона, то добавим для ссылки «У меня нет мобильного телефона» через контекстное меню вызов функции $anchor->click_by_inner_text(‘У меня нет мобильного телефона’,true);. Затем кликнем на ссылку что бы увидеть поля для заполнения. Выберем случайным образом из списка вопросов вопрос, используя уже известную нам функцию $listbox->select_random_value_by_number(5);. Для формирования ответа можно использовать функцию $submitter->generate_random_text либо задавать один и тот же ответ это по выбору. В нашем случае будем использовать $submitter->generate_random_text.

После заполнения всех нужных полей кликнем на кнопку для завершения регистрации. Для работы с кнопками типа INPUT в XHE используется объект button. Используя контекстное меню для элемента выберем функцию $button->click_by_number(1);

Теперь наш скрипт будет выглядеть так вот:

После запуска этого скрипта в браузере откроется окно с каптчей. Для работы с распознанием каптчи можно использовать различные сервисы такие как captchabot.com или anti-captcha.com. Можно и другие просто для работы с этими двумя сервисами в XHE есть объекты $captchabot и $anticapcha. А так же можно использовать ручной ввод каптчи через функции объекта $app:

Мы будем использовать функцию $app->dlg_captcha_from_url_exactly($url,$exactly);. Для этого для начала посмотрим src картинки. Src можно посмотреть в исходникам html страницы, либо через Инспектор Элементов в XHE, либо через контекстное меню, добавив в скрипт любую функцию работы картинки через src, например:$image->click_by_src(‘http://e.mail.ru/cgi-bin/x_image?num=2&x_reg_id=5yJ3cvUd&r=1326713669663’,true); Src картинки будет http://e.mail.ru/cgi-bin/x_image?num=2&x_reg_id=5yJ3cvUd&r=1326713669663. Сразу становится ясно, что src постоянно разный и к тому же каптча состоит из трёх картинок, поэтому быдем вызывать $app->dlg_captcha_from_url_exactly следующим образом:

То есть в результате работы этого кода мы получаем, что вся каптча распределена в трёх частях. Заполним поле каптчей используя следующий код:
$input->set_value_by_name_by_form_number(«code»,$cap.$cap1.$cap2,11); — где cap.$cap1.$cap2 распознанная каптча.

Примечание: Иногда когда поля находятся в формах (тэг form) функции $input->set_value_by_name могут не срабатывать
в этом случае следует использовать функцию $input->set_value_by_name_by_form_number.

Теперь наш скрипт будет выглядеть следующим образом:

Примечание: Иногда появляется необходимость задержать скрипт несколько дольше, чем это делает функция $browser->wait_for();.
Например когда открываются всплывающие окна в этот момент браузер может освободиться раньше, чем появится всплывающее окно. В этих случаях используется функция sleep(кол-во секунд);, которая останавливает работу скрипта на заданное количество секунд.

Теперь закончим регистрацию используя контекстное меню, как это мы делали выше. В итоге наш скрипт стал вот таким вот:

В следующей статье мы добавим использование прокси, завернём всё это в цикл, а так же добавим проверки на удачную регистрацию и запись удачных регистраций в файл.

Скрипт написан 16.01.12 в Human Emulator 4.2 Advanced. На момент публикации статьи скрипт был рабочий

скачать скрипт

Скрипт регистратор аккаунтов на сайте qip.ru.

Недавно обратил внимание, что в статьях Хумана есть много советов КАК делать скрипты, но мало объяснений ПОЧЕМУ лучше подходит тот или иной способ. Попробую исправить это упущение на примере авторегистратора для мыл qip.ru, который и для личного пользования пригодится.

Как обычно, всё начинается с создания нового скрипта. Конечно, есть несколько способов начать работу иным способом, но их мы рассматривать не будем.

В стандартном шаблоне присутствуют строки команд, направляющих наш браузер на Гугл. Вы можете легко проверить это, просто запустив скрипт. И легко догадаться, что переход этот выполняется из-за строки $browser->navigate(«http://www.google.com»); Поскольку цель моя – квип, вставляю qip.ru в строку вместо гугла и перехожу на этот сайт для дальнейшего изучения.

Регистрация скрывается в форме, появляющейся после нажатия ссылки «Войти на сайт». Через меню, открывающемся по правому клику на нужном элементе, добавляю в скрипт строку $anchor->click_by_inner_text(‘Войти на сайт’,true); .

На выбор есть ещё три:

Первый вариант использовать можно, но если в структуре сайта произойдут мелкие изменения и нужная нам ссылка изменит свой порядковый номер, то скрипт перестанет работать.
Второй надёжен примерно так же, как и выбранный мной, так что тут всё зависит от личных предпочтений. Просто если я вижу надпись «Войти на сайт» в функции, то смогу поискать её глазами на странице. Для того же, чтобы найти ссылку «http://qip.ru/login», необходимо навести на неё курсор мыши. Лишние движения.
По той же причине отпадает и третий вариант: click_by_atribute. Лишняя возня. В сложных ситуациях эта функция попросту незаменима, но сейчас не тот случай.

Через тоже самое меню, но уже выдаваемое для ссылки с текстом «Регистрация», добавляю функцию $anchor->click_by_inner_text(‘Регистрация’,true); Запустим получившийся скрипт для теста (от слова «тестировать», а не «тесто»)

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

Кстати, пока не забыл, нужно добавить функцию $browser->wait_for(); после $anchor->click_by_inner_text(‘Регистрация’,true); Она приостановит выполнение следующей после неё части скрипта до момента полной прогрузки страницы, а значит он не будет работать «в холостую».

Начинается самое интересное. Форму нужно заполнять данными, которые каждый раз будут новыми. Зачем — объяснять не требуется, надеюсь. Через тот-же правый клик на всех инпутах, составляю список функций для работы с ними. Только функция должна содержать не click_by (что значить «кликнуть по…»), а set_value_by («установить значение по…»). Тогда передаваемая нами в функцию информация будет заполнять инпуты сайта.

Стоп. При первом-же взгляде на предлагаемые варианты функций, бросается в глаза слишком длинное имя для инпута «Пользователь». Оно выглядит как случайный набор букв и цифр, и вполне возможно, что это имя меняется при каждом обновлении страницы. Следовательно, вариант set_value_by_name в данной ситуации отпадает. Хотя минутку… Функция set_value_by_name может использовать для поиска не только атрибут “name” но и “id”. На всякий случай стоит проверить, что за айди присвоено нужным нам инпутам. Проще и быстрее всего это сделать через ДОМ-модель, которая находится в выпадающем меню «Отладка».

В верхней части таблицы «ДОМ-модель» есть закладки, отвечающие за разные типы объектов. Нас интересуют инпуты, значит соответствующую закладку и нужно открыть. Проверял не зря – id нужного поля действительно имеет обычное и наверняка статичное название. Теперь, сверяясь с ДОМ-моделью, легко добавить в скрипт функции для работы со всеми нужными инпутами.

Получается вот такой список:

Как можно понять из пояснительного текста на странице, поля «E-mail», «Фамилия», «Имя», «Отчество» и «Город» не обязательны для заполнения, но что-то из них нужно вбить для возможной надобности восстановить пароль. Естественно, у нас подобной необходимости не возникнет, но квип об этом не знает, а потому будет стоять на своём. Попробую указывать емейлы и имя с фамилией.

Как заполнять нужные поля мы разобрались. Теперь займёмся тем, ЧТО будет в них вбиваться. Обычно подобными задачами занимается персональный Хумановский бредогенератор — объект $submitter. В его базе присутствуют списки имён, фамилий, улиц и т.д., а так же функции генерации случайного текста, чисел и ников. Они-то и будут придумывать логины, пароли и фейковые мыла.

После добавления функций из сабмиттера, скрипт приобрёл следующий вид:

Как видите, функция generate_random_text принимает на вход два параметра:
Количество знаков в генерируемом тексте. В данном случае я поставил rand(8,12), что будет выдавать разные числа от 8 и до 12.
Тип генерируемого текста. 1 – английские буквы 2 – русские.

Получившееся можно запустить и полюбоваться, но это ещё не всё. Следующими на очереди будут раскрывающиеся листбоксы, предлагающие выбрать дату рождения пользователя. Тут всё так-же просто, как и прежде: последовательно кликаем правой кнопкой мышки на каждый и добавляем функцию select_num_value_by_name для всех трёх. Эта функция выберет значение в выпадающей менюшке листбокса по его (значения) номеру. Так будет значительно проще создавать случайные даты рождения, в чём вы сможете убедиться чуть позже.

В итоге, в конец скрипта добавились следующие три строки:

Единицы в качестве второго аргумента каждой функции поставил я. Просто для проверки того, как сработает функция. После запуска скрипта с этими изменениями день и месяц рождения выставились на «1» и «январь» соотвественно, а вот год остался без изменений. Попробую 2000. Эврика!

Поскольку даты рождения нужны случайные, воспользуемся спасительной функцией rand(); уже появлявшейся ранее. С ней нужные строки приобрели следующий вид:

Как видите, у первой строки крайнее число 28. Это сделано из-за кастрированного месяца февраля, который тоже может выпасть. Если захотеть, то можно высчитывать и високосные годы, и месяцы с 30 или 31 днём, но всё упирается в популярный вопрос «Оно нам надо?»

Следующие на очереди два обязательных радиобокса (крупная такая точка для тырканья мышкой), которые, в теории, должны определить наличие Y-хромосомы у пользователя. К счастью, нам верят на слово, так что тут тоже можно использовать случайный выбор одного из предложенных вариантов.

Правый щелчок мышью на первом (мужском) радиобоксе, помимо кучи бесполезных функций, отображает его номер: 0. А второй (женский) оказывается номером 1. Такой расклад очень подходит для следующей функции, которую мы и добавим в скрипт:

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

Последнее обязательное поле – каптча, якобы призванная стоять на фейсконтроле и защищать ресурс от посягательств роботов. Святая наивность! Единственное, что удерживает роботов от порабощения этого мира – оно им нафиг не нужно. Как и умение распознавать каптчи, в принципе. Поэтому, сначала мы встроим в скрипт ручную распознавалку, а позднее подключим антикаптчу с трудолюбивыми индусами.

Чтобы отправить каптчу на распознание или показать её в отдельном диалоговом окне, нужно сохранить её картинку на жёсткий диск. Поэтому обращайте внимание на функции со словами «save_to_file_by», когда будете смотреть менюшку после ставшего уже привычным правого клика по картинке.

Нужных функций на выбор три:


Первая. Картинка на странице единственная, и вполне вероятно что так оно и останется ещё долго. Можно использовать без колебаний.

Вторая. Название картинки не выглядит генерирующимся случайно, так что использование этой функции тоже вполне оправдано.

Третья. Цифры в урле картинки смущают. При желании, можно сохранять картинку и этой функцией, но часть урла придётся отрезать. Функция будет выглядеть примерно так: $image->save_to_file_by_url(‘http://qip.ru/api/captcha?’,’C:\tmp.jpeg’,false); Помимо обрезки урла, я сменил третий аргумент с true на false. Это значит, что путь к картинке указан не полностью, и функция будет искать первое похожее совпадение.

После строки сохранения открываем меню «Добавить код» (альт+контрол+вправо, если вы не смотрели видео на сайте программы) и втыкаем из объекта $app функцию dlg_captcha_from_url. В качестве урла указываем ‘C:\tmp.jpeg’ из предыдущей функции. Можно запустить и проверить что будет. Хотя нет, один момент. То, что будет возвращать функция $app->dlg_captcha_from_url, нужно поместить в переменную. К примеру, $cap. А потом вставлять содержимое этой переменной в поле ввода текста с каптчи. Если вы уже запутались во всех этих пояснениях, то вот текст скрипта, что должен у нас получиться к этому моменту:

Можете запустить это дело пару раз, осознать величие происходящего, проникнуться моментом и вернуться к дальнейшей работе.

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

Помимо инпутов для ФИО, остался один нюанс. Поле для ввода логина выдаёт подсказки, занят ли логин, или свободен, если текст набирать вручную. Но мы-то вставляем нужные данные в страницу напрямую, без помощи таких примитивных средств как ручной набор. Потому форме нужно отдельно отправить событие, будто мы честно и благородно, портя зрение и зарабатывая сколиоз, трудолюбиво и аккуратно впечатываем интересующий нас логин пальчиками. Делается это с помощью функций, в которых присутствуют слова send_event.

Только перед этим нужно разобраться, какое именно событие ожидает инпут от пользователя. Узнать это не так сложно — просто загляните снова в ДОМ модель, в раздел инпутов. Для событий, присвоенных элементам, есть отдельная колонка. Самая последняя, под названием «events». К нашему инпуту привязан лишь один эвент — «onkeyup». Посылаем его с помощью функции $input->send_event_by_name(‘reg_username’,’onkeyup’);

Хм. Не срабатывает. Попробую $input->send_event_by_number(2,’onkeyup’); Так работает. Выяснилось, что хоть функция $input->set_value_by_name и работает, помимо имени, с ID элемента, $input->send_event_by_name принимает только имя. Печальное открытие, но ничего страшного – есть равнозначная альтернатива. Функция $input->send_event_by_atribute(«id»,»reg_username»,true,’onkeyup’); делает именно то, чего мы и хотели.

Начинается самый сложный к восприятию момент. Мы должны научить скрипт проверять наличие текста «Логин занят.» на странице и соответственно реагировать.

Сначала поиск. Текущее содержимое страницы в текстовом виде можно получить функцией $webpage->get_body(); Где-то в этом содержимом и будет болтаться искомая нами фраза, обнаружить которую можно с помощью функции «чистого» PHP strpos. Она ищет позицию вхождения текста, и если найдёт – значит, текст присутствует. А если нет – всё в порядке и логин доступен.

Выглядеть эта функция будет так: strpos ($webpage->get_body(), «Логин занят»); В аргументах: 1) Где искать 2) Что искать.

Но мало найти текст, нужно также определиться с последующими действиями. А они предполагают замену уже зарегистрированного кем-то логина на новый. Для этой цели лучше всего подойдёт цикл while, на русском означающий что-то вроде «До тех пор…». То есть, содержимое цикла будет выполняться до тех пор, пока условие, указанное в начале, не будет нарушено:

Вы можете заметить, что в конце цикла у меня стоит sleep(5) – пауза в пять секунд. Это примерное время, нужное форме, чтобы сравнить новый логин со своей базой и выдать ответ, свободен ли он. Если мы не выдержим паузу, ответ появится слишком поздно и наша проверка доступности логина не сработает.

Итак, с проверкой закончили. Если сомневаетесь с местом, куда нужно впихнуть получившийся код, смело ставьте его сразу после ввода каптчи.

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

В начале скрипта есть строка, отвечающая за пол пользователя. Значит, для пущей правдоподобности имя и фамилия должны соответствовать этому выбору. Кстати, ту строку придётся изменить в соответствии с текущими потребностями. Из одной $radiobox->set_checked_by_number(rand(0,1),true); получится две:

После этого, в зависимости от содержимого переменной $s, можно создать вставку фамилий нужного пола. Это будет выглядеть примерно так:

Судя по всему, скрипт практически готов. Осталось лишь добавить клик по кнопке «Регистрация», что будет отправлять введённые данные на сервер. Ставший уже привычным клик правой кнопкой и функция $button->click_by_name(‘register’); добавляется в скрипт… И не срабатывает. Снова лезем в ДОМ модель, на этот раз закладка «button». Так и есть, нужно добавить эвент $button->send_event_by_name(‘register’,’onclick’); Теперь вставим после всего этого функцию $browser->wait_for(); и порядок.

Запустив скрипт несколько раз можно заметить, что пользы от него как-то маловато. Да, он регистрирует аккаунты (а может уже написал вам что-то вроде «Слишком много регистраций с одного IP»), но результат его деятельности никуда не сохраняется. То есть, у нас на руках не остаётся логинов с паролями, без которых весь этот процесс лишён смысла. Исправим.

Процесс сохранения текста в файл прост и незамысловат. Нужна лишь функция $textfile->add_string_to_file($file,$str,$timeout); которая заботливо запишет все нужные нам данные, если её правильно настроить. Вместо аргумента $file необходимо указать путь к сохраняемому файлу. Если файла не существует, функция его создаст. $str – строка, которую мы сохраняем. Помните, мы добавляли в переменные $user и $pass результат работы бредогенератора? Они-то нам и нужны. Третий аргумент – время, в течение которого функция будет пытаться записать файл. С нашими объёмами текста хватит и тысячной секунды, а я обычно ставлю там десятку, с запасом. Заполненная функция выглядит примерно так:

Смело вставляйте её в самом конце скрипта, сразу за нажиманием кнопки «Регистрация». Постепенно мой скрипт приобрёл следующий вид:

В самом начале скрипта вы можете заметить две новые строчки – очистку кэша и куков. Ещё к ним неплохо бы добавить функцию установки прокси, поскольку квип, как оказалось, весьма капризен, и не позволяет регистрировать тучи аккаунтов с одного айпи. С прокси возможно два варианта: 1) на каждую проксю выполнять одну регистрацию и брать следующую 2) регистрировать аккаунты до появления надписи «Слишком много регистраций». Первое организовывается циклом for или foreach:

Второе требует проверки наличия на странице предупреждающего сообщения. Этим мы уже занимались на примере с занятостью логинов чуть выше, но тут будет модификация:

Такой подход позволит регистрировать аккаунты до появления надписи, менять прокси и продолжать регистрацию уже с нового айпи. Модификация заключается в том, что теперь данные логина и пароля будут записываться лишь при успешной регистрации. Её неплохо бы добавить и в первый вариант, но это теперь можно сделать самостоятельно. Дальнейшие пояснения будут даваться для второго варианта.

Снова проверяя получившийся скрипт в действии я неправильно ввёл одну каптчу, но это было засчитано программой за успешную регистрацию, потому данные записались в файлик и работа пошла по новой. Сие натолкнуло на мысль, что надобно бы сделать проверку и для неправильно введённой каптчи. На примере наших прошлых достижений можно разобраться и наваять что-то такое:

Поскольку после ошибки сайт показывает новую каптчу, мы снова её сохраняем. После этого вводим и самбитим. Если вдруг каптча будет снова введена неправильно, цикл while будет срабатывать, пока не пропадёт надпись «Неверный код подтверждения». То есть, до успешного распознания.

На этом скрипт представляется мне готовым. Возможно, в процессе его использования всплывут какие-то ещё нюансы, но сейчас я этого не знаю. Привожу его полный вариант со всеми проверками и несколькими косметическими поправками:

Статья для владельцев однопоточной версии программы на этом заканчивается. А вот пользователи МТ могут задержаться и посмотреть, как изменяется этот же самый скрипт с учётом предстоящей работы в многопоточном режиме.

Давайте сначала определимся с вещами, которые во многопотоке должны работать не так, как сейчас.

  • 1. Уверен, что распознавать каптчу вручную при использовании многопотока никто не будет. Необходимо заменить ответственную за это часть на антикапчевских индусов.
  • 2. Прокси не должны браться по порядку. Если десяток-другой потоков вдруг через одну проксю ломанётся регистрировать акки, то сработает это лишь у некоторых из них. Остальные увидят надпись «Много регистраций с одного айпи» и возьмут следующую. Которая тоже, в свою очередь, будет использоваться и другими потоками… В общем, стоит избегать работы «вхолостую».

Пожалуй, всё.

Первое решается простой заменой:

текущего скрипта меняется на:

в обоих случаях.

Переменная со случайным числом в начале отвечает за то, чтобы потоки не дрались за отправку каптчи. Без неё возможны ситуации, когда отправлена будет совсем не та картинка, потому ответ придёт заведомо неправильный.

Второе тоже решаемо, но требует применения соображаловки. Можно из списка прокси брать и использовать случайную. После возникновения сообщения об айпи удалять её из файла и брать новую. Можно брать прокси, по счёту кратную количеству запущенных потоков. Но я обычно использую стандартную заготовку: создаю текстовый файлик, в котором каждый поток записывает номер используемой прокси плюс единичка. В процессе получается, что каждый поток берёт следующую по списку прокси по мере надобности, а не в порядке очереди. Чтобы добавить это в код, его придётся слегка переделать.

Самое начало скрипта:

И самый конец скрипта:

Остался последний штрих – подготовить всю эту писанину к запуску. Чтобы всего этого избежать, нужно внимательно и без косяков выполнить следующую последовательность действий:

  • 1. В строке $xhe_host =»127.0.0.1:7010″; скрипта заменить 7010″; на «.$argv[1]; Получится $xhe_host =»127.0.0.1:».$argv[1]; Сохранить.
  • 2. Запустить XHEManager из корневика программы и добавить в нём наш скрипт, указав желаемое количество потоков и номер порта, с которого пойдёт отсчёт для остальных копий.
  • 3. Менеджер покажет список потоков, готовых к труду и обороне. Проигнорируйте его и через меню «Файл» создайте BAT файл. В этом файлике будут записаны все данные, необходимые для запуска.
  • 4. Запустите получившийся BAT файлик.
  • 5. ……………
  • 6. PROFIT!!!!!

Сказать по правде, запускать этот скрипт многопоточно я не планирую. Все разъяснения по настройке лишь для примера. Но если вы решитесь на сей подвиг и столкнётесь с какими-либо ошибками, смело ругайтесь матом в аську техподдержки. По опыту, каждая жалоба туда сдвигает исправление какой-либо огорчающей вас фичи в приоритетах на один пункт вверх по списку.

Напоследок привожу конечный вариант скрипта:

Производительность скрипта очень сильно зависит от скорости и качества используемых прокси.

Скрипт написан 18.01.2012 в Human Emulator 4.2 Advanced.
На момент публикации статьи 23.01.2012 скрипт был рабочий.

скачать скрипт