Скрипт по добавлению фотографий

Все вопросы касающиеся использования
программы можно задать здесь
morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Скрипт по добавлению фотографий

Сообщение morfius » 16 ноя 2010, 16:34

Появилась задача:
В созданной группе (для родственников) нужно в созданные альбомы добавить фотографии. В однокласниках нет паетной загрузки фото и тратить время естественно не хочется. Тем более когда есть такой софт.

Вот и хочу добить его так сказать до рабочего варианта.

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

<?php

$xhe_host ="127.0.0.1:7011";

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

// Идём на однокласники и логинимся

$browser->navigate('http://www.odnoklassniki.ru/cdk/st.cmd/main/tkn/1813');
$browser->wait_for(60,1);
$input->set_value_by_name('field_email','логин');
$input->set_value_by_name('field_password','пасс');
$button->click_by_name('hook_FormButton_button_go');
$browser->wait_for(60,1);

// успешно зашли ))

//далее выбираю группы, в группах выбираю группу, захожу в группу выбираю альбом, захожу в альбом и жму кнопку добавить фото - и всё - 

$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);
$button->click_by_name('hook_FormButton_button_add_photo');
$browser->wait_for(60,1);




// Quit
$app->quit();
?>
Но вот в чём незадача.
Скрипт входит на страницу одноклассники.ру , вводит логин и пароль, а вот в группу уже не заходит.
И при записи скрипта, обратил внимание, что нажатие клавиш не записывалось вплоть до того момента, пока не нажал клавишу добавить фото. И всё добавилось целиком.

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

Re: Скрипт по добавлению фотографий

Сообщение Support » 16 ноя 2010, 16:41

Помимо записи скрипта макросом, есть другие методы. Попробуйте ознакомиться с видюшками и статьями на сайте.

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 17 ноя 2010, 08:12

Итак, продолжаем. Есть сдвиги )) Ну маленькие конечно, но сдвиги есть точно ))
То что вверху написано, считаем прошедшим вариантом.

Итак. имеем вот такой скрипт, который ...

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

<?php
$xhe_host ="127.0.0.1:7011";
// The following code is required to properly run XWeb Human Emulator
require("../Templates/xweb_human_emulator.php");
$browser->navigate('http://www.odnoklassniki.ru/');
$browser->wait_for(200,1);
$input->set_value_by_name('field_email','логин');
$input->set_value_by_name('field_password','пасс');
$button->click_by_name('hook_FormButton_button_go');
$browser->wait_for(200,1);
$anchor->click_by_number(16);
$anchor->click_by_inner_text('Группы (4)',true);
$browser->wait_for(200,1);
$anchor->click_by_inner_text(32);
$anchor->click_by_inner_text('Родственнички',true);
$anchor->send_event_by_number(32,'onclick');
$browser->wait_for(200,1);
// Quit
$app->quit();
?>
... 1) умеет заходить под моим логином в Одноклассники. 2) Кликать по ссылке Группы 3) Выбирать в Группах Группу Родственнички

Ну вот когда я ему добавляю эту строчку, для того, чтобы он кликнул по ссылке Фотоальбом:

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

$anchor->click_by_number(49);
$anchor->click_by_inner_text('Создать фотоальбом',true);
$browser->wait_for(200,1);
То Почемуто, при запуске скрипта, который в общем виде имеет такой вот текст:

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

<?php

$xhe_host ="127.0.0.1:7011";

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

$browser->navigate('http://www.odnoklassniki.ru/');
$browser->wait_for(200,1);
$input->set_value_by_name('field_email','логин');
$input->set_value_by_name('field_password','пасс');
$button->click_by_name('hook_FormButton_button_go');
$browser->wait_for(200,1);

$anchor->click_by_number(16);
$anchor->click_by_inner_text('Группы (4)',true);
$browser->wait_for(200,1);

$anchor->click_by_inner_text(32);
$anchor->click_by_inner_text('Родственнички',true);
$anchor->send_event_by_number(32,'onclick');
$browser->wait_for(200,1);

$anchor->click_by_number(49);
$anchor->click_by_inner_text('Создать фотоальбом',true);
$browser->wait_for(200,1);




// Quit
$app->quit();
?>
Почему то вместо того чтобы нажать Создать фотоальбом - отправил комуто приглашение, о чём я узнал по открывшемуся Модальному окну, с сообщением, что приглашение отправлено.

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 18 ноя 2010, 00:10

со скриптом у тебя все очень плохо :)
после $anchor->click.. желательно ставить $browser->wait_for(200,1); ждать загрузки страницы.
тут

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

$anchor->click_by_inner_text(32);
$anchor->click_by_inner_text('Родственнички',true);
$anchor->send_event_by_number(32,'onclick');
вообще неясно, ты делаешь сразу 2 клика и потом еще посылаешь event на тот же анкор?
скорее всего это и есть проблема с 'Создать фотоальбом', ты либо кликаешь дважды на ссылку, либо после первого лкика не ждешь загрузки новой страницы

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 18 ноя 2010, 19:42

Согласен. Напутал ойёёй

Исправляюсь. Ниже выкладываю скрипт, который заходит под вашим логином на одноклассники, заходит в Группы, выбирает нужную группу, Создаёт там альбом и подходит к диалогу выбора файла для добавления.

Вот собственно и вопрос.
Как правильно реализовать выбор файла с жёсткого диска?

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

<?php

$xhe_host ="127.0.0.1:7011";

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

//Заходим в одноклассники
$browser->navigate('http://www.odnoklassniki.ru/');
$browser->wait(1);
$input->set_value_by_name('field_email','логин');
$input->set_value_by_name('field_password','пароль');
$button->click_by_name('hook_FormButton_button_go');
$browser->wait(1);
sleep(1);

//Кликаем по ссылке Группы
$anchor->click_by_inner_text('Группы (4)',true);
$browser->wait_for(60,1);
sleep(1);

//Кликаем по ссылке Родственнички
$anchor->click_by_inner_text('Родственнички',true);
$browser->wait_for(60,1);
sleep(1);

//Создаём альбом
$anchor->click_by_inner_text('Создать фотоальбом',true);$browser->wait_for(60,1);
sleep(1);

//Пишем название альбома
$textarea->click_by_atribute('name','st.layer.nameAlbum',true);
$textarea->set_value_by_name('st.layer.nameAlbum','Москва1');
$button->click_by_atribute('name','button_save',true);
sleep(1);

//Добавляем фото в альбом
$button->click_by_atribute('name','button_add_photo',true);
$inputfile->click_by_atribute('name','st.filename',true);























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

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 19 ноя 2010, 01:36

зри в $inputfile

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 20 ноя 2010, 02:44

Спасибо за подсказку.
Всё получилось. Хочется теперь усовершенствовать.
1. добавить цикл, с учётом того, что есть текстовый файл с 30 адресами.
2. За 30 фото, бывает так, что 1- раз, адрес фото не вводится. скрипт продолжает работу, но фотки не добавились. Можг=но как то это учитывать, если появляется сообщение об ошибках.

Вот сам код:

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

<?php

$xhe_host ="127.0.0.1:7011";

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

//идём в одноклассники
$browser->navigate('http://www.odnoklassniki.ru/');
$browser->wait(1);
sleep(1);

//Кликаем по ссылке Группы
$anchor->click_by_inner_text('Группы (4)',true);
$browser->wait_for(60,1);
sleep(1);

//Кликаем по ссылке Родственнички
$anchor->click_by_inner_text('Родственнички',true);
$browser->wait_for(60,1);
sleep(1);

//заходим в альбом
$anchor->click_by_inner_text('Альбом',true);
$browser->wait_for(60,1);
sleep(1);


//Добавляем фото в альбом
$button->click_by_atribute('name','button_add_photo',true);
sleep(1);

//выбираем файл
$inputfile->set_value_by_number('0','D:\foto_odnakl\1.jpg');
sleep(2);

//жмём загрузить
$button->click_by_atribute('name','button_upload',true);
sleep(5);


//жмём сохранить
$button->click_by_atribute('name','button_save',true);
sleep(5);


... упустил повторяющиеся моменты ...

//Добавляем фото в альбом
$button->click_by_atribute('name','button_add_photo',true);
sleep(1);

//выбираем файл
$inputfile->set_value_by_number('0','D:\foto_odnakl\30.jpg');
sleep(2);

//жмём загрузить
$button->click_by_atribute('name','button_upload',true);
sleep(5);


//жмём сохранить
$button->click_by_atribute('name','button_save',true);
sleep(5);


?>

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 20 ноя 2010, 13:00

1.

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

$urls = file('urls.txt');
foreach ($urls as $url) {
// нужные действия
}
2. нужно парсить сурс страницы и искать нужные сообщения, парсить сурс с

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

$html = $webpage->get_body();
к примеру, искать с

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

strpos($html, 'фраза для поиска');

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 28 ноя 2010, 18:57

спасибо за поддержание темы )
есть вопрос.
вот запускаю я этот скрипт (указан выше)
всё работает,но вот проблема - из 30 фоток - загружает 25-27
есть ошибка - такого плана: не вставляет адрес фотографии и жмёт загрузить.

В чём ошибка заключается?
Т.е. имею ввиду, что здесь лучше использовать?:

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

//выбираем файл
$inputfile->set_value_by_number('0','D:\foto_odnakl\30.jpg');
sleep(2);
sleep(2); - пробывал ставить и 5 не помогает
или
$browser->wait(1);

подскажите?
хочется сперва сделать так, чтобы он закидывал столько сколько ему сказано, а потом идти дальше. А когда результат не стабильный - не нравится.

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 29 ноя 2010, 00:02

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

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 29 ноя 2010, 01:25

Я скрипт подсократил немного.
Щас цикл есть и переменные ввёл.

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

<?php

$xhe_host ="127.0.0.1:7011";

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

//Задаю переменные
$album="...";
$group="...";
$site="http://www.odnoklassniki.ru/";
$foto = file("foto.txt"); 
$sl1="1";
$sl2="3";


//отключаем картинки для скорости загрузки
$browser->enable_images($enable);

//идём в одноклассники
$browser->navigate($site);
$browser->wait(2);
sleep($sl1);


//Кликаем по ссылке Группы
$anchor->click_by_inner_text('Группы (4)',true);
$browser->wait(2);
sleep($sl1);

//Кликаем по ссылке Родственнички
$anchor->click_by_inner_text($group,true);
$browser->wait(3);
sleep($sl1);

//входим в альбомы
$anchor->click_by_inner_text('Альбомы (9)',true);
$browser->wait(3);
sleep($sl1);

//заходим в альбом
$anchor->click_by_inner_text($album,true);
$browser->wait(2);
sleep($sl1);

for ($i=0;$i<30;$i++) 
{ 
//Жмём добавить фото
$button->click_by_atribute('name','button_add_photo',true);
$browser->wait(2);
sleep($sl2);

//выбираем файл
$inputfile->set_value_by_number('0',$foto[$i],true);
$browser->wait(2);
sleep($sl2);

//жмём загрузить
$button->click_by_atribute('name','button_upload',true);
$browser->wait(2);
sleep($sl2);


//жмём сохранить
$button->click_by_atribute('name','button_save',true);
$browser->wait(2);
sleep($sl2);
}

// Quit
$app->quit();
?>
НА самом деле, первое на что обратил внимание, то что не всегда вводится адрес файла (название файла непричём).
Встал вопрос, как проверять ВВЕДЁН адрес или НЕТ и только после этого продолжать.

Т.е. нужно добавить сюда if и др. но с чего начать не знаю ((

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

//выбираем файл
$inputfile->set_value_by_number('0',$foto[$i],true);
$browser->wait(2);
sleep($sl2);
Хочу научить проверить его, введено ли адрес фотографии и только если да - то жать загрузить, а если нет, то ввести адрес повторно )

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 29 ноя 2010, 02:55

morfius писал(а):Встал вопрос, как проверять ВВЕДЁН адрес или НЕТ и только после этого продолжать
$inputfile->get_value_by_number($number); например?

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 29 ноя 2010, 09:11

ДА!
получается, что эта ))
Только вот какое дело:

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

//выбираем файл
$inputfile->set_value_by_number('0',$foto[$i],true);
$browser->wait(2);
sleep($sl2);
$inputfile->get_value_by_number(0);
if($inputfile->get_value_by_number(0)=="false")
... как сказать что нужно запихнуть опять текст
т.е. как ему сказать. что если false то

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

$inputfile->set_value_by_number('0',$foto[$i],true);
но не просто заново или следующую, а именно ту, которая не вставилась.
Ведь у нас берётся из файла адреса строки:

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

$foto[$i]

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

Re: Скрипт по добавлению фотографий

Сообщение satih » 29 ноя 2010, 13:24

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

for($i=0; $i<count($foto); $i++){
  do {
    $inputfile->set_value_by_number(0, $foto[$i], true);
    $browser->wait(2);
    sleep($sl2);
    $answer = $inputfile->get_value_by_number(0);
  } while (empty($answer) || $answer === false);
}
возможная ошибка которую вижу у тебя это "false" вместо false, т.е. ты проверяешь если клас возвращает string а не boolean, можно проверить что именно возвращает клас через var_dump($inputfile->get_value_by_number(0)).
кроме того, в $inputfile->set_value_by_number('0',$foto[$i],true); 0 написан снова как string, нужен integer, т.е. $inputfile->set_value_by_number(0,$foto[$i],true); без кавычек.
что еще может быть (не юзал просто эту функцию..) что если поле пустое, вернет пустой ответ.

как мини заметка, цикл for($i=0; $i<count($foto);$i++) правильней сделать через foreach

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

foreach($foto as $single_foto){
  do {
    $inputfile->set_value_by_number(0, $single_foto, true);
    $browser->wait(2);
    sleep($sl2);
    $answer = $inputfile->get_value_by_number(0);
  } while (empty($answer) || $answer === false);
}
morfius писал(а):но не просто заново или следующую, а именно ту, которая не вставилась.
Ведь у нас берётся из файла адреса строки:

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

$foto[$i]
пока ты $i не увеличил на 1, $foto[$i] останется тем же, или ты застрял на том как сделать внутрений цикл внутри цикла for?

morfius
Сообщения: 18
Зарегистрирован: 16 ноя 2010, 16:19

Re: Скрипт по добавлению фотографий

Сообщение morfius » 29 ноя 2010, 16:39

пока ты $i не увеличил на 1, $foto[$i] останется тем же, или ты застрял на том как сделать внутрений цикл внутри цикла for?
вот именно )) именно на внутреннем цикле.

Ответить