Помогите новичку написать скрипт для Human!

вопросы и ответы по использованию PHP
nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 14 май 2011, 00:21

Тут же http://www.zhuk.net/users.php?m=register после подтверждения регистрации при заполнение профиля как реализовать вставку аватара с компа? Читал мануал, но так и не понял как это прописать...

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 18 май 2011, 02:25

Доброй ночи!

Как реализовать:

1) После регистрации на сайте где-то нужна активация по email, а где-то не нужна. После регистрации ищем текст "проверьте свой почтовый ящик" (Здесь все понятно), интересует следующее: если нужный текст не найден, то тогда пропустить активацию и перейти к дальнейшей регистрации.

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

Re: Помогите новичку написать скрипт для Human!

Сообщение satih » 18 май 2011, 03:14

nikson писал(а):если нужный текст не найден, то

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

if (strpos($webpage->get_body(), 'нужный текст') === false) {
	// go to the next registration
}

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 18 май 2011, 15:02

if (strpos($webpage->get_body(), 'нужный текст') === false) {
// go to the next registration
Что сюда вставлять?
}

Я так понимаю тут вставлять код дальнейшей регистрации, который идет после подтверждения реги по мылу?

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

Re: Помогите новичку написать скрипт для Human!

Сообщение satih » 18 май 2011, 17:27

у тебя регистрация по всем ресурсам идет в цикле или как? если в цикле, то можно вставить continue или break или $app->restart если в другом файле.. без твоего скрипта хз что вставить, вставить переход к следущей реге по большому счету.
ты поставил условие "если нужный текст не найден, то", я его перевел в код.

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 18 май 2011, 21:47

Регистрация по ресурсам проходит в цикле. Почитал про работу оператора continue на примере числовых значений, но так и не разобрался к примеру ( Условие $i="бла-бла-бла"; если условие не выполняется то не прекратить работу цикла, а начать его новую итерацию, тоесть перейти к регистрации следующего url).

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

Re: Помогите новичку написать скрипт для Human!

Сообщение satih » 19 май 2011, 03:57

правильно, поэтому как перейти к следущей регистрацие в цикле? прекратить данную итерацию и перейти к слeдущей, для чего и был придуман continue.

скажем если цикл переходит по урлам сайтов где регишься
foreach ($url_ar as $url) {
$browser->navigate($url);
// register
// submit

// проверка если нужна активация
if (strpos($webpage->get_body(), "проверьте свой почтовый ящик"))
continue; // тут прерываем данную итерацию и продолжаем к следущей


// если мы тут (continue не исполнился), значит нужна имеил верификация
// email verification
}

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 21 май 2011, 20:00

Спасибо, разобрался...

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 21 май 2011, 20:15

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

При стандартной регистрации заполняем input_name, на некоторых сайтах присутствуют два одинаковых по имени поля input_name (для авторизации и регистрации). Выше в теме советовали использовать так:

substr_count($webpage->get_body(), 'name="input_name"');

при условии если два инпута, то снимаем атрибут:

$input->remove_attribute_by_name('input_name','name');

и далее

$input->set_value_by_name('input_name', $login);

Я задал условие так:

if (substr_count($webpage->get_body(), 'name="input_name"'));
{
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}

Какое условие еще нужно дописать, чтобы все работало?

Аватара пользователя
igvard
Site Admin
Сообщения: 241
Зарегистрирован: 31 июл 2008, 22:53

Re: Помогите новичку написать скрипт для Human!

Сообщение igvard » 22 май 2011, 01:22

Условие количества. Если больше одного тогда убираем у первого инпута на странице атрибут name:

if (substr_count($webpage->get_body(), 'name="input_name"')>1);
{
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 23 май 2011, 01:19

Никак не могу понять в чем дело, здесь:

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

if (strpos($webpage->get_body(), 'нужный текст') === false) {
   // go to the next registration
}
Толи xuman тупит, то-ли я. По коду если нужный текст не найден, то должно выполняться условие, в моем случае условие то выполняется, то нет. Пробовал я и бред писать вместо нужного текста (условия выполнялись через раз). Я так понимаю текст ищется по полному словосочетанию или любое из слов?

Можно ли сделать так, если нужный текст найден, то

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

if (strpos($webpage->get_body(), 'бла-бла-бла') === true);
elseif (strpos($webpage->get_body(), 'бла-бла-бла') === true);
elseif (strpos($webpage->get_body(), 'бла-бла-бла') === true);
{
// Дальнейшие действия
}
Кстате тоже не работает.

И здесь непонятно, почему так происходит:

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

// Ищем input_name
if (substr_count($webpage->get_body(), 'name="input_name"')>1);
 {
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}
// Вводим логин.
$input->set_value_by_name('input_name', $login);
По коду, если на странице input_name больше одного, то выполняется условие $input->remove_attribute_by_name('input_name','name');
после выполнения условия $input->set_value_by_name('input_name', $login);. Тут проблема в том, что если на странице два input_name то все работает, но если на странице один input_name то условие тоже работает (хотя не должно),
если немного поменять код вместо:

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

// Ищем input_name
if (substr_count($webpage->get_body(), 'name="input_name"')>1);
 {
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}
// Вводим логин.
$input->set_value_by_name('input_name', $login);
Сделать вот так (убрать точку с запятой):

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

// Ищем input_name
if (substr_count($webpage->get_body(), 'name="input_name"')>1) {
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}
// Вводим логин.
$input->set_value_by_name('input_name', $login);
То так работает, но теперь уже на странице где два input_name пока точку с запятой не поставишь ничего работать не будет. В чем косяк? Не вижу логики в ;

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

Re: Помогите новичку написать скрипт для Human!

Сообщение satih » 23 май 2011, 10:25

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

$html = $webpage->get_body();
if (strpos($html, 'текст_1') !== false || strpos($html, 'текст_2') !== false || strpos($html, 'текст_3') !== false) {
	// Дальнейшие действия
}
почитай про оператор OR || тут и тут
в примере выше мы ищем одно из трех словосочетаний, это вроде то что тебе было нужно. мелкая поправка, strpos сравнивают обычно с false, и именно через !== , так как если строка начинается с искомого текста, strpos возвращает ноль. если же текст найден, возвращается его место, что в принципе пойдет как true, но через === кажется не прокатит, так как возвращается номер, integer, а ты сравниваешь с true, boolean, другой тип.
отличие == от === (снова, прочитай по ссылкам выше), это что оба сравнивают, но === проверяет также совпадение типов, например integer или boolean.
-------------------------------------------------------------------
знак ; означает в пхп окончание логической команды. писать if (); просто бесмысленно, так как после if знаком ; ты прекратил действие if. писать if(){} да логично, исполнится все что между {}, так что там где у тебя if (); этот if можно выкинуть, он не добавляет никакого логического функционала. (igvard случайно написал ; после if ())
nikson писал(а):Тут проблема в том, что если на странице два input_name то все работает, но если на странице один input_name то условие тоже работает (хотя не должно)
условие исполнятся недолжно, в сурсе ищется строка name="input_name" , если условие исполняется когда ты видишь только один такой инпут, значит второй тоже есть в сурсе, просто ты его не видишь на экране, скорее всего он скрытый (hidden). посмотри в сурсе, убедишься что он там, гад, прячется.

кстати иногда хуман воспринимает id как name, поэтому бывает необходимо сделать две строки

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

$input->remove_attribute_by_name('input_name','id');
$input->remove_attribute_by_name('input_name','name');
иначе не смотря на то что убрали один name, хуман все равно будет лепить в инпут по id, принимая его за name.

nikson
Сообщения: 94
Зарегистрирован: 20 янв 2011, 02:36
Контактная информация:

Re: Помогите новичку написать скрипт для Human!

Сообщение nikson » 25 май 2011, 00:15

Спасибо за помощь! Вот только чего-то условие не выполняется:

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

// Ищем input_name
if (substr_count($webpage->get_body(), 'name="input_name"')>1) {
// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
}
// Вводим логин
$input->set_value_by_name('input_name', $login);
Не могу понять почему не выполняется условие, точно знаю что на странице два input_name. Если же прописать без условия, а как в порядке вещей то все работает:

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

// снимаем атрибут name с инпута под именем input_name
$input->remove_attribute_by_name('input_name','name');
// Вводим логин
$input->set_value_by_name('input_name', $login);
Может что-то с условием напутано?

Аватара пользователя
igvard
Site Admin
Сообщения: 241
Зарегистрирован: 31 июл 2008, 22:53

Re: Помогите новичку написать скрипт для Human!

Сообщение igvard » 25 май 2011, 00:41

Возможно надо проверить 'name="input_name"' что бы строка была в обоих случаях именно такой, а не например 'name = "input_name" '.

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

Re: Помогите новичку написать скрипт для Human!

Сообщение satih » 25 май 2011, 02:28

командой

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

file_put_contents('debug.html', $webpage->get_body());
сохрани сурс в файл, и посмотри в текстовом редакторе что-же там за поля. точно что два раза это поле как 'name="input_name"' не стоит, иначе бы сработало.

Ответить