В этой статье мы рассмотрим один из примеров написания скрипта для добавления объявлений на сайт irr.ru, в раздел Компьютерная техника->Ноутбуки.
Начнем с подготовительной части — просмотрим сайт и узнаем какие поля обязательны для заполнения и какие нам бы хотелось заполнить дополнительно.
В нашем случае это будет — Область;город;цена (в руб.);марка;модель;состояние;тип предложения;вес(кг);размер жесткого диска (в Гб);тип видеокарты;объем памяти; диагональ экрана(дюймы);время работы батареи(часы);тип аккумулятора;описание;название папки с фотографиями;контактное лицо;телефон;скайп.
В таком виде (через «;») данные будут вбиваться в текстовый файл, откуда в последствии будут взяты при добавлении объявления.
Начнем с настроек:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$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; |
Начнем писать скрипт:
Читаем данные и присвоим им переменные для удобства:
1 |
$adds = $textfile->read_file($path); |
Получим массив объявлений, разбив данные объявлений из текстового файла через перенос строки
1 |
$add = explode("\r\n",$adds); |
Затем перейдем на сайт
1 |
$browser->navigate("http://irr.ru/"); |
Авторизируемся
1 2 3 |
$input->set_value_by_name("login",$login); $input->set_value_by_name("password",$pass); $button->click_by_inner_text("Вход",false); |
Переходим к подаче объявления
1 |
$anchor->click_by_inner_text("Подать объявление",false); |
C помощью цикла начинаем подачу объявлений
1 |
for($i = $num; $i<count($add); $i++) |
Получаем элементы данных объявления в массиве
1 |
$item = explode(";",$add[$i]); |
Начинаем вбивать данные:
1 2 3 4 5 6 7 |
// область $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 с помощью клавиатуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// перейдем к категории ноутбуки $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); |
Продолжаем заполнение объявления:
1 2 |
// цена $input->set_value_by_name("price",$item[2]); |
Модель и марку выбираем через «другая» для упрощения кода:
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 |
// марка $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]); |
Обрабатываем добавление фотографий:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// фотографии (не более 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); } |
Завершаем добавление данных:
1 2 3 4 5 6 7 8 |
// контактное лицо $input->set_value_by_name("seller",$item[10]); // телефон $input->set_value_by_name("phone",$item[11]); // скайп $input->set_value_by_name("skype",$item[12]); |
Обрабатываем капчу:
1 2 3 4 5 6 |
// капча $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); |
Жмем «далее»:
1 |
$button->click_by_name("next_link"); |
Ждем обработку объявления, проверяя наличие соответствующего сообщения на странице:
1 2 |
while(!$h2->is_exist_by_inner_text("Выберите формат Вашего объявления",false)) sleep($wt_long); |
Выбираем бесплатный вариант добавления:
1 2 |
$anchor->click_by_inner_text(" на 30 дней Бесплатно",false); sleep($wt); |
Проверяем успешность добавления, опять-таки через проверку наличия соответствующего сообщения на странице:
1 2 3 4 5 6 7 8 9 10 |
if ($h2->is_exist_by_inner_text("Спасибо! Ваше объявление размещено на irr.ru",false)) { debug_mess("объявление размещено"); sleep($wt); } else { debug_mess("<b>объявление НЕ размещено</b>"); sleep($wt); } |
Примечание:
1) не забываем ставить «слипы» (sleep), особенно, если интернет медленный или компьютер маломощный;
2) скрипт расчитан на добавление до 3-х фотографий;
3) для корректной работы,перед запуском скрипта, отключить сообщения браузера (сервис-настройки-браузер-отключить сообщения браузера).
Логика скрипта:
1) считывание данных объявления;
2) переход на сайт и авторизация;
3) добавление объявления;
4) проверка успешности добавления;
Скрипт написан 19.11.2014 в Human Emulator 4.6.50 Advanced.