Регистрация сайта в поисковых системах

Итак, вы создали свой сайт или несколько сайтов. Опубликовали несколько статей и желаете что бы на него/них пошли новые пользователи.
По статистике, примерно 90 процентов новых пользователей приходят с поисковых систем.
Поэтому после запуска проекта, следует добавить ссылку на него в поисковики через так называемую аддурилку (add url).

Мы решили автоматизировать данный процесс и представляем вашему вниманию готовое решение для добавления ваших сайтов во все самые популярные поисковые системы:
GOOGLE
YANDEX
MAIL.RU
BING
NIGMA.RU

Для регистрации в некоторых поисковиках вам понадобятся учётные записи. Их нужно добавить в login.txt файл в формате:
gmail.com логин;пароль
mail.ru логин;пароль
nigma.ru логин;пароль

Список ваших сайтов нужно добавить в файл sites.txt в формате:
site1.ru
site2.ru
site3.ru
site4.ru
site5.ru
и т.д.

Настройки скрипта:

// путь к файлу с сайтами
$path_to_sites = "data/sites.txt";
// путь к файлу с логинами для поисковых систем
$path_to_logins = "data/logins.txt";
// ключ для капчи - ключ сервиса для распознавания капч antigate.com
$my_key = "";

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

quit();
?>

Скрипт написан 31.01.2012 в Human Emulator 4.6.2 Advanced.

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

Скрипт для добавления объявлений на сайт irr.ru

В этой статье мы рассмотрим один из примеров написания скрипта для добавления объявлений на сайт irr.ru, в раздел Компьютерная техника->Ноутбуки.

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


В нашем случае это будет — Область;город;цена (в руб.);марка;модель;состояние;тип предложения;вес(кг);размер жесткого диска (в Гб);тип видеокарты;объем памяти; диагональ экрана(дюймы);время работы батареи(часы);тип аккумулятора;описание;название папки с фотографиями;контактное лицо;телефон;скайп.


В таком виде (через «;») данные будут вбиваться в текстовый файл, откуда в последствии будут взяты при добавлении объявления.

Начнем с настроек:

$dbg = true; - вкл. панель отладки
// ключ к капчи
$apikey = "";  - ключ для сервиса anti-captcha.com
// путь к папке с фото
$picture = "data/";       - путь к папке с папками фотографий объявлений
// путь к капче
$img = "res/";   - путь к сохраняемой капчи
// путь к файлу с данными
$path = "data/adds.txt";  - путь к файлу с данными объявлений
// данные для авторизации
$login = "testnot@mail.ru";
$pass = "testfortest";
// ожидание ( в секундах)
$wt_long = 10;
$wt = 5;

Начнем писать скрипт:

Читаем данные и присвоим им переменные для удобства:

$adds = $textfile->read_file($path);

Получим массив объявлений, разбив данные объявлений из текстового файла через перенос строки

$add = explode("\r\n",$adds);

Затем перейдем на сайт

$browser->navigate("http://irr.ru/");

Авторизируемся

$input->set_value_by_name("login",$login);
$input->set_value_by_name("password",$pass);
$button->click_by_inner_text("Вход",false);

Переходим к подаче объявления

$anchor->click_by_inner_text("Подать объявление",false);

C помощью цикла начинаем подачу объявлений

for($i = $num; $i

Получаем элементы данных объявления в массиве

$item = explode(";",$add[$i]);

Начинаем вбивать данные:

// область
   $anchor->set_focus_by_href("javascript:void(0)",false);
   $keyboard->send_input($item[0]);
   $keyboard->send_key(9);

// город
   $input->set_value_by_name("address_city",$item[1]);

Затем обходим простым способом javascript с помощью клавиатуры:

// перейдем к категории ноутбуки
   $keyboard->send_key(9);
   $keyboard->send_key(40,true);
   $keyboard->send_key(40);
   $keyboard->send_key(40);
   $keyboard->send_key(40);
   $keyboard->send_key(40);
   $keyboard->send_key(13,true);
   sleep($wt);
	
   $keyboard->send_key(9);
   $keyboard->send_key(40,true);
   $keyboard->send_key(40);
   $keyboard->send_key(13,true);
   sleep($wt);
	
   $keyboard->send_key(9);
   $keyboard->send_key(40,true);
   $keyboard->send_key(40);
   $keyboard->send_key(9);
   sleep($wt);

Продолжаем заполнение объявления:

// цена
   $input->set_value_by_name("price",$item[2]);

Модель и марку выбираем через "другая" для упрощения кода:

// марка
   $anchor->set_focus_by_inner_text("* Выберите марку",false);
   $keyboard->send_input("Другая");
   $keyboard->send_key(9);
   $input->set_value_by_name("make_other",$item[3]);
	
// модель
   $input->set_value_by_name("model_other",$item[4]);

// состояние (привязка к слову "новый", в противном случае всегда будет б/у)
   $anchor->set_focus_by_inner_text("* Состояние",false);
	if($item[5] == "новый")
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	else
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	$keyboard->send_key(9);
		
// тип предложения (снова используем клавиатуру)
   $anchor->set_focus_by_inner_text("* Тип предложения",false);
	if($item[6] == "куплю")
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	elseif($item[6] == "продам")
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	elseif($item[6] == "обменяю")
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	else
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	$keyboard->send_key(9);

// вес (кг)
   $input->set_value_by_name("weight",$item[7]);
	
// размер жесткого диска (в Гб)
   $input->set_value_by_name("hdd",$item[8]);

// тип видеокарты (привязка к слову "встроенная", иначе всегда "дискретная")
   $anchor->set_focus_by_inner_text("тип видеокарты",false);
	if($item[9] == "встроенная")
	{
		$keyboard->send_key(40);
	}
	else
	{
		$keyboard->send_key(40);
		$keyboard->send_key(40);
	}
	$keyboard->send_key(9);

// объем памяти (в мб)
   $anchor->set_focus_by_inner_text("Объем памяти, Мб",false);
   $keyboard->send_input($item[10]);
   $keyboard->send_key(9);

// диагональ экрана (дюймов)
   $input->set_value_by_name("diagonal",$item[11]);
	
// время работы батареи (ч)
   $input->set_value_by_name("battery",$item[12]);
	
// тип аккумулятора
   $input->set_value_by_name("tip_akkumuljatora",$item[13]);
	
// описание
   $textarea->set_value_by_name("text",$item[14]);

Обрабатываем добавление фотографий:

// фотографии (не более 10),считываем все фотографии из указанной папки (по названию) в данных объявления:
   $photos = $folder->get_all_items($picture.$item[9],false,false);
   
// получаем массив путей к фото:
   $images = explode("\r\n", $photos);
	
// добавляем все фото на сайт:
   foreach($images as $photo)
	{
		$window->execute_open_file("Выбор",$photo,"&Открыть",false,true);
		$inputfile->click_by_name("photo");
		sleep($wt);
	}

Завершаем добавление данных:

// контактное лицо
   $input->set_value_by_name("seller",$item[10]);
	
// телефон
   $input->set_value_by_name("phone",$item[11]);
	
// скайп
   $input->set_value_by_name("skype",$item[12]);

Обрабатываем капчу:

// капча
   $img = realpath($img);
   $image->screenshot_by_name($img."/captcha.jpeg","captcha");
   $captcha = $anticapcha->recognize($img."/captcha.jpeg", $apikey, $path ='http://www.anti-captcha.com',true,5,120,0,0,1,0,0,0);
   $input->set_value_by_name("captcha",$captcha);
   sleep($wt);

Жмем "далее":

$button->click_by_name("next_link");

Ждем обработку объявления, проверяя наличие соответствующего сообщения на странице:

while(!$h2->is_exist_by_inner_text("Выберите формат Вашего объявления",false))
sleep($wt_long);

Выбираем бесплатный вариант добавления:

$anchor->click_by_inner_text(" на 30 дней Бесплатно",false);
sleep($wt);

Проверяем успешность добавления, опять-таки через проверку наличия соответствующего сообщения на странице:

if ($h2->is_exist_by_inner_text("Спасибо! Ваше объявление размещено на irr.ru",false))
	{
		debug_mess("объявление размещено");
		sleep($wt);
	}
	else
	{
		debug_mess("объявление НЕ размещено");
		sleep($wt);
	}

Примечание:

1) не забываем ставить "слипы" (sleep), особенно, если интернет медленный или компьютер маломощный;


2) скрипт расчитан на добавление до 3-х фотографий;


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

Логика скрипта:

1) считывание данных объявления;


2) переход на сайт и авторизация;


3) добавление объявления;


4) проверка успешности добавления;

Скрипт написан 19.11.2014 в Human Emulator 4.6.50 Advanced.

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

Скрипт Human Emulator размещения объявления на доске Slando

Предлагаем вашему вниманию скрипт, который добавляет объявления на бесплатную доску объявлений Slando.

Скрипт берёт данные для объявления из заранее подготовленного csv файла и добавляет их на Slando,
при первом проходе скрипт идёт на почту и активирует там добавленное объявление.

В CSV файле данные для объявления содержаться в следующем формате:

заголовок объявления;раздел объявления;тип объявления;марка;модель;цена;цвет;год;кпп;топливо;
объём двигателя;пробег;бизнес или частное лицо;номер телефона;описание;список фотографий через ,;
регион;город;контактное лицо


Peugeot 508 Allure 2.0HDI 2012;Транспорт;Легковые автомобили;Peugeot;508;37638;Белый;2012;Автомат;
Дизель;2000;4000;Частное лицо;0953203020;
Безопасность: ABD, ABS, ESP, Иммобилайзер, Ксеноновые фары, Подушка безопасности (Airbag), Серворуль, Сигнализация,
Центральный замок. Комфорт: Бортовой компьютер, Датчик света, Климат контроль, Кожаный салон,
Круиз контроль, Мультируль, Омыватель фар, Парктроник, Подогрев зеркал, Подогрев сидений,
Сенсор дождя, Усилитель руля, Эл. стеклоподъемники, Электропакет.Мультимедиа: CD, DVD, MP3,
Акустика, Магнитола, Система навигации GPS.Автомобиль с тест-драйва, на учете не стоял.
Комплектация Allure + ксенон + сигнализация + передний парктроник + белый перламутр.;img1.jpg,img2.jpg;Киевская;Киев;iltaua

… и т.д.

Настройки скрипта:

// почтовый ящик
$email="vanya.testscript@mail.ru";
// логин почты
$mail_login="vanya.testscript";
// пароль
$mail_password="q1w2e3r4t5";

// полный путь к папке с картинками
$img_path="C:\\XWeb\\Human Emulator\\My Scripts\\slando\\images\\" ;
// путь к csv файлу с объявлениями
$file_path="data/adwords.csv";

Для разбора данных мы написали специальный класс AdwordData. В скрипте мы объявляем объект этого класса,
а затем разбираем в него данные для того что бы передать их в форму добавления объявлений.
Для разбора CSV файла мы используем стандартные функции PHP. В принципе,
можно обойтись и без определения класса и работы с ним и передавать массив
с данными напрямую в функцию добавления объявления add_adword($obj)
по аналогии как это сделано в функции set($arr) в классе AdwordData.
В нашем случае работа с классом добавлена для наглядности.

Сам скрипт:

set_model("IE7 Standard");
// подать все объявления из csv файла
if (($handle = fopen($file_path, "r")) !== true) 
{
    while (($data = fgetcsv($handle,0, ";")) !== true) 
    {
      // перейти на доску
      $browser->navigate("slando.com.ua");
		// перейти к подаче объявления
		$anchor->click_by_inner_text("+ Подать объявление");
      // создадим объект 
		$obj_adw = new AdwordData();
      // задать в объект значения
      $obj_adw->set($data);
      // показать что разобрали в панель отладки
      //$obj_adw->show();
		// добавить объявление в форму
		add_adword($obj_adw);
      // объявление прошло удачно 
      if($anchor->is_exist_by_inner_text("Проверить почту ",false))
      {   
          // активировать объявление
          activate_by_mail($mail_login,$mail_password);
          
      }
      else
         debug_mess("не добавили объявление!!!");
   
       //  закрыть все табы
       $browser->close_all_tabs();

    }
    fclose($handle);
}
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу");
// Quit
$app->quit();
?>

Скрипт написан 4.11.2012 в Human Emulator 4.4.21 Advanced.

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

Скрипт Human Emulator тестирования сайта с помощью эмуляции действий пользователя

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

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

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

Сам скрипт:

";

// переходим на сайт
$browser->navigate($my_site);
sleep($wt);

// ГУЛЯЕМ ПО САЙТУ
// определяемся с глубиной прохода внутрь сайта
$depth_in_site = rand(1, 5);
echo "Глубина прохода внутрь сайта: $depth_in_site
"; for ($a = 0; $a < $depth_in_site; $a++) { echo "итерация - $a
"; // медленно прокручиваем страницу вниз имитируя чтение echo "прокручиваем страницу вниз
"; scroll_down_page_slow(true); sleep(rand(1,3)); // медленно прокручиваем страницу вверх имитируя чтение echo "прокручиваем страницу вверх
"; scroll_up_page_slow(true); sleep(rand(1,3)); // закрываем лишние вкладки браузера $browser->close_all_tabs(); sleep(2); $browser->set_active_browser(0, true); sleep(2); // получаем номер случайной внутренней ссылки на странице echo "Получаем номер случайно ссылки на левом меню для клика
"; $arr_of_names = array("Главная", "Клуб", "Школа", "Скрипты", "Статьи", "Видео", "Прокси", "Полезное", "Контакты", "Услуги", "Human Emulator"); $number = ""; $inner_text = ""; echo "Будем кликать на: "; echo $inner_text = $arr_of_names[rand(0, count($arr_of_names)-1)]; echo "
"; $number = $anchor->get_number_by_inner_text($inner_text, true); echo "Номер случайной ссылки: $number
"; // скролим экран до момента когда ссылка появится в области видимости, // двигаем туда мышку и кликаем scroll_move_click($number); sleep(rand($wt, $wt_long)); } echo "Скрипт закончил работу.
"; // Quit $app->quit(); ?>

Скрипт написан 10.04.2014 в Human Emulator 4.6.42.

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

Скрипт Human Emulator проверки прокси

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

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

На вход скрипт принимает список проксей в виде файла в формате:

62.141.46.151:80

218.108.242.124:8080

192.227.137.47:7808

125.216.144.199:8080

192.110.163.22:8089

192.95.14.4:7808

101.226.74.168:8081

Рабочие прокси будут сохраняться в заданный в настройках файл в таком же формате. Список проксей для проверки можно найти
на нашем сайте.

Настройки скрипта:

// //////////////////////// настройки скрипта /////////////////////////

// сайт под который проверяем прокси
$str_site="www.yahoo.com";
// текст ссылки на странице
$str_link_text="";
// имя элемента на странице
// в данном случае это имя
// поля для ввода поискового запроса 
$str_elem_name="p";

// массив прокси
$a_proxy=file("data/proxy.txt");
// путь к файлу с хорошими проксями
$str_good_pr="res/proxy.txt";

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

quit();
}

// цикл проверки проксе
foreach($a_proxy as $pr)
{
  debug_mess(" проверяем прокси $pr");
  // задать прокси 
  $browser->enable_proxy("",trim($pr));

  // перейти на заданный сайт  
  $browser->navigate($str_site);
    
  // проверка по тексту ссылки  
  if($str_link_text!="")
  {
      if($anchor->is_exist_by_inner_text($str_link_text,false))
          $textfile->add_string_to_file($str_good_pr,trim($pr)."rn") ;
  }   // проверка по наличию элемента с таким именем если задано имя элемента
  else if($str_elem_name!="")
  {
      if($element->is_exist_by_name($str_elem_name))
          $textfile->add_string_to_file($str_good_pr,trim($pr)."rn") ;
  }
  // остановить браузер
  $browser->stop();
  // отменить прокси 
  $browser->disable_proxy("");
  // перейти на пустую страницу
  $browser->navigate("about:blank");
}
debug_mess("скрипт закончил работу");
// Quit
$app->quit();
?>

Скрипт написан 07.05.2013 в Human Emulator 4.6.5 Advanced.

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

Скрипт Human Emulator массовой проверки доменов

Скрипт массовой проверки доменов поможет вам определить свободные домены. Скрипт работает следующим образом:
берёт из заданного файла домены для проверки и прогоняет их через сервис проверки доменов на сайте cy-pr.com.
Домены в файле заданы в формате одна строка содержит один домен.

Все свободные домены складываются скриптом в отдельный файл в формате одна строка один домен.

Настройки скрипта:

// //////////////////////// настройки скрипта /////////////////////////
// файл с доменами для проверки 
$a_dmns = file("data/dmns.txt");
// файл с результатами
$str_res_file="res/res.txt";

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

delete($str_res_file);
// строка с доменами которую будем вводить на сайт
$str_dmns="";
// пройтись по всем доменам
for($i=0;$inavigate("http://www.cy-pr.com/tools/masswhois/");
       
        // если зашли в последний раз то добавим последний домен
        if($i==(count($a_dmns)-1))
          $str_dmns.=$a_dmns[$i];

        // задать домены в поле
        $textarea->set_value_by_name("doms",trim($str_dmns));
        $button->click_by_inner_text("Проверить");
        // ожидаем пока появится результат
        sleep(1);
        // разбираем результат и свободные пишем в заданный файл
        parse_results();
        // чистим строку с доменами
        $str_dmns="";     
     }
     // добавить домен в строку
     $str_dmns.=$a_dmns[$i];
     //echo $a_dmns[$i];
}
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу");
// Quit
$app->quit();
?>

Скрипт написан 25.10.2012 в Human Emulator 4.4.19 Advanced по просьбе одного из наших читателей.
На момент публикации статьи 25.10.2012 скрипт был рабочий.

Этот скрипт работает в Demo версии программы Human Emulator. Посмотреть все скрипты для Demo и Скачать Demo

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

Скрипт Human Emulator размножитель Gmail

Скрипт размножитель Gmail. Это скрипт, который из одного аккаунта gmail делает много.
Скрипт работает следующим образом, берём существующий аккаунт gmail и проставляем в нём точки. Для Gmail это всё один аккаунт, а вот для других сайтов разные.

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

Настройки скрипта:

// массив с почтовыми ящиками
$emails=array();
$emails[]="testtestmail@gmail.com"; 

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

");
// Quit
$app->quit();
?>

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

Этот скрипт работает в Demo версии программы Human Emulator. Посмотреть все скрипты для Demo и Скачать Demo

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

Скрипт Human Emulator подтверждение регистрации

Скрипт подтверждения регистрации. Это простейший скрипт, который демонстрирует как можно сделать подтверждение регистрации по мылу, используя Human Emulator.

Для примера возьмём сайт знакомств Mamba.ru. Этот сайт присылает на мыло ваш новый пароль, который он назначает вам и ваш логин. Так как мыло приходит в виде картинки,
то использовать POP не получается. Поэтому после регистрации, мы заходим в почтовый ящик через браузер, находим нужное нам письмо и получаем из него новый пароль и логин.

Примечание: Для завершения регистрации на сайте mamba.ru нужно вводить телефон и получать сообщение с кодом для активации.

Настройки скрипта:

// //////////////////////// настройки скрипта /////////////////////////
// почтовый ящик
$email="vanya.testscript@mail.ru";
// логин почты
$mail_login="vanya.testscript";
// пароль
$mail_password="q1w2e3r4t5";

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

navigate("mamba.ru");
// переходим к регистрации
$anchor->click_by_inner_text("Регистрация",true);
// вводим случайные данные 
$input->click_by_name("name");
$input->set_focus_by_name("name");
$input->set_value_by_name("name",$submitter->generate_random_name("RU","man"));
// вводим почту
$input->click_by_name("email");
$input->set_focus_by_name("email");
$input->set_value_by_name("email",$email);
// город
$input->click_by_number(2);
$input->set_value_by_number(2,$submitter->generate_random_city("RU"));
// выбираем случайную дату рождения
$listbox->select_random_by_name("birthday");
$listbox->select_random_by_name("birthmonth");
$listbox->select_random_by_name("birthyear");
// пол
$anchor->click_by_inner_text("Я парень",true);
// создать анкету
$button->click_by_inner_text("Создать анкету",true);

// перейти на mail.ru
$browser->navigate("mail.ru");
// войти в почту
$anchor->click_by_inner_text("Почта",true);
// вводим данные
$input->set_value_by_name("Login",$mail_login);
$input->set_value_by_name("Password",$mail_password);
// войти
$button->click_by_name("EnterBtn");
sleep(2);
// ищем письмо с паролем
$element->click_by_inner_text("\"Сеть знакомств Мамба\" ",true);
// получить данные
$dt=$webpage->get_body_inter_prefix_all("face=Arial>");

$a_dt=explode("
",$dt); // данные для mamba debug_mess("логин для mamba ".$mamba_login=trim($a_dt[0],">")); debug_mess("пароль для mamba ".$mamba_pwd=trim($a_dt[1],">")); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу
"); // Quit $app->quit(); ?>

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

Этот скрипт работает в Demo версии программы Human Emulator. Посмотреть все скрипты для Demo и Скачать Demo

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

Список скриптов работающих в Human Emulator Free и в Demo.

Наши партнёры из Human Emulator для ознакомления с программой предоставляют Demo версию XWeb Human Emulator,
которая имеет некоторые ограничения в функционале, но не имеет срока ограничения работы, а также полностью бесплатную версию Human Emulator Free. Таким образом Вы можете использовать эти версии для решение простых задач по автоматизации работы в интернете.

Мы решили составить список скриптов из написанных ранее нами и лежащих в свободном доступе, которые работают под Demo.

Скачать Human Emulator Free

Скачать Human Emulator Demo — на этой странице можно скачать Demo последней версии программы со встроенным Chromim(Chrome) и Демо последней версии со встроенным Internet Explorer.

скачать все скрипты для FREE

Установка и настройка скриптов:

  • Скачайте архив нужного вам скрипта
  • Распакуйте архив в папку «Путь к Human Emulator\My Scripts\»
  • Запустите Human Emulator и во вкладке “Быстрый старт” войдите в My Scripts\ и выберите скрипт для запуска.

    Видео пример как работать с Demo версией программы Human Emulator

    Внимание все скрипты предоставлены исключительно в ознакомительных целях! Ответственность за применение скриптов несут пользователи.

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

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

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

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

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

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

$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 нужного поля действительно имеет обычное и наверняка статичное название. Теперь, сверяясь с ДОМ-моделью, легко добавить в скрипт функции для работы со всеми нужными инпутами.

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

$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. В его базе присутствуют списки имён, фамилий, улиц и т.д., а так же функции генерации случайного текста, чисел и ников. Они-то и будут придумывать логины, пароли и фейковые мыла.

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

// переход на сайт
$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 для всех трёх. Эта функция выберет значение в выпадающей менюшке листбокса по его (значения) номеру. Так будет значительно проще создавать случайные даты рождения, в чём вы сможете убедиться чуть позже.

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

$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(); уже появлявшейся ранее. С ней нужные строки приобрели следующий вид:

$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. Такой расклад очень подходит для следующей функции, которую мы и добавим в скрипт:

$radiobox->set_checked_by_number(rand(0,1),true);

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

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

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

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

$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. А потом вставлять содержимое этой переменной в поле ввода текста с каптчи. Если вы уже запутались во всех этих пояснениях, то вот текст скрипта, что должен у нас получиться к этому моменту:

// переход на сайт
$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, на русском означающий что-то вроде «До тех пор…». То есть, содержимое цикла будет выполняться до тех пор, пока условие, указанное в начале, не будет нарушено:

//проверка доступности логина
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); получится две:

//выбор пола
$s = rand(0,1);
$radiobox->set_checked_by_number($s,true);

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

// вставка имени и фамилии
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 результат работы бредогенератора? Они-то нам и нужны. Третий аргумент – время, в течение которого функция будет пытаться записать файл. С нашими объёмами текста хватит и тысячной секунды, а я обычно ставлю там десятку, с запасом. Заполненная функция выглядит примерно так:

$textfile->add_string_to_file("C:\qip.txt",$user."||".$pass."\r\n",10);

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

// очистка кэша и куков
$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:

$proxy = file ("proxy.txt");
for($i=0;$iclear_cache();
$browser->clear_cookies("",true);
$browser->enable_proxy("all connections",$proxy[$i]);

/*Весь остальной скрипт*/
}

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

$proxy = file ("proxy.txt");
for($i=0;$iclear_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--;
}

}

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

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

while (strpos ($webpage->get_body(), "Неверный код подтверждения") != 0)
	{
		echo "Ай-ай! Ошибочка. Попробуем снова каптчу ввести
"; // каптча $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 будет срабатывать, пока не пропадёт надпись «Неверный код подтверждения». То есть, до успешного распознания.

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


$xhe_host ="127.0.0.1:7010";
require("../Templates/xweb_human_emulator.php");

$proxy = file ("proxy.txt");

// цикл пробежки по всем проксям в списке
for($i=0;$iclear_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 "Ай-ай! Ошибочка. Попробуем снова каптчу ввести
"; // каптча $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 "Много регистраций, меняем прокси
"; } $app->quit();

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

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

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

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

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

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

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

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

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

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

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

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


$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)clear_cache();
	$browser->clear_cookies("",true);

/*Весь остальной скрипт*/

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


/*Весь скрипт*/

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

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

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


$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)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 "Ай-ай! Ошибочка. Попробуем снова каптчу ввести
"; // каптча $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 "Много регистраций, меняем прокси
"; $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 скрипт был рабочий.

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