Версия программы:Human Emulator Studio 7.0.44.
Логика: Есть объявление в формате CSV с фотографиями. Скрипт получает данные объявлений из файла, заходит на olx.ua и публикует объявление с фотографиями.
Интресное:
1.Добавление фотографий выполняется с использованием технологии Компьютерного зрения
2. Самое хитрое поле оказалось поле выбора региона. На момент создания скрипта удалось заполнять его с помощью передачи событий.
Скрипт состоит:
Запускаемый файл - olx.php.
В папке tools находятся два файла adw_data.php для разбора данных и functions.php, в котором содержатся все основные функции скрипта. В этом же файле находится функция add_adword($obj) с помощью которой и публикуется объявление на доску.
В папке images содержатся фотографии для объявлений.
В папке data файл с данными adwords.csv и рисунок add_photo.jpg для определения координат кнопки добавить фотографию.
Формат данных точно такое же как в старом скрипте.
Скачать скрипт: Код запускаемого скрипта:
<?php /* ** // Наш сайт https://xn--80awbbeioodeq4h3a.xn--p1ai // Скрипт добавления объявлений на доску olx. // Обсудить скрипт или задать вопросу на форуме // viewtopic.php?f=53&t=2546 ** */ $xhe_host ="127.0.0.1:7011"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // //////////////////////// настройки скрипта ///////////////////////// // почтовый ящик $email="budanov-jakov@rambler.ru"; // логин почты $mail_login="budanovjakov"; // пароль от почты $mail_password="ViAswH#A"; // полный путь к папке с картинками $img_path=$debug->get_cur_script_folder()."\\images\\"; // путь к файлу с объявлениями $file_path="data/adwords.csv"; // путь к шаблонам кнопки $path_templ_imgs = $debug->get_cur_script_folder()."data\\add_photo.jpg"; // скрипт работает в режим отладки $dbg = true; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // функции require_once("tools/adw_data.php"); // /////////////////////// скрипт /////////////////////////////////////////// debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт запустили"); if(!$file_os->is_exist($file_path)) { debug_mess("ОШИБКА: Нет файла с данными объявлений!"); $app->quit(); } // перейти на доску $browser->navigate("olx.ua"); $anchor->click_by_inner_text("язык"); sleep(1); // нажимаем кнопку Подать объявление $span->click_by_inner_html("Подать объявление"); debug_mess("Заходим на доску объявлений"); if(!$span->is_exist_by_inner_text("Выйти")) { // вводим почту $input->send_keyboard_input_by_name("login[email_phone]",$email, "20:40"); // вводим пароль $input->send_keyboard_input_by_name("login[password]",$mail_password, "20:40"); // кнопка войти $btn->click_by_id("se_userLogin"); } // закрыть окно Подтвердите вашу учётную запись если оно есть $anchor->click_by_attribute("id", "fancybox-close"); $anchor->click_by_attribute("id", "fancybox-close"); debug_mess("Подаём объявления"); // подать все объявления из csv файла if (($handle = fopen($file_path, "r")) !== true) { while (($data = fgetcsv($handle,0, ";")) !== true) { // создадим объект $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(); sleep(3); // перейти на доску $browser->navigate("olx.ua"); // перейти к подаче обявления $anchor->click_by_inner_text("+ Подать объявление"); } fclose($handle); } // закрываем всё $browser->close_all_tabs(); // переходим на пустую страницу $browser->navigate("about:blank"); // чистим всё $app->clear(); debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу"); // Quit $app->quit(); ?>
Код вспомогательного файла с функциями:
<?php // добавить объявление function add_adword($obj) { global $input, $i, $label, $strong, $mouse,$anchor,$webpage,$path_templ_imgs, $window, $checkbox, $keyboard,$textarea, $email, $inputfile,$button, $img_path; debug_mess("Заполняем поля объявления"); // заголовок объявления $input->set_value_by_name('data[title]',$obj->str_title); // выбрать категорию $anchor->click_by_name("choose-category-button"); // while(!$anchor->is_exist_by_inner_text($obj->str_section,false)) { echo "ждём ссылку!"; sleep(1); } debug_mess("Выбираем категория, тип, макру и модель"); // основной тип объявления $anchor->click_by_inner_text($obj->str_section); // тип объявления $anchor->click_by_inner_text($obj->str_type); // марка $anchor->click_by_inner_text($obj->str_marka); // модель $anchor->click_by_inner_text($obj->str_model, false); debug_mess("Заполняем остальные поля"); // год выпуска $input->set_value_by_name("data[param_motor_year]",$obj->str_year); $input->set_focus_by_name("data[param_motor_year]"); // тип кузова $anchor->click_by_inner_text($obj->str_car, false); // цвет $anchor->click_by_inner_text($obj->str_color, false); // коробка передач $anchor->click_by_inner_text($obj->str_trans,false); // топливо $anchor->click_by_inner_text($obj->str_fuel,false); // Объем двигателя $input->set_value_by_name("data[param_motor_engine_size]",$obj->str_engine); $input->set_focus_by_name("data[param_motor_engine_size]"); // закрыть окно Подтвердите вашу учётную запись если оно есть $anchor->click_by_attribute("id", "fancybox-close"); $anchor->click_by_attribute("id", "fancybox-close"); $anchor->click_by_id("mobileAppsbadgeClose"); // Пробег $input->set_inner_text_by_name("data[param_motor_mileage]",$obj->str_km); // цена $input->set_value_by_name("data[param_price][1]",$obj->str_price); $input->set_focus_by_name("data[param_price][1]"); debug_mess("Добавляем картинки"); // получим массив картинок и добавим их в объявление $a_photos=explode(",",$obj->str_photo); sleep(1); $label->set_focus_by_inner_text("Описание*"); // фотографии for($a=0;$a<count($a_photos);$a++) { $window->execute_open_file("файлов ", $img_path.trim($a_photos[$a]), "&Открыть", false, true); $pos = $webpage->get_pos_in_webpage_picture($path_templ_imgs ,0.9,4); echo "левый верхний угол картинки $pos->x x $pos->y<br>"; $mouse->send_move($pos->x,$pos->y); $mouse->send_click($pos->x,$pos->y); sleep(mt_rand(1,3)); } // установим хитрый чек /*$checkbox->set_focus_by_attribute("name","data[param_price][2]"); $keyboard->press_key_by_code(32);*/ debug_mess("Заполняем оставшиеся поля"); // Частное лицо / Бизнес $anchor->click_by_inner_text($obj->str_bis,false); // Номер телефона $input->set_value_by_name("data[phone]",$obj->str_tel); $input->set_focus_by_name("data[phone]"); // Описание $textarea->set_value_by_name("data[description]",$obj->str_desc); $textarea->set_focus_by_name("data[description]"); // хитрое поле регион $input->send_keyboard_input_by_name("data[city]",$obj->str_city.", ".$obj->str_region."\n", "20:40"); $input->send_event_by_name("data[city]", "onkeyup"); sleep(1); $input->send_event_by_name("data[city]", "onchange"); $input->send_keyboard_input_by_name("data[city]","\n", "20:40"); // Контактное лицо* $input->set_value_by_name("data[person]",$obj->str_contact); debug_mess("Публикуем"); // опубликовать $button->click_by_id("save"); return true; } // задать город function set_city($city) { global $element, $anchor; // найти нужный город $i_elements=$element->get_count(); // пройтись по всем элементам for($j=0;$j<$i_elements;$j++) { // найти элемент с нужным тектсом if($element->get_inner_text_by_number($j)==$city) { // получить value $vl=$element->get_value_by_number($j); // кликнуть по ссылке с заданным текстом $anchor->click_by_inner_text($city." ".$vl); $anchor->click_by_inner_text($city."".$vl); return true; } } return false; } // активировать присланное письмо function activate_by_mail($mail_lg,$mail_pwd) { global $anchor, $input,$button,$element; // перейти и проверить письмо в почте $anchor->click_by_inner_text("Проверить почту ",false); // войти в почту $anchor->click_by_inner_text("Почта",true); // вводим данные $input->set_value_by_name("Login",$mail_lg); $input->set_value_by_name("Password",$mail_pwd); // войти $button->click_by_name("EnterBtn"); sleep(2); // ищем письмо с паролем $element->click_by_inner_text("\"\" ",true); // перейти в письмо $element->click_by_inner_text("\"Slando.ua\" "); // активировать объявление $anchor->click_by_inner_text("Активировать"); // удалить письмо $anchor->click_by_inner_text("Удалить ",false); return true; } // dedupe results file function dedupe($str_file) { $a = file($str_file); $a = array_unique($a); $h = fopen($str_file, 'w'); fwrite($h, implode("",$a)); fclose($h); return true; } // получить строку по префиксам function get_string($str1, $pr1, $pr2) { //echo $str1."<br>"; $ind1 = strpos ($str1,$pr1); // echo "инедкс 1 ".$ind1."<br>"; if($ind1===false) return ""; $ind2 = strpos ($str1,$pr2,$ind1); //echo "инедкс 2 ".$ind2."<br>"; if($ind2===false) return ""; $sres = substr($str1,$ind1+strlen($pr1), $ind2-$ind1-strlen($pr1)); //echo $sres; return trim($sres); } // выдать сообщение в панель отладки function debug_mess($mess) { global $dbg; // отладочные сообщения if($dbg) echo $mess."<br>"; } ?>