СКРИПТ: Публикация объявлений на доску Olx.ua

Подача, публикация, рассылка объявлений на доски. Удаление и редактирование старых объявлений. Нюансы работы с различными досками объявлений.
Ответить
Аватара пользователя
XwebDeveloper
Сообщения: 51
Зарегистрирован: 13 ноя 2017, 12:53

СКРИПТ: Публикация объявлений на доску Olx.ua

Сообщение XwebDeveloper » 13 фев 2020, 22:36

Скрипт выполнен на основе старого скрипта Slando

Версия программы: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 для определения координат кнопки добавить фотографию.

Формат данных точно такое же как в старом скрипте.

Скачать скрипт:
olx.zip
(114.71 КБ) 103 скачивания
Код запускаемого скрипта:
<?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>";
}
?>
Запрос на создание скриптов viewforum.php?f=61

Ответить