Как добавить еще событий для поиска?

вопросы и ответы по использованию PHP
Ответить
dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Как добавить еще событий для поиска?

Сообщение dmmmy3 » 17 сен 2020, 19:50

есть скрипт

<?php

$xhe_host = "127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
$bUTF8Ver=true;

$browser->navigate("https://olimp.com/mobile/index.php?page ... n=1&live=1");

//Авторизация
$anchor->click_by_inner_text("ВОЙТИ", false);
sleep(1);
$input->set_inner_text_by_name("login", "dmmmy3@gmail.com");$input->set_inner_text_by_name("passw", "");
sleep(1);
$input->set_inner_text_by_name("passw", "q.DAY.Wm3S2Rnhd");
sleep(1);
$button->click_by_value("Войти", false);

sleep(1);

//$browser->navigate("https://olimp.com/mobile/index.php?page ... n=1&live=1");
$text="2:6"; // !!!!! текст который надо найти
//выбор игры
//sleep(1);
$div->click_by_inner_text("TENNIS");
sleep(1);
$evnt = $span->get_by_inner_text($text, false);

while(!$evnt->is_visibled())
{
echo "Ждем появление нужного текста <br>";
sleep(1);

$evnt = $span->get_by_inner_text($text, false);
}

$prnt= $evnt->get_parent(2);
echo $prnt->get_inner_html();
$an= $prnt->get_child_by_attribute("href","index",false);

echo $an->get_href();
$an->send_mouse_click(3,2);

echo "вижу событие <br>";

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



а как добавить еще признаков, по которым определять игру? например 2:6 уже есть, а надо чтобы и 6:2 тоже искал?

Я пробовал так, ввести еще переменную $text2="6:2"; и вставив ее в соответствующих строчках, где есть переменная $text ну вообщем вот так:



$text="2:6";
$text1="6:2";
//выбор игры
$div->click_by_inner_text("TENNIS");
sleep(1);
$evnt = $span->get_by_inner_text($text xor $text1, false);

while(!$evnt->is_visibled())
{
echo "Ждем появление нужного текста <br>";
sleep(1);

$evnt = $span->get_by_inner_text($text xor $text1, false);
}

$prnt= $evnt->get_parent(2);
echo $prnt->get_inner_html();
$an= $prnt->get_child_by_attribute("href","index",false);

echo $an->get_href();
$an->send_mouse_click(3,2);

echo "вижу событие <br>";

так же попробовал в 1 переменной записать - $text="2:6 xor 6:2"; ,или так $text="2:6 or 6:2";, и вот так $text="2:6 || 6:2"; но не получается!

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 17 сен 2020, 20:12

dmmmy3 писал(а):
17 сен 2020, 19:50

$text="2:6"; // !!!!! текст который надо найти
а как добавить еще признаков, по которым определять игру? например 2:6 уже есть, а надо чтобы и 6:2 тоже искал?

Я пробовал так, ввести еще переменную $text2="6:2"; и вставив ее в соответствующих строчках, где есть переменная $text ну вообщем вот так:
Текст в этой переменной это текст под Именем игроков(см рисунок). Если хотите какие то критерии добавить то строка, которую вы ищете должна быть в том же формате как и строка под именем.

К примеру у нас есть такое:

Хейман К. - Дуссин Л. Serve
Приостановлен
0:1 (2:6, 4:3) 30:30


получается что мы можем сделать следующее:
$n1 = "0:1";
$n2 = "2:6";
$n3 = "4:3"
$n4= "30:30";
В результате имеем для подмены полной строки:
$text = "$n1 ($n2, $n3) $n4";
если чать строки тогда к примеру:
$text = "($n2, $n3)"; или $text = "$n2, $n3"; и т.д.
exmple2.jpg
exmple2.jpg (106.45 КБ) 4474 просмотра

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 17 сен 2020, 21:46

Я наверное, не правильно выразился! Я имел ввиду, чтобы бралась игра со счётом 2:3 и зеркально 3:2, но не в одной игре, а в разных!

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 17 сен 2020, 22:48

Что делает пример ниже:

находит по заданному тексту игру и открывает её в новой вкладке, потом отзеркаливает текст и ищет новую игру и открывает её в новой вкладке.
Для того что бы указать вкладку браузера, в которой нужно работать скрипту используется функция $browser->set_active_browser(n); где n - порядковый номер вкладки начиная с нуля. Для открытия в новой вкладке используем добавление атрибута target=_blank. В скрипте это $an->add_attribute("target","_blank"); Открываемая вкладка всегда будет последней. При необходимости её номер можно узнать следующим образом: $last_browser_num = $browser->get_count()-1;

<?php

$xhe_host = "127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
$bUTF8Ver=true;

$browser->enable_proxy("","socks5://127.0.0.1:9150");

// закрываем все браузеры перед работай скрипта
$browser->close_all_tabs();

$browser->navigate("https://olimp.com/mobile/index.php?page ... n=1&live=1");

// Авторизация
$anchor->click_by_inner_text("ВОЙТИ", false);
sleep(1);
$input->set_inner_text_by_name("login", "dmmmy3@gmail.com");$input->set_inner_text_by_name("passw", "");
sleep(1);
$input->set_inner_text_by_name("passw", "q.DAY.Wm3S2Rnhd");
sleep(1);
$button->click_by_value("Войти", false);

sleep(1);

//$browser->navigate("https://olimp.com/mobile/index.php?page ... n=1&live=1");
$text="6:2"; // !!!!! текст который надо найти
//выбор игры
//sleep(1);
$div->click_by_inner_text("ТЕННИС");
sleep(1);

// открываем игру с заданным текстом
// в новом окне
open_game($text);
// что делаем на странице с игрой

// делаем активным первый браузер
$browser->set_active_browser(0);
// strrev 
// выводим отзеркаленый текст в панель отладки
echo strrev($text)."<br"; 
//  открываем отзеркаленную игру
open_game(strrev($text));
// что то делаем на странице с игрой

// открыть игру 
function open_game($text)
{
    global $span;
    // получить элемент по тексту 
	$evnt = $span->get_by_inner_text($text, false);
  
    // ожидаем пока появится нужный текст
	while(!$evnt->is_visibled())
	{
		echo "Ждем появление нужного текста <br>";
		sleep(1);

		$evnt = $span->get_by_inner_text($text, false);
	}
    // получить родительский элемент на два уровня выше в дереве
	$prnt= $evnt->get_parent(2);
    // получить его html для проверки  
	echo $prnt->get_inner_html()."<br";
    // получаем ссылку на игру
	$an= $prnt->get_child_by_attribute("href","index",false);

       // добавим атрибут что бы при клике открывался в новом окне
	$an->add_attribute("target","_blank");

	usleep(500);
    // проверка ссылки 
	echo $an->get_href()."<br";
    // кликаем через передачу события от мыши элементу
	$an->send_mouse_click(3,2);

    return true; 
}

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

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 18 сен 2020, 20:43

а если кодим вот так, разве оно не должно срабатывать, однако не срабатывает и поиск по нескольким переменным на странице не происходит
//Опознание пола игрока
$s1 = "Мужчины";
$s2 = "родился";
$s3 = "Теннисист ";

$search = "($s1, $s2, $s3)";

if ($div->is_exist_by_inner_text("$search", false)){
echo "<br>Играют мужики! Потому что я нашел $search<br>";
}
else
{
echo "<br>Играют женщины! <br>";
}
а срабатывает только если вместо $search вписать то что есть на странице, например: мужчины или женщины?

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 18 сен 2020, 20:47

dmmmy3 писал(а):
18 сен 2020, 20:43
а если кодим вот так, разве оно не должно срабатывать, однако не срабатывает и поиск по нескольким переменным на странице не происходит
//Опознание пола игрока
$s1 = "Мужчины";
$s2 = "родился";
$s3 = "Теннисист ";

$search = "($s1, $s2, $s3)";

if ($div->is_exist_by_inner_text("$search", false)){
echo "<br>Играют мужики! Потому что я нашел $search<br>";
}
else
{
echo "<br>Играют женщины! <br>";
}
а срабатывает только если вместо $search вписать то что есть на странице, например: мужчины или женщины?
Только если есть чёткое совпадение такой строки. По вашему коду он ищет вхождение такого куска строки "(Мужчины, родился, Теннисист)" . Если вам нужно каждую строку проверять на вхождение отдельно каждого слова то это надо делать перебором.

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 18 сен 2020, 21:06

а как это сделать перебором? команда какая то?

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 18 сен 2020, 23:41

dmmmy3 писал(а):
18 сен 2020, 21:06
а как это сделать перебором? команда какая то?
Нет, вам нужно получить все элементы с текстом счёта игр, после чего пройтись по всем элементам и сопоставить текст элементов с теми текстами, которые вам надо найти, если нашли по одному из вариантов совпадение берёте этот элемент, получаете ссылку возле него и переходите по ней.

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

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 19 сен 2020, 21:44

Допустим есть страница c информацией о теннисисте: https://yandex.ru/search/?text=%D0%A0%D ... .&lr=10306 нужно по странице в заголовках и в теле сниппета проверить перебором слова: "Мужчины, Родился, теннисист ". Если есть одно из этих слов, делаем одно действие, если нет то другое.

У сниппета общий класс во всех записях в заголовках: organic__url-text
А в теле сниппета: text-container typo typo_text_m typo_line_m organic__text
райсма 2.jpg
райсма 2.jpg (193.62 КБ) 79 просмотров
райсма 1.jpg
райсма 1.jpg (199.01 КБ) 79 просмотров
Значит получаем текст из этого класса, а дальше то как искать? Помогите реализовать пожалуйста!
<?php

$xhe_host = "127.0.0.1:6";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
$bUTF8Ver=true;

$div->get_inner_text_by_attribute("class", "organic__url-text", false);
$div->get_inner_text_by_attribute("class", "text-container typo typo_text_m typo_line_m organic__text", false);


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

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 19 сен 2020, 22:09

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

// массив со словами для поиска
$arr_seach = array("Мужчины", "Родился", "теннисист", "новости");

// переходим на яндекс
$browser->navigate("https://yandex.ru/");
// вводим в поиск
$input->send_keyboard_input_by_name("text","Райсма К. тенис год рожения\n", "20:40");

// получить все заголовки
$snps = $div->get_all_by_attribute("class","organic__url-text");
// вывод всех текстов заголовков в панель отладки
print_r($snps->get_inner_text());

// пройдёмся по всем полученным заголовокам 
foreach($snps->elements as $title)
{
   echo "заголовок: ".$title->get_inner_text()."<br>";
   // проверим каждый заголовок проверочным словом
   foreach($arr_seach  as $search)
   {
       echo "ищем слово: $search<br>";
       // ищем поисковое слово в тексте заголовка
       $ind = strpos($title->get_inner_text(),$search);
       if($ind!==FALSE)
       {
          echo "нашли слово $search в заголовке".$title->get_inner_text(); 
          // кликаем по заголовку мышью
          $title->send_mouse_click(2,3);
          // возвращаемся на активную вкладку для дальнейшего поиска
          $browser->set_active_browser(0);
       } 
   }
}

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 20 сен 2020, 19:17

Большое спасибо!

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 25 сен 2020, 21:27

По примеру выше написал следующий скрипт, его задача отсканировать текст снипета страницы определить пол, в случае совпадения слова из массива и присвоить переменную $gender, но почему то всё время else срабатывает и определяет что это женщина хотя на странице теннисист Бублик. Помогите подправить пожалуйста, что не так!?

страница с теннисистом: https://yandex.ru/search/?text=%D0%B1%D ... F&lr=10306
<?php

$xhe_host = "127.0.0.1:7";

// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
$bUTF8Ver=true;



// массив со словами для поиска
$arr_seach = array(" Муж", "Родился", "теннисист ", " он ", " ему ", " его ", "игрок ");


// получить все заголовки
$snps = $div->get_all_by_attribute("class","text-container typo typo_text_m typo_line_m organic__text");
// вывод всех текстов заголовков в панель отладки
print_r($snps->get_inner_text());

// пройдёмся по всем полученным заголовокам 
foreach($snps->elements as $title)
{
   echo "заголовок: ".$title->get_inner_text()."<br>";
   // проверим каждый заголовок проверочным словом
   foreach($arr_seach  as $search)
   {
       echo "ищем слово: $search<br>";
       // ищем поисковое слово в тексте заголовка
       $ind = strpos($title->get_inner_text(),$search);
       if($ind!==FALSE)
       {
          echo "нашли слово $search в заголовке".$title->get_inner_text(); 
          $gender=1;
          echo "<br>Играют мужчины<br>";
       }
         else
       {
         $gender=0;
         echo "<br>Играют женщины<br>";
       }
 
   }
}
echo "<br>$gender";
// Quit
$app->quit();
?>
бублик.jpg
бублик.jpg (223.96 КБ) 49 просмотров

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 26 сен 2020, 17:15

Да вроде всё правильно он находит. Если убрать , в "теннисист," и оставить просто "теннисист", то он найдёт и выдаст:

ищем слово: теннисист в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.
нашли слово теннисист в заголовкеАлекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.
Играют мужчины

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

аголовок: Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.
ищем слово: Муж в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.

Играют женщины
ищем слово: Родился в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.

Играют женщины
ищем слово: он в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.

Играют женщины
ищем слово: ему в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.

Играют женщины
ищем слово: его в заголовке
Алекса́ндр Станисла́вович Бу́блик — казахстанский профессиональный теннисист, до 2016 года выступавший за Россию. Первая ракетка Казахстана.

dmmmy3
Сообщения: 23
Зарегистрирован: 25 авг 2020, 14:37

Re: Как добавить еще событий для поиска?

Сообщение dmmmy3 » 26 сен 2020, 21:39

а где в коде слово "в "теннисист,""?

Аватара пользователя
Support
Site Admin
Сообщения: 936
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: Как добавить еще событий для поиска?

Сообщение Support » 26 сен 2020, 21:49

dmmmy3 писал(а):
26 сен 2020, 21:39
а где в коде слово "в "теннисист,""?
// массив со словами для поиска
$arr_seach = array(" Муж", "Родился", "теннисист ", " он ", " ему ", " его ", "игрок ");
да. не туда посмотрел, пробел надо убрать, это он в заголовке идёт с , и поэтому не находит.

либо наоборот добавить
// массив со словами для поиска
$arr_seach = array(" Муж", "Родился", "теннисист ","теннисист,", " он ", " ему ", " его ", "игрок ");

Ответить