Создание случайных данных пользователя для автозаполнения различных форм в интернете с помощью программы Хуман Эмулятор.
Присоединяйтесь к нам в ВК:
https://vk.com/humanemulator
https://vk.com/xscripts
https://vk.com/club130582676
Создание случайных данных пользователя для автозаполнения различных форм в интернете с помощью программы Хуман Эмулятор.
Присоединяйтесь к нам в ВК:
https://vk.com/humanemulator
https://vk.com/xscripts
https://vk.com/club130582676
В коллекцию наших скриптов для социальных сетей добавился новый скрипт. Вашему вниманию предлагается простой скрипт регистрации в твиттере.
Скрипт работает следующим образом: Вы указываете в настройках ключ к сервису распознавания капч antigate.com и email для региcтрации и запускаете скрипт на выполнение. Human Emulator переходит на страницу регистрации, вводит все необходимые данные, в случае необходимости разгадывает капчу. После переходит на указанный в настройках скрипта email, находит письмо пришедшее с твиттера и переходит по ссылке активации. В случае удачной активации пишет логин и пароль от Вашего нового аккаунта twitter.com в указанный в настройках скрипта файл в формате логин;пароль.
Для активации через почту скрипт использует мыльники почтового сервиса mail.ru. У нас на сайте можно найти скрипт регистрации почтовых аккаунтов mail.ru, а также приобрести пакет из 5 регистраторов почтовых аккаунтов.
Настройки скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// //////////////////////// настройки скрипта ///////////////////////// // ключ сервиса антикапчи $apikey = "ваш ключ"; // паузы для отработки java script-в $wt = 2; $wt_long = 12; // данные почты для регистрации $str_mail_lg = "emelyan.kovalevskiy@mail.ru"; $str_mail_pwd = "thmkfpba"; // путь к файлу куда будет записываться зарегистрированный аккаунт $path_to_acc = "res/accounts.txt"; |
Сам скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
<!--?php /* производитель: x-scripts ** тип продукта: скрипт под Xweb Human Emulator ** сайт программы: humanemulator.info ** наш сайт: x-scripts.com ** по всем вопросам обращайтесь: ** email: order@x-scripts.com ** icq: 625657402 ** skype: igor_sev2 */ $xhe_host ="127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // //////////////////////// настройки скрипта ///////////////////////// // ключ сервиса антикапчи $apikey = ""; // ожидание $wt = 2; $wt_long = 12; // данные почты для регистрации $str_mail_lg = "emelyan.kovalevskiy@mail.ru"; $str_mail_pwd = "thmkfpba"; // путь к файлу с аккаунтами $path_to_acc = "res/accounts.txt"; // скрипт работает в режим отладки $dbg = true; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // /////////////////////// скрипт /////////////////////////////////////////// debug_mess(" скрипт запустили"); // переходим на сайт $browser->navigate("http://twitter.com/"); // выбрать язык $anchor->click_by_href("#supported_languages",false); sleep($wt); $anchor->click_by_inner_text("Русский",false); sleep($wt); // перейти в регистрации $btn->click_by_inner_text("Регистрация ",false); sleep($wt); // имя $name = $submitter->generate_random_nick_name(rand(5,10)); sleep($wt); $input->set_value_by_name_by_form_name("user[name]",$name,"phx-signup-form"); sleep($wt); // указать почту $input->set_value_by_name_by_form_name("user[email]",$str_mail_lg,"phx-signup-form"); sleep($wt); // пароль $num = $submitter->generate_random_number(1000,9999,true); sleep($wt); $text = $submitter->generate_random_text(rand(5,11),1); sleep($wt); $pass = $text.$num; sleep($wt); $input->set_value_by_name_by_form_name("user[user_password]",$pass,"phx-signup-form"); sleep($wt); // имя пользователя $input->set_value_by_name_by_form_name("user[screen_name]",$name.$num,"phx-signup-form"); // убрать отметку $checkbox->click_by_name_by_form_name("user[remember_me_on_signup]","phx-signup-form"); sleep($wt); $checkbox->click_by_name_by_form_name("user[use_cookie_personalization]","phx-signup-form"); sleep($wt); // создать учетную запись $button->click_by_inner_text("Создать учётную запись",false); sleep($wt_long); // капча while ($input->is_exist_by_name("recaptcha_response_field")) { $image->screenshot_by_src("C:\\temp\\tmp.jpeg","https://www.google.com/recaptcha/api/image?c=",false); sleep($wt); $capcha = $anticapcha->recognize("C:\\temp\\tmp.jpeg", $apikey, $path ='http://www.anti-captcha.com', $is_verbose = true, $rtimeout = 5, $mtimeout = 120, $is_phrase = 1, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0,$is_russian = 0); sleep($wt); $input->set_value_by_name_by_form_name("recaptcha_response_field",$capcha,"phx-signup-form"); sleep($wt); $button->click_by_inner_text("Создать учётную запись",false); sleep($wt); } // продолжить регистрацию $anchor->click_by_inner_text("Далее",false); sleep($wt); // читать 5 человек $btn->click_by_number(3); $btn->click_by_number(4); $btn->click_by_number(5); $btn->click_by_number(6); $btn->click_by_number(7); sleep($wt); // далее $anchor->click_by_inner_text("Далее",false); sleep($wt); // читать 5 известных людей $anchor->click_by_inner_text("новости ",false); sleep($wt); $btn->click_by_number(3); $btn->click_by_number(4); $btn->click_by_number(5); $btn->click_by_number(6); $btn->click_by_number(7); sleep($wt); // далее $anchor->click_by_inner_text("Далее",false); sleep($wt); // пропустить $anchor->click_by_inner_text("Пропустить »",false); sleep($wt); // Отправить подтверждение ещё раз $anchor->click_by_inner_text("Отправить подтверждение ещё раз",false); sleep($wt); // подтвердить аккаунт accept_from_mail(); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу<br>"); // Quit $app->quit(); ?--> |
Скрипт написан 29.11.2013 в Human Emulator 4.6.39 Advanced.
Данный скрипт демонстрирует на примере регистрации почты hotmail.com, как с помощью программы Human Emulator можно делать регистрацию на буржуйских сайтах.
Как и во всех подобных наших скриптах результат сохраняется в заданный файл в формате: мыло;пароль
На нашем сайте уже есть примеры подобных скриптов регистрация mail.ru, регистрация почты yandex.ru и регистрация почты rambler.ru.
Файл с зарегистрированными ящиками выглядит следующим образом:
liwotodab@hotmail.com;govkjnwbd1970
gucorepuli@hotmail.com;tncijojqrn1971
tucomumas@hotmail.com;micddzun1980
sudicawi@outlook.com;bmdmlsucdu1975
nugapewoja@hotmail.com;csvlella1983
boximesig@live.com;ufpesxstu1982
gakuqamuko@outlook.com;jupcwtnhm1988
Вся работа над распознаем капчи реализована с помощью сервиса antigate.com и для работы скрипта вам понадобится ключ с этого сервиса. Так же для работы скрипта понадобятся прокси. Прокси можно купить тут. При покупке проксей будьте внимательны, некоторые прокси запрещены для массовых регистраций.
Настройки скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ключ антикаптчи $apikey = "ключ антикапчи"; // путь куда сохранить картинку $img_path = "C:\\Temp\\tmp.jpg"; // путь к файлу с результатами $res_path = "res/accs.txt"; // user agent строки $useragents = file("data/useragent.txt"); // язык данных аккаунта $lang = "EN"; // скрипт работает в режим отладки $dbg = true; // путь к файлу с проксями $str_proxy_path = "data/proxy.txt"; |
Сам скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
<?php /* производитель: x-scripts ** тип продукта: скрипт под Xweb Human Emulator ** сайт программы: humanemulator.info ** наш сайт: x-scripts.com ** по всем вопросам обращайтесь: ** email: order@x-scripts.com ** icq: 625657402 ** skype: igor_sev2 */ $xhe_host = "127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // //////////////////////// настройки скрипта ///////////////////////// // ключ антикаптчи $apikey = "ключ антикапчи"; // путь куда сохранить картинку $img_path = "C:\\Temp\\tmp.jpg"; // путь к файлу с результатами $res_path = "res/accs.txt"; // user agent строки $useragents = file("data/useragent.txt"); // язык данных аккаунта $lang = "EN"; // скрипт работает в режим отладки $dbg = true; // путь к файлу с проксями $str_proxy_path = "data/proxy.txt"; // текущая позиция прокси $i_cur_proxy = ""; // ожидание $wt = 5; $wt_long = 10; // включить (true) или выключить регистрацию только @hotmail.com ящика $hotmail = false; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // accept fucntions require_once("tools/accept_functions.php"); // /////////////////////// скрипт /////////////////////////////////////////// debug_mess(" скрипт запустили"); // установка прокси $i_cur_proxy = set_proxy($i_cur_proxy, $str_proxy_path); if (!$i_cur_proxy) { // выход из скрипта $app->quit(); } // перейти на hotmail $browser->navigate("https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&ct=1363256646&rver=6.1.6206.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1049&id=64855&mkt=en-us&cbcxt=mai&snsc=1"); sleep($wt); // проверяем прокси $ii = 0; while (!$anchor->is_exist_by_inner_text("Sign up now", true)) { sleep(1); if ($ii > 25) { debug_mess("Битый прокси<br>"); sleep($wt); // удаляем строку с битым прокси из файла rewrite($i_cur_proxy, $str_proxy_path); // перезапускаем приложение clear_and_restart(); } $ii++; } echo "Кликаем по ссылке зарегистрироваться<br>"; // кликаем по ссылке зарегистрировать аккаунт $anchor->click_by_inner_text("Sign up now", true); sleep($wt); // зарегистрировать аккаунт $succ_reg = reg_mail_acc(); if ($succ_reg) { debug_mess("<b>Регистрация успешна!!!</b>"); } else { debug_mess("<b>Не удалось пройти регистрацию!!</b>"); } sleep($wt_long); // чистим всю информацию и перезагружаемся clear_and_restart(); debug_mess("скрипт закончил работу"); // Quit $app->quit(); ?> |
Скрипт написан 15.09.2013 в Human Emulator 4.6.26 Advanced.
Данный пакет состоит из 5 скриптов регистрации почтовых аккаунтов в системах: Яндекс, Рамблер, Mail.ru, Yahoo и Hotmail.
Скрипты запускаются и работают в программе Human Emulator. В результате работы скриптов мы получаем файлы с аккаунтами в следующем формате:
uvazova@bk.ru;uwhrqaa
kamola.shurupova@mail.ru;nnlggwhz
efrem.barsukov@mail.ru;pitoqkbaz
serafim.efimov@mail.ru;xpauewhx
dumanovskij@inbox.ru;oljtbof
tucomumas@hotmail.com;micddzun1980
sudicawi@outlook.com;bmdmlsucdu1975
nugapewoja@hotmail.com;csvlella1983
boximesig@live.com;ufpesxstu1982
miron.emelyano@yandex.ru;peizscd
alexander.konyashe@yandex.ru;hgfhiagak
lyagushov.veronicka@yandex.ru;vtwdtol
demeno.lyubov@yandex.ru;qonrzlh
adam.murato@yandex.ru;jesqwds
smirnova_vasilisa@rambler.ru;lsebaijppznwlkd
nikita-grachv@rambler.ru;plmqhgxdm
fdor-pereverzev@rambler.ru;dkaqwlnvhkio
budanov-jakov@rambler.ru;sqaagqfxgkio
ksenijasilivstrova@rambler.ru;qvnxeugv
halvarigoodwin@yahoo.com;KISprbe1145
kojonkoskiclark@yahoo.com;SWfjdoo1633
paasiobryant@yahoo.com;Xadvvu4900
peteliusfletcher@yahoo.com;Xcwadp9093
liisahuffman@yahoo.com;PMzwvm4305
Для работы скриптов требуется ключ на сервисе распознавания antigate.com и прокси. Скорость и количество аккаунтов зависит от качества загружаемых проксей.
В связи с изменениями в формах регистрации почтовых ящиков с использованием телефонов на данный момент скрипты могут использоваться в ознакомительных целей.
Скрипты написаны для работы с Human Emulator 4.4.23 Advanced и выше.
Итак, из предыдущей статьи у нас есть следующий скрипт, который регистрирует один аккаунт за один запуск скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
$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»); и сразу же создадим цикл, который будет основан на количестве проксей — то есть мы будем регистрировать столько же аккаунтов сколько у нас рабочих проксей в файле, для этого добавим следующий код:
1 2 3 4 5 6 7 8 9 10 |
// цикл пройтись по всем прокси в массиве for($i=0;$i<count($proxies);$i++) { // получить прокси из массива $proxy = $proxies[$i]; // задать прокси браузеру $browser->enable_proxy("all connections",$proxy); // тут будет наш скрипт } |
Примечание: как работать с файлами в XHE описано в статье работа с файлами. Как организовывать циклы описано в статье работа с циклами
В итоге наш скрипт будет выглядеть теперь так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
$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
1 |
<SPAN id=portal-menu__user-email>rekib2855@mail.ru</SPAN> |
. Это нам даёт возможность использовать функцию объекта $element->get_element_innerText_by_id следующим образом:
1 |
$acc=$element->get_element_innerText_by_id("portal-menu__user-email"); |
Теперь осталась добавить проверку через оператор if. в Результате мы получили:
1 2 3 4 5 6 7 8 9 10 11 12 |
// получаем акк под которым зашли в почту $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 служит для вывода информации в панель отладки.
Теперь наш скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
$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 строку, можно менять размер браузера и т.д..
Как показала практика работы с хуманом наилучший результат по анонимности и работы с памятью достигается при использовании закладок браузера и последующем их закрытии. Для этого в начало цикла добавим следующий код:
1 2 3 4 |
// задаём количество браузеров $browser->set_count(2); // делаем активный следующим $browser->set_active_browser(1,true); |
Так же до цикла делаем переход основного браузера на пустую страницу: $browser->navigate(‘about:blank’);
В конце цикла добавим следующий код, который будет чистить данные браузера, а потом закрывать открытый в начале скрипта браузер:
1 2 3 4 5 6 7 8 9 |
// чистим данные браузера $browser->clear_cache(); $browser->clear_history(); $browser->clear_cookies("",false); // сделаем активным главный браузер $browser->set_active_browser(0,true); // закрыть все браузеры $browser->close_all_tabs(); |
В итоге наш скрипт стал:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
$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»);
Теперь наш скрипт имеет вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
$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 в Human Emulator 4.2 Advanced.
На момент публикации статьи 23.01.2012 скрипт был рабочий.
Пожалуй, самое распространённое требование при регистрации каких либо аккаунтов на сайтах это рабочий e-mail. На примере mail.ru напишем скрипт, который будет регать для нас email-ы, которые мы потом сможем использовать в других регистрациях.
Итак, первое что мы сделаем это создадим новый скрипт через меню Файл->Новый. Заменим в скрипте http://www.google.com на mail.ru. Запустим скрипт на выполнение и перейдём на сайт mail.ru. После находим на странице ссылку с текстом «Регистрация в почте», кликаем на ней правой кнопкой мыши и выбираем пункт меню $anchor в развернувшемся подменю кликаем на пункт меню $anchor->click_by_inner_text(‘Регистрация в почте ‘,true);. Нужная нам функция добавилась в скрипт и теперь наш скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$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(); // Quit $app->quit(); |
Примечание: После любых функций клика, которые делают переход на другую страницу или выполняют какие либо действия после которых браузер обновляется, нужно добавлять функцию $browser->wait_for();. Эта функция ожидает пока браузер выполнит необходимые действия, не давая скрипту идти дальше.
Запускаем скрипт на выполнение и переходим на страницу регистрации mail.ru. Перед нами страница с полями, которые нужно заполнить данными. Первые два поля это Имя и Фамилия. Для генерации данных в XHE используется объект submitter. У этого объекта есть функции для генерации имени и фамилии — generate_random_name и generate_random_second_name, соответственно. Вставляем эти функции в скрипт через диалог добавления кода. Этот диалог можно вызвать горячими клавишами Ctrl+Alt+Right(стрелка вправо). В диалоге выбираем объект submitter и затем выбираем нужные нам функции из правого поля.
Теперь наш скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$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(); $submitter->generate_random_name($lang="EN",$sex_for_RU="man"); $submitter->generate_random_second_name($lang="EN",$sex_for_RU="man"); // Quit $app->quit(); |
Для работы с полями вставки текста в XHE служит объект input. Для вставки значений в поля Имя и Фамилия используем контекстное меню аналогично с тем как мы кликали на ссылку «Регистрация в почте». В открывшемся подменю меню $input выберем функцию «$input->set_value_by_number(‘0’,»);», а для второго поля «$input->set_value_by_number(‘1’,»);».
Примечание: Помимо функции работы по номеру поля в контекстном меню можно увидеть и функцию работы с полем по имени, типа: «$input->set_value_by_name(‘x_29f24908ee4918a4’,»);». На практике лучше использовать функции, которые работают с элементом по его имени, так как при добавлении нового элемента такого же типа нумерация полей меняется и это может привести к неработоспособности скрипта, тогда как имя элемента остаётся постоянным. НО в данном случае, судя по именам элементов они скорее всего меняются чаще, чем добавляются новые поля на страницу, поэтому будет надёжнее работать по номерам элементов.
Теперь вставим генерацию имени и фамилии в поля с нужными для нас параметрами. Скрипт будет выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$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(); $input->set_value_by_number("0",$submitter->generate_random_name("RU","man")); $input->set_value_by_number("1",$submitter->generate_random_second_name("RU","man")); // Quit $app->quit(); |
Параметры «RU» и «man» говорят о том что нужно генерить только русские мужские имена и фамилии. Допустим что стоит задача случайным образом создавать в том числе и женские имена и фамилии. Тогда добавим следующий код в скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 |
// рандомно выставлять пол аккаунта $gnd=rand(1,2); // генерим случайным образом или 1 или 2. switch($gnd) // оператор выбора { case 1: // при $gnd=1 переменной $gender будет присваиваться значение "man" $gender = "man"; break; case 2: // при $gnd=2 переменной $gender будет присваиваться значение "woman" $gender = "woman"; break; } |
После добавления этого кода скрипт будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$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)); // Quit $app->quit(); |
Теперь выберем дату рождения. Для работы с элементами выбора в XHE используется объект listbox. Значения даты будем выбирать случайным образом используя функцию select_random_value_by_number.
Таким образом получим следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
$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); // Quit $app->quit(); |
Теперь выберем пол. В скрипте уже пол выбран его содержит переменная $gnd. Теперь с помощью неё выберем нужный пол на странице. Для работы с так называемыми радиобоксами в XHE есть элемент radiobox. Используя контекстное меню для элемента выбираем функцию $radiobox->set_checked_by_value(‘1’,true); и меняем ‘1’ на $gnd.
Примечаение: Тут можно было использовать функции работы по номеру $radiobox->set_checked_by_number(0,true);, но тогда наш код выбора пола имел бы такой вот вид:
1 2 3 4 5 6 7 8 9 10 11 12 |
// рандомно выставлять пол аккаунта $gnd=rand(0,1); switch($gnd) { case 0: $gender = "man"; break; case 1: $gender = "woman"; break; } |
В итоге имеем скрипт в следующем виде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$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); // Quit $app->quit(); |
Примечание: Периодически можно запускать скрипт что бы проверять всё ли срабатывает так как надо.
Теперь нам нужно сгенерить логин для мыла и вставить его в поле логина. Для этого используем функцию $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 и перепишем код следующим образом:
1 2 3 4 |
// создадим логин $mail_login = $submitter->generate_random_nick_name(rand(5,9)).rand(100,10000); // установим сгенерённый логин в поле $input->set_value_by_number("3",$mail_login); |
Примечание: Не ленитесь расставлять комментарии это поможет вам понять как работает скрипт, в том случае если вы его решите переделать через месяц другой.
После всех манипуляций получим:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
$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); // Quit $app->quit(); |
По аналогии делаем тоже самое с заполнением паролем, только для генерации пароля используем функцию $submitter->generate_random_text. В итоге для пароля добавим такой вот код:
1 2 3 4 5 6 |
// сгенерить пароль для мыла $pwd = $submitter->generate_random_text(rand(5,9),1); // пароль $input->set_value_by_number("4",$pwd); // подтверждение пароля $input->set_value_by_number("5",$pwd); |
Дальше если надо, то добавляем в поле телефон, если делать регистрацию без телефона, то добавим для ссылки «У меня нет мобильного телефона» через контекстное меню вызов функции $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);
Теперь наш скрипт будет выглядеть так вот:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
$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); // зададим город $input->set_value_by_number("2",$submitter->generate_random_city("RU")); // выберем пол $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(5,9),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(); // Quit $app->quit(); |
После запуска этого скрипта в браузере откроется окно с каптчей. Для работы с распознанием каптчи можно использовать различные сервисы такие как captchabot.com или anti-captcha.com. Можно и другие просто для работы с этими двумя сервисами в XHE есть объекты $captchabot и $anticapcha. А так же можно использовать ручной ввод каптчи через функции объекта $app:
1 2 3 |
$app->dlg_captcha_from_image_number($number); $app->dlg_captcha_from_url($url); $app->dlg_captcha_from_url_exactly($url,$exactly);. |
Мы будем использовать функцию $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 следующим образом:
1 2 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); |
То есть в результате работы этого кода мы получаем, что вся каптча распределена в трёх частях. Заполним поле каптчей используя следующий код:
$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.
Теперь наш скрипт будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
$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); // Quit $app->quit(); |
Примечание: Иногда появляется необходимость задержать скрипт несколько дольше, чем это делает функция $browser->wait_for();.
Например когда открываются всплывающие окна в этот момент браузер может освободиться раньше, чем появится всплывающее окно. В этих случаях используется функция sleep(кол-во секунд);, которая останавливает работу скрипта на заданное количество секунд.
Теперь закончим регистрацию используя контекстное меню, как это мы делали выше. В итоге наш скрипт стал вот таким вот:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
$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(); |
В следующей статье мы добавим использование прокси, завернём всё это в цикл, а так же добавим проверки на удачную регистрацию и запись удачных регистраций в файл.
Скрипт написан 16.01.12 в Human Emulator 4.2 Advanced. На момент публикации статьи скрипт был рабочий
Скрипт Human Emulator регистрации почты рамблер это скрипт, который регистрирует почтовые аккаунты в Рамблер.
Скрипт сохраняет результат в заданный файл в формате: мыло;пароль
На нашем сайте вы можете так же найти примеры подобных скриптов регистрация почты mail.ru и регистрация почты yandex.ru.
Как и в остальных скриптах регистрации почты на выходе скрипт получает email-ы максимально приближенные к реальным. Это сделано с помощью выбора имени ящика из тех которые предлагает нам сервис.
В результате мы получаем результаты в следующем виде:
smirnova_vasilisa@rambler.ru;lsebaijppznwlkd
nikita-grachv@rambler.ru;plmqhgxdm
fdor-pereverzev@rambler.ru;dkaqwlnvhkio
budanov-jakov@rambler.ru;sqaagqfxgkio
ksenijasilivstrova@rambler.ru;qvnxeugv
dostovalovaklara@rambler.ru;vajhcalpx
Как и всегда для распознавания капчи в скрипте мы работаем с сервисом распознавания antigate.com. После регистрации нового ящика скрипт заходит в него и отмечает все письма, которые там находятся на этот момент как прочитанные.Можно дописать в скрипте любые действия, которые Вам нужно будет делать в ящике. Например, Вы можете сразу же отправить с него письмо или изменить настройки переадресации или любые другие настройки в ящике. Количество регистрируемых ящиков задаётся в настройках скрипта.
Примечание: Этот скрипт использует прокси, поэтому для его работы нужны нормальные рабочие прокси.
Производительность скрипта зависит от качества прокси.
Настройки скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// включить случайную форму почты (true/false) - можно регистрировать только rambler или также сопутствующие ящики lenta.ru, ro.ru и т.д. $mix = false; // количество регистрируемых аккаунтов $acc_count = 10; // пауза между регистрациями $wt = 10; // длинная пауза $lp = 5; // путь сохранения данных аккаунтов $str_res_path = "res\\accs.txt"; // ключ сервиса антикапчи $apikey = "ваш ключ антикапчи"; // путь сохранения капчи $str_img_path = "C:\\temp\\tmp.jpeg"; // текущая позиция прокси $i_cur_proxy = ""; // путь к файлу проксями $str_proxy_path = "data\\proxy.txt"; // user agent строки $useragents = file("data\\useragent.txt"); |
Сам скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
<?php /* производитель: x-scripts ** тип продукта: скрипт под Xweb Human Emulator ** сайт программы: humanemulator.info ** наш сайт: x-scripts.com ** по всем вопросам обращайтесь: ** email: order@x-scripts.com ** icq: 625657402 ** skype: igor_sev2 */ $xhe_host = "127.0.0.1:7016"; // The following code is required to properly run XWeb Human Emulator require_once("..\..\Templates\xweb_human_emulator.php"); // /////////////////////// настройки скрипта //////////////////////// // включить случайную форму почты (true/false) $mix = false; // количество регистрируемых аккаунтов $acc_count = 10; // пауза между регистрациями $wt = 10; // длинная пауза $lp = 5; // текущий номер аккаунта $i_cur_acc = 1; // путь сохранения данных аккаунтов $str_res_path = "res\\accs.txt"; // ключ сервиса антикапчи $apikey = "ваш ключ антикапчи"; // путь сохранения капчи $str_img_path = "C:\\temp\\tmp.jpeg"; // текущая позиция прокси $i_cur_proxy = ""; // путь к файлу проксями $str_proxy_path = "data\\proxy.txt"; // user agent строки $useragents = file("data\\useragent.txt"); // скрипт работает в режим отладки $dbg = true; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // accept fucntions require_once("tools/accept_functions.php"); // ////////////////////// скрипт /////////////////////////////////// debug_mess("старт скрипта"); // установка прокси $i_cur_proxy = set_proxy($i_cur_proxy, $str_proxy_path); if (!$i_cur_proxy) { // выход из скрипта $app->quit(); } // перейти на rambler.ru $browser->navigate("http://www.rambler.ru"); $ii = 0; while (!$input->is_exist_by_name("query")) { sleep(1); if ($ii > 20) { debug_mess("Битый прокси<br>"); // удаляем строку с битым прокси из файла rewrite($i_cur_proxy, $str_proxy_path); sleep($wt); // перезапускаем приложение clear_and_restart(); } $ii++; } sleep($wt); // основной цикл скрипта while (true) { // зарегистриурем аккаунт $succ_reg = reg_acc(); if ($succ_reg) { debug_mess("<b>Регистрация успешна!!!</b>"); } else { debug_mess("<b>Не удалось пройти регистрацию!!</b>"); } sleep($wt); // чистим всю информацию и перезагружаемся clear_and_restart(); } debug_mess("скрипт отработал"); // Quit $app->quit(); ?> |
Скрипт написан 02.09.2013 в Human Emulator 4.6.24 Advanced.
Скрипт регистрации почты на примере почтового сервиса mail.ru это скрипт, который регистрирует email-ы на mail.ru
и сохраняет результат в файл в формате мыло;пароль
На нашем сайте уже есть статьи как написать такой скрипт Скрипт регистратор мыла на примере mail.ru. Часть 1. и Скрипт регистратор мыла на примере mail.ru. Часть 2., где подробно, пошагово расписывается что и как делать. Но мы решили улучшить существующий скрипт и выложить его отдельной статьёй.
Основное отличие от предыдущего скрипта это то что на выходе мы имеем email-ы максимально приближенные к реальным. Это сделано за счёт выбора первого почтового ящика из предлагаемых самим mail.ru. Таким образом в результате работы скрипта мы имеем почтовые ящики следующего вида:
uvazova@bk.ru;uwhrqaa
kamola.shurupova@mail.ru;nnlggwhz
efrem.barsukov@mail.ru;pitoqkbaz
serafim.efimov@mail.ru;xpauewhx
dumanovskij@inbox.ru;oljtbof
cherenchikova@bk.ru;sdqiumwjj
dumanovskij@list.ru;kuvxplscg
agrafena.skorobogatova@mail.ru;vhkczin
gavriil.fomin@mail.ru;hjxldzlq
akropanin@inbox.ru;lzoqiutta
oleg-dmitriev-70@mail.ru;irvkirpua
tkrutin@bk.ru;spxjbbha
Для распознавания капчи в скрипте добавлены работа с сервисом antigate.com и с встроенным в Human Emulator диалогом ввода капчи. После удачной регистрации скрипт заходит в только что созданный ящик и отмечает полученные от mail.ru письма как прочитанное. При необходимости можно добавить выполнение и других действий внутри ящика, например, изменение любых его настроек.Так же в скрипте есть возможность задавать количество почтовых ящиков, которое скрипт должен зарегистрировать.
Примечание: Скрипт не использует прокси, поэтому с помощью него можно зарегать 7-10 аккаунт за один запуск.
Через какой-то промежуток времени вы запускаете скрипт опять и у вас ещё 7-10 мыл и т.д. Если же вам нужны почтовые ящики в промышленных масштабах, то вы можете прикрутить к скрипту прокси по аналогии как это описано в статье скрипт регистратор мыла на примере mail.ru. Часть 2. и использовать для сбора прокси наш скрипт сборщик проксей
Настройки скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// ключ антикаптчи $api_key_antg ="ключ антикаптчи"; - тут вы указываете ваш ключ с сервиса antigate.com // показывать капчу через диалог или использовать сервис распознавания antigate.com $b_show_dlg=false; // если значение false значит использовать сервис antigate.com // путь куда сохранить картинку капчи $img_path="C:\\Temp\\tmp.jpg"; // путь к файлу с результатами $res_path="res/accs.csv"; // язык данных аккаунта. // С помощью этой настройки вы выбираете на каком языке генерить данные для аккаунат. $lang="RU"; // если поставить EN будут генерируется английские данные. // количество зареганых аккаунтов - тут вы задаёте необходимое вам кол-во зареганных аккаунтов $accs_count=10; |
Сам скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?php $xhe_host ="127.0.0.1:7011"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // //////////////////////// настройки скрипта ///////////////////////// // ключ антикаптчи $api_key_antg ="3db8af5d080608c34f7b42208cd1ea5d"; // показывать через диалог $b_show_dlg=false; // путь куда сохранить картинку $img_path="C:\\Temp\\tmp.jpg"; // путь к файлу с результатами $res_path="res/accs.csv"; // user agent строки $useragents = file("data/useragent.txt"); // язык данных аккаунта $lang="RU"; // количество зареганых аккаунтов $accs_count=10; // текущий аккаунт $i_cur_accs=0; // скрипт работает в режим отладки $dbg = true; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // accept fucntions require_once("tools/accept_functions.php"); // /////////////////////// скрипт /////////////////////////////////////////// debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт запустили"); // бесконечный цикл регистрации аккаунтов while(true) { // перейти на mail.ru $browser->navigate("http://mail.ru/"); // перейти в почту $anchor->click_by_inner_text("Регистрация в почте"); // зарегать аккаунт reg_mail_acc(); if($i_cur_accs>=$accs_count) break; // переходим на пустую строку $browser->navigate("about:blank"); // изменить информацию о браузере set_browser_info(); } debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу<br>"); // Quit $app->quit(); ?> |
Скрипт написан 15.11.2012 в Human Emulator 4.4.23 Advanced.
На момент публикации статьи 19.11.2012 скрипт был рабочий.
Недавно обратил внимание, что в статьях Хумана есть много советов КАК делать скрипты, но мало объяснений ПОЧЕМУ лучше подходит тот или иной способ. Попробую исправить это упущение на примере авторегистратора для мыл qip.ru, который и для личного пользования пригодится.
Как обычно, всё начинается с создания нового скрипта. Конечно, есть несколько способов начать работу иным способом, но их мы рассматривать не будем.
В стандартном шаблоне присутствуют строки команд, направляющих наш браузер на Гугл. Вы можете легко проверить это, просто запустив скрипт. И легко догадаться, что переход этот выполняется из-за строки $browser->navigate(«http://www.google.com»); Поскольку цель моя – квип, вставляю qip.ru в строку вместо гугла и перехожу на этот сайт для дальнейшего изучения.
Регистрация скрывается в форме, появляющейся после нажатия ссылки «Войти на сайт». Через меню, открывающемся по правому клику на нужном элементе, добавляю в скрипт строку $anchor->click_by_inner_text(‘Войти на сайт’,true); .
На выбор есть ещё три:
1 2 3 |
$anchor->click_by_number(0); $anchor->click_by_href("http://qip.ru/login",true); $anchor->click_by_atribute("name","",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 нужного поля действительно имеет обычное и наверняка статичное название. Теперь, сверяясь с ДОМ-моделью, легко добавить в скрипт функции для работы со всеми нужными инпутами.
Получается вот такой список:
1 2 3 4 |
$input->set_value_by_name("reg_username", ""); $input->set_value_by_name("reg_pwd",""); $input->set_value_by_name("reg_pwd2",""); $input->set_value_by_name("reg_email",""); |
Как можно понять из пояснительного текста на странице, поля «E-mail», «Фамилия», «Имя», «Отчество» и «Город» не обязательны для заполнения, но что-то из них нужно вбить для возможной надобности восстановить пароль. Естественно, у нас подобной необходимости не возникнет, но квип об этом не знает, а потому будет стоять на своём. Попробую указывать емейлы и имя с фамилией.
Как заполнять нужные поля мы разобрались. Теперь займёмся тем, ЧТО будет в них вбиваться. Обычно подобными задачами занимается персональный Хумановский бредогенератор — объект $submitter. В его базе присутствуют списки имён, фамилий, улиц и т.д., а так же функции генерации случайного текста, чисел и ников. Они-то и будут придумывать логины, пароли и фейковые мыла.
После добавления функций из сабмиттера, скрипт приобрёл следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// переход на сайт $browser->navigate("qip.ru"); $browser->wait_for(); // переход в форму регистрации $anchor->click_by_inner_text("Войти на сайт",true); $anchor->click_by_inner_text("Регистрация",true); $browser->wait_for(); // создание случайных данных для профиля $user = $submitter->generate_random_text(rand(8,12),1); $pass = $submitter->generate_random_text(rand(6,10),1); // заполнение инпутов $input->set_value_by_name("reg_username",$user); $input->set_value_by_name("reg_pwd",$pass); $input->set_value_by_name("reg_pwd2",$pass); $input->set_value_by_name("reg_email",$submitter->generate_random_text(rand(6,10),1)."@mail.ru"); |
Как видите, функция generate_random_text принимает на вход два параметра:
Количество знаков в генерируемом тексте. В данном случае я поставил rand(8,12), что будет выдавать разные числа от 8 и до 12.
Тип генерируемого текста. 1 – английские буквы 2 – русские.
Получившееся можно запустить и полюбоваться, но это ещё не всё. Следующими на очереди будут раскрывающиеся листбоксы, предлагающие выбрать дату рождения пользователя. Тут всё так-же просто, как и прежде: последовательно кликаем правой кнопкой мышки на каждый и добавляем функцию select_num_value_by_name для всех трёх. Эта функция выберет значение в выпадающей менюшке листбокса по его (значения) номеру. Так будет значительно проще создавать случайные даты рождения, в чём вы сможете убедиться чуть позже.
В итоге, в конец скрипта добавились следующие три строки:
1 2 3 |
$listbox->select_num_value_by_name("b_day","1"); $listbox->select_num_value_by_name("b_month","1"); $listbox->select_name_by_inner_name("b_year","1"); |
Единицы в качестве второго аргумента каждой функции поставил я. Просто для проверки того, как сработает функция. После запуска скрипта с этими изменениями день и месяц рождения выставились на «1» и «январь» соотвественно, а вот год остался без изменений. Попробую 2000. Эврика!
Поскольку даты рождения нужны случайные, воспользуемся спасительной функцией rand(); уже появлявшейся ранее. С ней нужные строки приобрели следующий вид:
1 2 3 |
$listbox->select_num_value_by_name("b_day", rand(1,28)); $listbox->select_num_value_by_name("b_month", rand(1,12)); $listbox->select_name_by_inner_name("b_year", rand(1970,2001)); |
Как видите, у первой строки крайнее число 28. Это сделано из-за кастрированного месяца февраля, который тоже может выпасть. Если захотеть, то можно высчитывать и високосные годы, и месяцы с 30 или 31 днём, но всё упирается в популярный вопрос «Оно нам надо?»
Следующие на очереди два обязательных радиобокса (крупная такая точка для тырканья мышкой), которые, в теории, должны определить наличие Y-хромосомы у пользователя. К счастью, нам верят на слово, так что тут тоже можно использовать случайный выбор одного из предложенных вариантов.
Правый щелчок мышью на первом (мужском) радиобоксе, помимо кучи бесполезных функций, отображает его номер: 0. А второй (женский) оказывается номером 1. Такой расклад очень подходит для следующей функции, которую мы и добавим в скрипт:
1 |
$radiobox->set_checked_by_number(rand(0,1),true); |
В начале текста я говорил, что клики по номеру лучше не использовать, но тут выгода от данного действия сильно сокращает время на поиски альтернативного варианта, а значит принимается без возражений.
Последнее обязательное поле – каптча, якобы призванная стоять на фейсконтроле и защищать ресурс от посягательств роботов. Святая наивность! Единственное, что удерживает роботов от порабощения этого мира – оно им нафиг не нужно. Как и умение распознавать каптчи, в принципе. Поэтому, сначала мы встроим в скрипт ручную распознавалку, а позднее подключим антикаптчу с трудолюбивыми индусами.
Чтобы отправить каптчу на распознание или показать её в отдельном диалоговом окне, нужно сохранить её картинку на жёсткий диск. Поэтому обращайте внимание на функции со словами «save_to_file_by», когда будете смотреть менюшку после ставшего уже привычным правого клика по картинке.
Нужных функций на выбор три:
1 2 3 |
$image->save_to_file_by_number(0,"C:\tmp.jpeg"); $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $image->save_to_file_by_url("http://qip.ru/api/captcha?n=register&k=1324745167","C:\tmp.jpeg",true); |
Первая. Картинка на странице единственная, и вполне вероятно что так оно и останется ещё долго. Можно использовать без колебаний.
Вторая. Название картинки не выглядит генерирующимся случайно, так что использование этой функции тоже вполне оправдано.
Третья. Цифры в урле картинки смущают. При желании, можно сохранять картинку и этой функцией, но часть урла придётся отрезать. Функция будет выглядеть примерно так: $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. А потом вставлять содержимое этой переменной в поле ввода текста с каптчи. Если вы уже запутались во всех этих пояснениях, то вот текст скрипта, что должен у нас получиться к этому моменту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// переход на сайт $browser->navigate("qip.ru"); $browser->wait_for(); // переход в форму регистрации $anchor->click_by_inner_text("Войти на сайт",true); $anchor->click_by_inner_text("Регистрация",true); $browser->wait_for(); // создание случайных данных для профиля $user = $submitter->generate_random_text(rand(8,12),1); $pass = $submitter->generate_random_text(rand(6,10),1); // заполнение инпутов $input->set_value_by_name("reg_username",$user); $input->set_value_by_name("reg_pwd",$pass); $input->set_value_by_name("reg_pwd2",$pass); $input->set_value_by_name("reg_email",$submitter->generate_random_text(rand(6,10),1)."@mail.ru"); // выбор случайного дня рождения $listbox->select_num_value_by_name("b_day", rand(1,28)); $listbox->select_num_value_by_name("b_month", rand(1,12)); $listbox->select_name_by_inner_name("b_year", rand(1970,2001)); // выбор пола $radiobox->set_checked_by_number(rand(0,1),true); // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$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, на русском означающий что-то вроде «До тех пор…». То есть, содержимое цикла будет выполняться до тех пор, пока условие, указанное в начале, не будет нарушено:
1 2 3 4 5 6 7 8 9 |
//проверка доступности логина while (strpos ($webpage->get_body(), "Логин занят") != 0) { $user = $submitter->generate_random_text(rand(8,12),1); $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); sleep(5); } |
Вы можете заметить, что в конце цикла у меня стоит sleep(5) – пауза в пять секунд. Это примерное время, нужное форме, чтобы сравнить новый логин со своей базой и выдать ответ, свободен ли он. Если мы не выдержим паузу, ответ появится слишком поздно и наша проверка доступности логина не сработает.
Итак, с проверкой закончили. Если сомневаетесь с местом, куда нужно впихнуть получившийся код, смело ставьте его сразу после ввода каптчи.
На очереди имя и фамилия. Отчеств в субмиттере, к сожалению, нет, но они и не обязательны.
В начале скрипта есть строка, отвечающая за пол пользователя. Значит, для пущей правдоподобности имя и фамилия должны соответствовать этому выбору. Кстати, ту строку придётся изменить в соответствии с текущими потребностями. Из одной $radiobox->set_checked_by_number(rand(0,1),true); получится две:
1 2 3 |
//выбор пола $s = rand(0,1); $radiobox->set_checked_by_number($s,true); |
После этого, в зависимости от содержимого переменной $s, можно создать вставку фамилий нужного пола. Это будет выглядеть примерно так:
1 2 3 4 5 |
// вставка имени и фамилии if ($s == 1) $sex = "woman"; else $sex = "man"; $input->set_value_by_name("last_name",$submitter->generate_random_second_name("RU",$sex)); $input->set_value_by_name("first_name",$submitter->generate_random_name("RU",$sex)); |
Судя по всему, скрипт практически готов. Осталось лишь добавить клик по кнопке «Регистрация», что будет отправлять введённые данные на сервер. Ставший уже привычным клик правой кнопкой и функция $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 |
$textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10); |
Смело вставляйте её в самом конце скрипта, сразу за нажиманием кнопки «Регистрация». Постепенно мой скрипт приобрёл следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// очистка кэша и куков $browser->clear_cache(); $browser->clear_cookies("",true); // переход на сайт $browser->navigate("qip.ru"); $browser->wait_for(); // переход в форму регистрации $anchor->click_by_inner_text("Войти на сайт",true); $anchor->click_by_inner_text("Регистрация",true); $browser->wait_for(); // создание случайных данных для профиля $user = $submitter->generate_random_text(rand(8,12),1); $pass = $submitter->generate_random_text(rand(6,10),1); // заполнение инпутов $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); $input->set_value_by_name("reg_pwd",$pass); $input->set_value_by_name("reg_pwd2",$pass); $input->set_value_by_name("reg_email",$submitter->generate_random_text(rand(6,10),1)."@mail.ru"); // выбор случайного дня рождения $listbox->select_num_value_by_name("b_day", rand(1,28)); $listbox->select_num_value_by_name("b_month", rand(1,12)); $listbox->select_name_by_inner_name("b_year", rand(1970,2001)); // выбор пола $s = rand(0,1); $radiobox->set_checked_by_number($s,true); // вставка имени и фамилии if ($s == 1) $sex = "woman"; else $sex = "man"; $input->set_value_by_name("last_name",$submitter->generate_random_second_name("RU",$sex)); $input->set_value_by_name("first_name",$submitter->generate_random_name("RU",$sex)); // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // пороверка логина на занятость while (strpos ($webpage->get_body(), "Логин занят") != 0) { // создание другого логина $user = $submitter->generate_random_text(rand(8,12),1); $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); sleep(5); } // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); $browser->wait_for(); // сохраняем данные $textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10); |
В самом начале скрипта вы можете заметить две новые строчки – очистку кэша и куков. Ещё к ним неплохо бы добавить функцию установки прокси, поскольку квип, как оказалось, весьма капризен, и не позволяет регистрировать тучи аккаунтов с одного айпи. С прокси возможно два варианта: 1) на каждую проксю выполнять одну регистрацию и брать следующую 2) регистрировать аккаунты до появления надписи «Слишком много регистраций». Первое организовывается циклом for или foreach:
1 2 3 4 5 6 7 8 9 10 |
$proxy = file ("proxy.txt"); for($i=0;$i<count($proxy);$i++) { // очистка кэша и куков, подключение прокси $browser->clear_cache(); $browser->clear_cookies("",true); $browser->enable_proxy("all connections",$proxy[$i]); /*Весь остальной скрипт*/ } |
Второе требует проверки наличия на странице предупреждающего сообщения. Этим мы уже занимались на примере с занятостью логинов чуть выше, но тут будет модификация:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$proxy = file ("proxy.txt"); for($i=0;$i<count($proxy);$i++) { // очистка кэша и куков, подключение прокси $browser->clear_cache(); $browser->clear_cookies("",true); $browser->enable_proxy("all connections",$proxy[$i]); /*Весь остальной скрипт*/ if (strpos ($webpage->get_body(), "Много регистраций") == 0) { $textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10); $i--; } } |
Такой подход позволит регистрировать аккаунты до появления надписи, менять прокси и продолжать регистрацию уже с нового айпи. Модификация заключается в том, что теперь данные логина и пароля будут записываться лишь при успешной регистрации. Её неплохо бы добавить и в первый вариант, но это теперь можно сделать самостоятельно. Дальнейшие пояснения будут даваться для второго варианта.
Снова проверяя получившийся скрипт в действии я неправильно ввёл одну каптчу, но это было засчитано программой за успешную регистрацию, потому данные записались в файлик и работа пошла по новой. Сие натолкнуло на мысль, что надобно бы сделать проверку и для неправильно введённой каптчи. На примере наших прошлых достижений можно разобраться и наваять что-то такое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
while (strpos ($webpage->get_body(), "Неверный код подтверждения") != 0) { echo "Ай-ай! Ошибочка. Попробуем снова каптчу ввести<br>"; // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); sleep(3); $browser->wait_for(); } |
Поскольку после ошибки сайт показывает новую каптчу, мы снова её сохраняем. После этого вводим и самбитим. Если вдруг каптча будет снова введена неправильно, цикл while будет срабатывать, пока не пропадёт надпись «Неверный код подтверждения». То есть, до успешного распознания.
На этом скрипт представляется мне готовым. Возможно, в процессе его использования всплывут какие-то ещё нюансы, но сейчас я этого не знаю. Привожу его полный вариант со всеми проверками и несколькими косметическими поправками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
$xhe_host ="127.0.0.1:7010"; require("../Templates/xweb_human_emulator.php"); $proxy = file ("proxy.txt"); // цикл пробежки по всем проксям в списке for($i=0;$i<count($proxy);$i++) { // очистка кэша и куков, подключение прокси $browser->clear_cache(); $browser->clear_cookies("",true); $browser->enable_proxy("all connections",$proxy[$i]); // переход на сайт $browser->navigate("qip.ru"); $browser->wait_for(); // переход в форму регистрации $anchor->click_by_inner_text("Войти на сайт",true); $anchor->click_by_inner_text("Регистрация",true); $browser->wait_for(); // создание случайных данных для профиля $user = $submitter->generate_random_text(rand(8,12),1); $pass = $submitter->generate_random_text(rand(6,10),1); // заполнение инпутов $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); $input->set_value_by_name("reg_pwd",$pass); $input->set_value_by_name("reg_pwd2",$pass); $input->set_value_by_name("reg_email",$submitter->generate_random_text(rand(6,10),1)."@mail.ru"); // выбор случайного дня рождения $listbox->select_num_value_by_name("b_day", rand(1,28)); $listbox->select_num_value_by_name("b_month", rand(1,12)); $listbox->select_name_by_inner_name("b_year", rand(1970,2001)); // выбор пола $s = rand(0,1); $radiobox->set_checked_by_number($s,true); // вставка имени и фамилии if ($s == 1) $sex = "woman"; else $sex = "man"; $input->set_value_by_name("last_name",$submitter->generate_random_second_name("RU",$sex)); $input->set_value_by_name("first_name",$submitter->generate_random_name("RU",$sex)); // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // пороверка логина на занятость while (strpos ($webpage->get_body(), "Логин занят") != 0) { // создание другого логина $user = $submitter->generate_random_text(rand(8,12),1); $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); sleep(5); } // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); sleep(3); $browser->wait_for(); // проверка на правильность ввода каптчи while (strpos ($webpage->get_body(), "Неверный код подтверждения") != 0) { echo "Ай-ай! Ошибочка. Попробуем снова каптчу ввести<br>"; // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); sleep(3); $browser->wait_for(); } // проверка успешности регистрации с текущего айпи if (strpos ($webpage->get_body(), "Много регистраций") == 0) { $textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10); $i--; } else echo "Много регистраций, меняем прокси<br>"; } $app->quit(); |
Статья для владельцев однопоточной версии программы на этом заканчивается. А вот пользователи МТ могут задержаться и посмотреть, как изменяется этот же самый скрипт с учётом предстоящей работы в многопоточном режиме.
Давайте сначала определимся с вещами, которые во многопотоке должны работать не так, как сейчас.
Пожалуй, всё.
Первое решается простой заменой:
1 2 3 |
$image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); |
текущего скрипта меняется на:
1 2 3 4 |
$ins = rand(0,999); $image->save_to_file_by_name("img_captcha","C:\\".$ins.".jpeg"); $cap = $image->recognize_by_anticaptcha($url,"C:\\".$ins.".jpeg","http://antigate.com"); $input->set_value_by_name("captchan",$cap); |
в обоих случаях.
Переменная со случайным числом в начале отвечает за то, чтобы потоки не дрались за отправку каптчи. Без неё возможны ситуации, когда отправлена будет совсем не та картинка, потому ответ придёт заведомо неправильный.
Второе тоже решаемо, но требует применения соображаловки. Можно из списка прокси брать и использовать случайную. После возникновения сообщения об айпи удалять её из файла и брать новую. Можно брать прокси, по счёту кратную количеству запущенных потоков. Но я обычно использую стандартную заготовку: создаю текстовый файлик, в котором каждый поток записывает номер используемой прокси плюс единичка. В процессе получается, что каждый поток берёт следующую по списку прокси по мере надобности, а не в порядке очереди. Чтобы добавить это в код, его придётся слегка переделать.
Самое начало скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$xhe_host ="127.0.0.1:7010"; require("../Templates/xweb_human_emulator.php"); $proxy = file ("proxy.txt"); $i = $textfile->read_file("C:\res.txt",10); $browser->enable_proxy("all connections",$proxy[$i]); $textfile->write_file("C:\res.txt",$i+1,10,false); while ($textfile->read_file("C:\res.txt",10)<count($proxy)) { // очистка кэша и куков $browser->clear_cache(); $browser->clear_cookies("",true); /*Весь остальной скрипт*/ |
И самый конец скрипта:
1 2 3 4 5 6 7 8 9 10 11 |
/*Весь скрипт*/ else { echo "Много регистраций, меняем прокси<br>"; $i = $textfile->read_file("C:\res.txt",10); $browser->enable_proxy("all connections",$proxy[$i]); $textfile->write_file("C:\res.txt",$i+1,10,false); } } $app->quit(); |
Остался последний штрих – подготовить всю эту писанину к запуску. Чтобы всего этого избежать, нужно внимательно и без косяков выполнить следующую последовательность действий:
Сказать по правде, запускать этот скрипт многопоточно я не планирую. Все разъяснения по настройке лишь для примера. Но если вы решитесь на сей подвиг и столкнётесь с какими-либо ошибками, смело ругайтесь матом в аську техподдержки. По опыту, каждая жалоба туда сдвигает исправление какой-либо огорчающей вас фичи в приоритетах на один пункт вверх по списку.
Напоследок привожу конечный вариант скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
$xhe_host ="127.0.0.1:".$argv[1]; require("../Templates/xweb_human_emulator.php"); $proxy = file ("proxy.txt"); $i = $textfile->read_file("C:\res.txt",10); $browser->enable_proxy("all connections",$proxy[$i]); $textfile->write_file("C:\res.txt",$i+1,10,false); while ($textfile->read_file("C:\res.txt",10)<count($proxy)) { // очистка кэша и куков $browser->clear_cache(); $browser->clear_cookies("",true); // переход на сайт $browser->navigate("qip.ru"); $browser->wait_for(); // переход в форму регистрации $anchor->click_by_inner_text("Войти на сайт",true); $anchor->click_by_inner_text("Регистрация",true); $browser->wait_for(); // создание случайных данных для профиля $user = $submitter->generate_random_text(rand(8,12),1); $pass = $submitter->generate_random_text(rand(6,10),1); // заполнение инпутов $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); $input->set_value_by_name("reg_pwd",$pass); $input->set_value_by_name("reg_pwd2",$pass); $input->set_value_by_name("reg_email",$submitter->generate_random_text(rand(6,10),1)."@mail.ru"); // выбор случайного дня рождения $listbox->select_num_value_by_name("b_day", rand(1,28)); $listbox->select_num_value_by_name("b_month", rand(1,12)); $listbox->select_name_by_inner_name("b_year", rand(1970,2001)); // выбор пола $s = rand(0,1); $radiobox->set_checked_by_number($s,true); // вставка имени и фамилии if ($s == 1) $sex = "woman"; else $sex = "man"; $input->set_value_by_name("last_name",$submitter->generate_random_second_name("RU",$sex)); $input->set_value_by_name("first_name",$submitter->generate_random_name("RU",$sex)); // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // проверка логина на занятость while (strpos ($webpage->get_body(), "Логин занят") != 0) { // создание другого логина $user = $submitter->generate_random_text(rand(8,12),1); $input->set_value_by_name("reg_username",$user); $input->send_event_by_atribute("id","reg_username",true,"onkeyup"); sleep(5); } // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); sleep(3); $browser->wait_for(); // проверка на правильность ввода каптчи while (strpos ($webpage->get_body(), "Неверный код подтверждения") != 0) { echo "Ай-ай! Ошибочка. Попробуем снова каптчу ввести<br>"; // каптча $image->save_to_file_by_name("img_captcha","C:\tmp.jpeg"); $cap = $app->dlg_captcha_from_url("C:\tmp.jpeg"); $input->set_value_by_name("captchan",$cap); // сабмит формы $button->click_by_name("register"); $button->send_event_by_name("register","onclick"); sleep(3); $browser->wait_for(); } // проверка успешности регистрации с текущего айпи if (strpos ($webpage->get_body(), "Много регистраций") == 0) { $textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10); } else { echo "Много регистраций, меняем прокси<br>"; $i = $textfile->read_file("C:\res.txt",10); $browser->enable_proxy("all connections",$proxy[$i]); $textfile->write_file("C:\res.txt",$i+1,10,false); } } $app->quit(); |
Производительность скрипта очень сильно зависит от скорости и качества используемых прокси.
Скрипт написан 18.01.2012 в Human Emulator 4.2 Advanced.
На момент публикации статьи 23.01.2012 скрипт был рабочий.