Страница 1 из 1

выполнить повторный запуск скрипта при неправильно введенной

Добавлено: 07 фев 2011, 23:19
ПХПнуп
Привет!
У меня есть скрипты регистраций и я хочу прикрутить к ним условие: "Если на страничке есть фраза "капча введена неверно", то запустить скрипт заново, а если фраза "капча неверна" отсутствует, то ничего не делать.
Нашел что при делах как-то функция stristr, но хотелось бы получить блок кода для Хэмулятора с условиями.
Заранее спасибо.

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 08 фев 2011, 12:29
satih

Код: Выделить всё

if (strpos($webpage->get_body(),'капча введена неверно')) $app->restart(__FILE__);
$webpage->get_body() - парсит сурс страницы
strpos() - проверяет если в тексте есть фраза
$app->restart() - перезапускает
__FILE__ - макрос пхп, превращается в полный путь включая имя файла (который вызвал этот макрос)

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 08 фев 2011, 14:47
ilekor
ПХПнуп писал(а):Привет!
У меня есть скрипты регистраций и я хочу прикрутить к ним условие: "Если на страничке есть фраза "капча введена неверно", то запустить скрипт заново, а если фраза "капча неверна" отсутствует, то ничего не делать.
Нашел что при делах как-то функция stristr, но хотелось бы получить блок кода для Хэмулятора с условиями.
Заранее спасибо.
воспользуйтесь функцией while например

Код: Выделить всё

while(eregi("(капча введена неверно)", $webpage->get_body(), $result)){
повторить регистрацию
}

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 08 фев 2011, 17:27
satih
сработает, но eregi пользовать без регулярок.. зачем? strpos и сделана чтоб искать заранее известную фразу. eregi мало того что deprecated (забыл как оно на русском :) ), так еще и работает через регекспы

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 08 фев 2011, 22:46
ПХПнуп
Добавил строку if (strpos($webpage->get_body(),'капча введена неверно')) $app->restart(__FILE__);
получилось порнографически-перезапуск эмулятора!
Уточню наверное, в чем нужна помощь на примере использования:
У меня есть 100500 скриптов, которые я запускаю постредством запускатора:
<?php

$xhe_host ="127.0.0.1:7012";

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

require("../My Scripts/aqualogo.ru.php");
require("../My Scripts/a-realtour.ru.php");

$app->quit();
?>

И что мне надо, так это дописать в скрипт aqualogo.ru.php указание пройтись по скрипту заново, в случае если "капча введена неверно" и когда я все-таки введу капчу перейти к выполнению скрипта a-realtor.php
возможно такое? если есть варианты по тому как реализовать поочередный запуск множества скриптов не через запускатор, то тоже выслушаю:)

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 фев 2011, 04:32
satih
к сожалению в scheduler хумана нельзя поставить задание "по окончанию скрипта #1 запусти скрипт #2". как вариант по окончанию первого скрипта запуск второго через restart. можно сделать также и через require, хотя это серьезно будет порнография.
идея такая: главный скрипт будет что-то вроде планировщика, который будет запускать тот или иной require. require в свою очередь будет возвращать ответ через глобальные переменные. имхо, порно, но что-то в такой поздний час сложно представить как сделать иначе без нормального знания пхп.

и так главный скрипт, "планировщик":

Код: Выделить всё

<?php

$xhe_host ="127.0.0.1:7012";

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

// с какого скрипта начинаем
global $g_script_num = 1;


while (true) {
	switch ($g_script_num) {
		case 1:
			require("../My Scripts/site1.php");
			break;
		case 2:
			require("../My Scripts/site2.php");
			break;
		case 3:
			require("../My Scripts/site3.php");
			break;
		default:
			$app->exitapp();
	}
}


$app->quit();
?>
скрипт #1:

Код: Выделить всё

<?php
do {
/*
тут код самого скрипта, заполнение полей, сабмит и т.п.
проверка на то разгадана каптча или нет в while (в конце)
если будет сообщение 'каптча не разгадана', цикл повторится
если не будет сообщения 'каптча не разгадана', выход из цикла do while
*/
} while (strpos($webpage->get_body(), 'каптча не разгадана'));

// увеличиваем глобальную переменную для запуска следущего скрипта
$g_script_num++;
?>
в резульате получится что топ скрипт, "планировщик", смотрит по переменной $g_script_num какой require запускать, а запущеный require в свою очередь когда закончил работать и убедился что нет сообщения о неразгаданой каптче, поднимает переменную $g_script_num на 1 и возвращается, тем самым планировщик запускает следующий require. так проходим по всем require, пока $g_script_num не становится слишком высоким (в этом примере 4), тогда срабатывает default и хуман выходит ($app->exitapp() )

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

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 фев 2011, 13:02
ilekor
satih писал(а):сработает, но eregi пользовать без регулярок.. зачем? strpos и сделана чтоб искать заранее известную фразу. eregi мало того что deprecated (забыл как оно на русском :) ), так еще и работает через регекспы
Я для примера просто дал ))), что вот мол надо вайл использовать, а так я использую strpos, ранее я уже выкладывал способ поиска фраз.

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 фев 2011, 14:25
ПХПнуп
при запуске вышеуказанного запускатора :

<?php

$xhe_host ="127.0.0.1:7012";

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

// с какого скрипта начинаем
global $g_script_num = 1; <<<< ----ошибка ссылается сюда.


while (true) {
switch ($g_script_num) {
case 1:
require("../My Scripts/site1.php");
break;
case 2:
require("../My Scripts/site2.php");
break;
case 3:
require("../My Scripts/site3.php");
break;
default:
$app->exitapp();
}
}


$app->quit();
?>

Parse error: parse error, expecting `','' or `';'' in C:\Program Files (x86)\XWeb\Human Emulator\My Scripts\MyScript.php on line 9

П,С, я как раз и работал через require(мне так показали и я повторяю :) так что это для меня нормально.
очевидно что указанная схема вполне мне бы подошла, но первый ерор и я снова на форум :)

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 фев 2011, 14:59
satih
сори, мой фак, не проверил..

Код: Выделить всё

<?php
 
$xhe_host ="127.0.0.1:7012";
 
// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
 
// с какого скрипта начинаем
global $g_script_num;
$g_script_num = 1;

 
while (true) {
	switch ($g_script_num) {
		case 1:
			require("../My Scripts/site1.php");
			break;
		case 2:
			require("../My Scripts/site2.php");
			break;
		case 3:
			require("../My Scripts/site3.php");
			break;
		default:
			$app->exitapp();
	}
}
 
 
$app->quit();
?>
хотя строку global $g_script_num; можно вообще стереть, это и так скрипт который будет стоять выше остальных, переменная автоматом будет глобальной.

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 фев 2011, 18:53
ПХПнуп
Вот! Заработало! Не сдобровать теперь мульйону сайтов :Р
Большое спасибо, прямо как подарок к новому году!)))

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 май 2011, 00:38
sas
про strpos() учтите что она может вернуть 0 позицию если текст с начала строки
чтобы это обойти либо добавляйте пробел слепливанием срок к переменной в которой ищите " ".$body
либо я пользую if (substr_count() > 0)
и то и другое очевидно выполняется дольше чистого strpos()

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 09 май 2011, 03:21
satih
100% кошерное применение strpos достигается не прибавлением символов/функций, а проверкой

if (strpos() === false)

в мане пхп жырным краным цветом выделен warning :) т.е. strpos вернет либо позицию найденого символа (которое может быть и ноль), либо false если ничего не найдено.

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 10 май 2011, 00:17
sas
да, но в моем случае, когда я писал скрипт, нужно было выполнить код если есть наличие т.е. тогда надо писать

if (strpos()===false){}else
{
...код...
}

некрасиво выглядит на мой вкус.
ведь нет же оператора !=== ? или я что то пропустил?
и (!(strpos()===false)) как то тоже сложно читается, хотя.. может и сойдет, зато нет потерь на обработке слепливания строк

Re: выполнить повторный запуск скрипта при неправильно введе

Добавлено: 10 май 2011, 11:15
satih
есть оператор !==
http://www.php.net/manual/en/language.o ... arison.php

т.е. условие 'если найден текст' будет выглядеть:
if (strpos() !== false) {}