Скрипт регистратор мыла на примере mail.ru. Часть 2.
Итак, из предыдущей статьи у нас есть следующий скрипт, который регистрирует один аккаунт за один запуск скрипта:
<?php
$xhe_host ="127.0.0.1:7010";
// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
$browser->navigate("http://mail.ru/");
$browser->wait_for(60,1);
// перейти на страницу регистрации
$anchor->click_by_inner_text("Регистрация в почте ",true);
$browser->wait_for();
// рандомно выставлять пол аккаунта
$gnd=rand(1,2);
switch($gnd)
{
case 1:
$gender = "man";
break;
case 2:
$gender = "woman";
break;
}
// задать имя
$input->set_value_by_number(0,$submitter->generate_random_name("RU",$gender));
// задать фамилию
$input->set_value_by_number(1,$submitter->generate_random_second_name("RU",$gender));
// день
$listbox->select_random_value_by_number(0);
// месяц
$listbox->select_random_value_by_number(1);
// год
$listbox->select_random_value_by_number(2);
// выберем пол
$radiobox->set_checked_by_value($gnd,true);
// логин для почты
$mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000);
// установим сгенерённый логин в поле
$input->set_value_by_number(3,$mail_login);
// сгенерить пароль для мыла
$pwd = $submitter->generate_random_text(rand(7,11),1);
// пароль
$input->set_value_by_number(4,$pwd);
// подтверждение пароля
$input->set_value_by_number(5,$pwd);
// перейти на заполнение полей без телефона
$anchor->click_by_inner_text("У меня нет мобильного телефона",true);
$browser->wait_for();
// выберем случайный вопрос
$listbox->select_random_value_by_number(5);
// заполним поле ответа
$ans= $submitter->generate_random_text(rand(5,9),1);
$input->set_value_by_number(8,$ans);
// зарегистрировать
$button->click_by_number(1);
$browser->wait_for();
sleep(1);
// распознать каптчу тройную каптчу
$cap = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=1",false);
$cap1 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=2",false);
$cap2 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=3",false);
sleep(1);
// задать каптчу
$input->set_value_by_name_by_form_number("code",$cap.$cap1.$cap2,11);
sleep(1);
// закончить с каптчей
$button->click_by_number(20);
$browser->wait_for();
// Quit
$app->quit();
?>
Наша задача добавить в скрипт работу с прокси, различные проверки на удачную регистрацию и запись удачных логинов и паролей в файл.
Начнём с прокси. Допустим у нас есть какой то файл с прокси 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"); и сразу же создадим цикл, который будет основан на количестве проксей - то есть мы будем регистрировать столько же аккаунтов сколько у нас рабочих проксей в файле, для этого добавим следующий код:
<?php
// цикл пройтись по всем прокси в массиве
for($i=0;$i<count($proxies);$i++)
{
// получить прокси из массива
$proxy = $proxies[$i];
// задать прокси браузеру
$browser->enable_proxy("all connections",$proxy);
// тут будет наш скрипт
}
?>
Примечание: как работать с файлами в XHE описано в статье работа с файлами. Как организовывать циклы описано в статье работа с циклами
В итоге наш скрипт будет выглядеть теперь так:
<?php
$xhe_host ="127.0.0.1:7010";
// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// получаем прокси из файла в массив
$proxies= file("proxy.txt");
// организовываем цикл на основе массива с проксями
for($i=0;$i<count($proxies);$i++)
{
// получить прокси из массива
$proxy = $proxies[$i];
// задать прокси браузеру
$browser->enable_proxy("all connections",$proxy);
$browser->navigate("http://mail.ru/");
$browser->wait_for(60,1);
// перейти на страницу регистрации
$anchor->click_by_inner_text("Регистрация в почте ",true);
$browser->wait_for();
// рандомно выставлять пол аккаунта
$gnd=rand(1,2);
switch($gnd)
{
case 1:
$gender = "man";
break;
case 2:
$gender = "woman";
break;
}
// задать имя
$input->set_value_by_number(0,$submitter->generate_random_name("RU",$gender));
// задать фамилию
$input->set_value_by_number(1,$submitter->generate_random_second_name("RU",$gender));
// день
$listbox->select_random_value_by_number(0);
// месяц
$listbox->select_random_value_by_number(1);
// год
$listbox->select_random_value_by_number(2);
// выберем пол
$radiobox->set_checked_by_value($gnd,true);
// логин для почты
$mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000);
// установим сгенерённый логин в поле
$input->set_value_by_number(3,$mail_login);
// сгенерить пароль для мыла
$pwd = $submitter->generate_random_text(rand(7,11),1);
// пароль
$input->set_value_by_number(4,$pwd);
// подтверждение пароля
$input->set_value_by_number(5,$pwd);
// перейти на заполнение полей без телефона
$anchor->click_by_inner_text("У меня нет мобильного телефона",true);
$browser->wait_for();
// выберем случайный вопрос
$listbox->select_random_value_by_number(5);
// заполним поле ответа
$ans= $submitter->generate_random_text(rand(5,9),1);
$input->set_value_by_number(8,$ans);
// зарегистрировать
$button->click_by_number(1);
$browser->wait_for();
sleep(1);
// распознать каптчу тройную каптчу
$cap = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=1",false);
$cap1 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=2",false);
$cap2 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=3",false);
sleep(1);
// задать каптчу
$input->set_value_by_name_by_form_number("code",$cap.$cap1.$cap2,11);
sleep(1);
// закончить с каптчей
$button->click_by_number(20);
$browser->wait_for();
}
// Quit
$app->quit();
?>
Теперь добавим проверку и запись удачно зарегистрированного аккаунта в файл. Для записи в файл будем использовать функцию объекта для работы 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 следующим образом: $acc=$element->get_element_innerText_by_id("portal-menu__user-email");. теперь осталась добавить проверку через оператор if. в Результате мы получили:
<?php
// получаем акк под которым зашли в почту
$acc=$element->get_element_innerText_by_id("portal-menu__user-email");
// проверяем на соответсвие
if($acc==$mail_login."@mail.ru")
{
// запись в файл удачно зарегистрированного аккаунта
$textfile->add_string_to_file($res_file,"$mail_login@mail.ru;$pwd\n",60);
}
else
{
echo "не удачная регистрация <br>";
}
?>
Примечание: команда echo служит для вывода информации в панель отладки.
Теперь наш скрипт выглядит следующим образом:
<?php
$xhe_host ="127.0.0.1:7010";
// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// получаем прокси из файла в массив
$proxies= file("proxy.txt");
// путь к файлу с аккаунтами
$res_file = "mail_accs.txt";
// организовываем цикл на основе массива с проксями
for($i=0;$i<count($proxies);$i++)
{
// получить прокси из массива
$proxy = $proxies[$i];
// задать прокси браузеру
$browser->enable_proxy("all connections",$proxy);
$browser->navigate("http://mail.ru/");
$browser->wait_for(60,1);
// перейти на страницу регистрации
$anchor->click_by_inner_text("Регистрация в почте ",true);
$browser->wait_for();
// рандомно выставлять пол аккаунта
$gnd=rand(1,2);
switch($gnd)
{
case 1:
$gender = "man";
break;
case 2:
$gender = "woman";
break;
}
// задать имя
$input->set_value_by_number(0,$submitter->generate_random_name("RU",$gender));
// задать фамилию
$input->set_value_by_number(1,$submitter->generate_random_second_name("RU",$gender));
// день
$listbox->select_random_value_by_number(0);
// месяц
$listbox->select_random_value_by_number(1);
// год
$listbox->select_random_value_by_number(2);
// выберем пол
$radiobox->set_checked_by_value($gnd,true);
// логин для почты
$mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000);
// установим сгенерённый логин в поле
$input->set_value_by_number(3,$mail_login);
// сгенерить пароль для мыла
$pwd = $submitter->generate_random_text(rand(7,11),1);
// пароль
$input->set_value_by_number(4,$pwd);
// подтверждение пароля
$input->set_value_by_number(5,$pwd);
// перейти на заполнение полей без телефона
$anchor->click_by_inner_text("У меня нет мобильного телефона",true);
$browser->wait_for();
// выберем случайный вопрос
$listbox->select_random_value_by_number(5);
// заполним поле ответа
$ans= $submitter->generate_random_text(rand(5,9),1);
$input->set_value_by_number(8,$ans);
// зарегистрировать
$button->click_by_number(1);
$browser->wait_for();
sleep(3);
// распознать каптчу тройную каптчу
$cap = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=1",false);
$cap1 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=2",false);
$cap2 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=3",false);
sleep(1);
// задать каптчу
$input->set_value_by_name_by_form_number("code",$cap.$cap1.$cap2,11);
// закончить с каптчей
$button->click_by_number(20);
$browser->wait_for();
sleep(3);
// получаем акк под которым зашли в почту
$acc=$element->get_element_innerText_by_id("portal-menu__user-email");
// проверяем на соответсвие
if($acc==$mail_login."@mail.ru")
{
// запись в файл удачно зарегистрированного аккаунта
$textfile->add_string_to_file($res_file,"$mail_login@mail.ru;$pwd\n",60);
}
else
{
echo "не удачная регистрация <br>";
}
}
// Quit
$app->quit();
?>
Если запустить этот скрипт то у нас возникнут проблемы при регистрации второго и последующих аккаунтов так как прежде чем регистрировать новый аккаунт желательно выйти из последнего зареганного аккаунта. К тому же нам нужно ещё менять данные браузера, чистить кэш и менять user-agent строку, можно менять размер браузера и т.д..
Как показала практика работы с хуманом наилучший результат по анонимности и работы с памятью достигается при использовании закладок браузера и последующем их закрытии. Для этого в начало цикла добавим следующий код:
// задаём количество браузеров $browser->set_count(2); // делаем активный следующим $browser->set_active_browser(1,true);Так же до цикла делаем переход основного браузера на пустую страницу: $browser->navigate('about:blank');
В конце цикла добавим следующий код, который будет чистить данные браузера, а потом закрывать открытый в начале скрипта браузер:
<?php
// чистим данные браузера
$browser->clear_cache();
$browser->clear_history();
$browser->clear_cookies("",false);
// сделаем активным главный браузер
$browser->set_active_browser(0,true);
// закрыть все браузеры
$browser->close_all_tabs();
?>
В итоге наш скрипт стал:
<?php
$xhe_host ="127.0.0.1:7010";
// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// получаем прокси из файла в массив
$proxies= file("proxy.txt");
// путь к файлу с аккаунтами
$res_file = "mail_accs.txt";
// перейдём на пустую страницу
$browser->navigate("about:blank");
$browser->wait_for(60,1);
// организовываем цикл на основе массива с проксями
for($i=0;$i<count($proxies);$i++)
{
// задаём количество браузеров
$browser->set_count(2);
// делаем активный следующим
$browser->set_active_browser(1,true);
// получить прокси из массива
$proxy = $proxies[$i];
// задать прокси браузеру
$browser->enable_proxy("all connections",$proxy);
$browser->navigate("http://mail.ru/");
$browser->wait_for(60,1);
// перейти на страницу регистрации
$anchor->click_by_inner_text("Регистрация в почте ",true);
$browser->wait_for();
// рандомно выставлять пол аккаунта
$gnd=rand(1,2);
switch($gnd)
{
case 1:
$gender = "man";
break;
case 2:
$gender = "woman";
break;
}
// задать имя
$input->set_value_by_number(0,$submitter->generate_random_name("RU",$gender));
// задать фамилию
$input->set_value_by_number(1,$submitter->generate_random_second_name("RU",$gender));
// день
$listbox->select_random_value_by_number(0);
// месяц
$listbox->select_random_value_by_number(1);
// год
$listbox->select_random_value_by_number(2);
// выберем пол
$radiobox->set_checked_by_value($gnd,true);
// логин для почты
$mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000);
// установим сгенерённый логин в поле
$input->set_value_by_number(3,$mail_login);
// сгенерить пароль для мыла
$pwd = $submitter->generate_random_text(rand(7,11),1);
// пароль
$input->set_value_by_number(4,$pwd);
// подтверждение пароля
$input->set_value_by_number(5,$pwd);
// перейти на заполнение полей без телефона
$anchor->click_by_inner_text("У меня нет мобильного телефона",true);
$browser->wait_for();
// выберем случайный вопрос
$listbox->select_random_value_by_number(5);
// заполним поле ответа
$ans= $submitter->generate_random_text(rand(5,9),1);
$input->set_value_by_number(8,$ans);
// зарегистрировать
$button->click_by_number(1);
$browser->wait_for();
sleep(3);
// распознать каптчу тройную каптчу
$cap = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=1",false);
$cap1 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=2",false);
$cap2 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=3",false);
sleep(1);
// задать каптчу
$input->set_value_by_name_by_form_number("code",$cap.$cap1.$cap2,11);
// закончить с каптчей
$button->click_by_number(20);
$browser->wait_for();
sleep(3);
// получаем акк под которым зашли в почту
$acc=$element->get_element_innerText_by_id("portal-menu__user-email");
// проверяем на соответсвие
if($acc==$mail_login."@mail.ru")
{
// запись в файл удачно зарегистрированного аккаунта
$textfile->add_string_to_file($res_file,"$mail_login@mail.ru;$pwd\n",60);
}
else
{
echo "не удачная регистрация <br>";
}
// чистим данные браузера
$browser->clear_cache();
$browser->clear_history();
$browser->clear_cookies("",false);
// сделаем активным главный браузер
$browser->set_active_browser(0,true);
// закрыть все браузеры
$browser->close_all_tabs();
}
// Quit
$app->quit();
?>
Теперь добавим работу с 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");
Теперь наш скрипт имеет вид:
<?php
$xhe_host ="127.0.0.1:7010";
// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// получаем прокси из файла в массив
$proxies= file("proxy.txt");
// строки юзер агент
$useragents = file("useragent.txt");
// путь к файлу с аккаунтами
$res_file = "mail_accs.txt";
// перейдём на пустую страницу
$browser->navigate("about:blank");
$browser->wait_for(60,1);
// организовываем цикл на основе массива с проксями
for($i=0;$i<count($proxies);$i++)
{
// задаём количество браузеров
$browser->set_count(2);
// делаем активный следующим
$browser->set_active_browser(1,true);
// задать user-agent строку
$browser->set_user_agent($useragents[rand(0,count($useragents)-1)]);
// получить прокси из массива
$proxy = $proxies[$i];
// задать прокси браузеру
$browser->enable_proxy("all connections",$proxy);
$browser->navigate("http://mail.ru/");
$browser->wait_for(60,1);
// перейти на страницу регистрации
$anchor->click_by_inner_text("Регистрация в почте ",true);
$browser->wait_for();
// рандомно выставлять пол аккаунта
$gnd=rand(1,2);
switch($gnd)
{
case 1:
$gender = "man";
break;
case 2:
$gender = "woman";
break;
}
// задать имя
$input->set_value_by_number(0,$submitter->generate_random_name("RU",$gender));
// задать фамилию
$input->set_value_by_number(1,$submitter->generate_random_second_name("RU",$gender));
// день
$listbox->select_random_value_by_number(0);
// месяц
$listbox->select_random_value_by_number(1);
// год
$listbox->select_random_value_by_number(2);
// выберем пол
$radiobox->set_checked_by_value($gnd,true);
// логин для почты
$mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000);
// установим сгенерённый логин в поле
$input->set_value_by_number(3,$mail_login);
// сгенерить пароль для мыла
$pwd = $submitter->generate_random_text(rand(7,11),1);
// пароль
$input->set_value_by_number(4,$pwd);
// подтверждение пароля
$input->set_value_by_number(5,$pwd);
// перейти на заполнение полей без телефона
$anchor->click_by_inner_text("У меня нет мобильного телефона",true);
$browser->wait_for();
// выберем случайный вопрос
$listbox->select_random_value_by_number(5);
// заполним поле ответа
$ans= $submitter->generate_random_text(rand(5,9),1);
$input->set_value_by_number(8,$ans);
// зарегистрировать
$button->click_by_number(1);
$browser->wait_for();
sleep(3);
// распознать каптчу тройную каптчу
$cap = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=1",false);
$cap1 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=2",false);
$cap2 = $app->dlg_captcha_from_url_exactly("http://e.mail.ru/cgi-bin/x_image?num=3",false);
sleep(1);
// задать каптчу
$input->set_value_by_name_by_form_number("code",$cap.$cap1.$cap2,11);
// закончить с каптчей
$button->click_by_number(20);
$browser->wait_for();
sleep(3);
// получаем акк под которым зашли в почту
$acc=$element->get_element_innerText_by_id("portal-menu__user-email");
// проверяем на соответсвие
if($acc==$mail_login."@mail.ru")
{
// запись в файл удачно зарегистрированного аккаунта
$textfile->add_string_to_file($res_file,"$mail_login@mail.ru;$pwd\n",60);
}
else
{
echo "не удачная регистрация <br>";
}
// чистим данные браузера
$browser->clear_cache();
$browser->clear_history();
$browser->clear_cookies("",false);
// сделаем активным главный браузер
$browser->set_active_browser(0,true);
// закрыть все браузеры
$browser->close_all_tabs();
}
// отключение прокси
$browser->disable_proxy("all connections");
// Quit
$app->quit();
?>
Производительность скрипта очень сильно зависит от скорости и качества используемых прокси.
Скрипт написан 18.01.2012 в XHE 4.2 MT.
На момент публикации статьи 23.01.2012 скрипт был рабочий.
Количество скачиваний: 7