в общем загржаю страницу через курлы, надо её распарсить и отправить некоторые данные обратно:
$data[] = "redirect";
$data[] = false;
for ($ii=0; $ii<=count($data); $ii++) {
$name = $data[$ii];
$value = $data[$ii+1];
$ii++;
$temp[] = urlencode($name)."=".urlencode($value);
}
$postdata=implode("&", $temp);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_exec($ch);
curl_close($ch);
как тут можно вставить выражение поиска регулярки, чтобы сграбленное выражение было отправленно обратно?то есть в массиве $data, которое вверху...?просто чёт я всё на сокетах писал, а тут решил попробовать на курлах.
извиняюсь, если непонятно, просто пока даже и сам не втыкаю в этот бред((
.
если ты поставил curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1), то curl_exec возвращает ответ в виде строки
поэтому припиши $str = curl_exec($ch); и делай с $str что угодно
хм, видно доки не докурил(большое спасибо, строчку, что мне была нужна я спарсил, а вот отправить её?желательно в этом же цикле, в массиве $date
там дальше тогда вот так у меня:
preg_match("(id=[[:alnum:]]+\")si",$str,$regs);
list ($sub)=$regs;
и как $sub отправить сразу же?
куда ты хочешь отправить?
Постом? Пиши в $postdata
Гетом? меняй $url
Вообще у тебя бред какой-то написан:
for ($ii=0; $ii<=count($data); $ii++) {
$name = $data[$ii];
$value = $data[$ii+1];
$ii++;
$temp[] = urlencode($name)."=".urlencode($value);
}
Что делает этот быдлокод?
PS Вопрос риторический
ну конечно, куда мне до великих профи, я ж даже пост от гет не отличаю, позор мне))
а по существу: на странице куда отправляю-капча, я уже и пробил ее, и парсер сделал, чтобы хтмл парсить на адрес ее, вот тока как отправить ответ вместе с данными?то есть во время одного отправления отправить и данные и ответ капчи?никак вот не втыкну((
зы быдлокод отвечает за часть кода, которой тут нету.
Про быдлокод: использование инкремента внутри фора – очень нехороший стиль. Хуже чем гоуту) Это вроде еще в 8-ом классе объясняли.
> вот тока как отправить ответ вместе с данными
точно так же как и другие данные. ($poatdata .= '&captcha='.$captcha;)
Я обычно с помощью Tamper Data копирую POST запрос и вставляю в него нужные мне переменные
у меня даже слов нет(
вот это
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_exec($ch);
curl_close($ch);
значит, что данные уже ушли, то есть следующая инициализация курлов вызовет перезагрузку страницы…капча сменится(
ааа..
а можно перед curl_close()
и поставить парсинг странички и и сразу же отправку данных?но тогда придётся ещё раз вызывать
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); …но curl_exec()уже выполнен…или тоже 2 раз вызвать?
зы у меня не было в 8 классе прогрммирования(и плагин лучше leave http headers
Капча меняется при обращении к картинке.
делаешь сначала гет запрос к картинке потом пост запрос отправляешь с данными капчи
надо понимать, что проблема в том, что одним запросом он берет капчу, получает что надо слать, а когда отсылает – там уже другая капча)
no11
такого не может быть
#11 ну хоть кто-то понял, о чем я спрашиваю)
#12 то есть, если я запрошу капчу img.php?id=fkfufk5hf6 и потом отправлю её со следующим запросом, то она не сменится?приду домой-ппробую набросать код, мож получится)
#12
ну как не может?
Схема такая: мы открываем страницу(устанавливается сессия на наш заход), смотрим рисунок и помимо нужных полей вводим и капчу, отсылаем и капча сверяется с последней сгенеренной для нашей сессии, так?
А тут происходит след. образом:
чувак заходит на страницу, хавает капчу и парсит данные, отправляет их, но сессия уже другая для второго запроса (запроса для той же страницы, но уже со вставкой данных).
А решение простое: надо узнать куда отсылается форма с пост данными и второй запрос делать на нее))
т.е. первым разом парсим форму и капчу (а также action формы), а вторым на этот action шлем всю инфу скопом(в т.ч. и капчу)
Ладно, с "не может" я погорячился.
просто не делают так обычно.
no13 в общем да.
только не капчу надо отправлять, код который на ней )
аааа
no15 то есть сначала гружу например index.php с формой и капчей, потом отправляю данные уже на post.php куда они и отправляются с index.php
примерно так?2 вопроса:
а если данные отправляются на index.php?
и эти два действия можно делать в одном сеансе curl?
то есть
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
$str=curl_exec($ch);
$postdata=//тут вычислятеся капча
дальше просто отправить все данные:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_exec($ch);
curl_close($ch);
тьфу, забыл $str=$postdata
Между еще не забудь получить саму капчу.
А то как ты будешь ее вычислять?
…..
$str=curl_exec($ch);
preg_match("(id=[[:alnum:]]+\")si",$str,$regs);
list ($sub)=$regs;
$captcha=anticapchta($sub);//тут моя функция считает))капчю пробивает-проверил уже разов 20)всегда 100%)то есть послучаю адрес типа img.php?id=jdshvfw84ybse47rfg и юзаю его как адрес то есть $captcha=anticapchta("img.php?id=jdshvfw84ybse47rfg"); и я так думаю, что всё посчитается)
а в no17 разве всё будет работать?
антикапчу – в студию
)
и там уже капча не выводитца, а проверяется…
no17,
да.
Как правило если идет action на ту же страницу, то проверяется существование одной или нескольких переменных формы в $_POST. т.е. как только ты просто загружаешь страницу, массив пост у тебя пустой, и поэтому тебе выводицца форма. А когда ты жмакаешь кнопку отправить, то пост уже не пустой и идет его обработка
одним сеансом.. а почему нет-то?
кстати в 17 тебе все поля переопределять не обязательно, те же кукисы повторно устанавливать и т.д.
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
curl_setopt($ch, CURLOPT_POST, 1);
это все устанавливать 1 раз, на сессию $ch (а так как ты ее не закрыл, то переустанавливать не надо)
тогда вот так правильный код:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_REFERER, "");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $maxtime);
$str=curl_exec($ch);
preg_match("(id=[[:alnum:]]+\")si",$str,$regs);
list ($sub)=$regs;
$captcha=anticapchta($sub);
curl_setopt($ch, CURLOPT_POSTFIELDS, $captcha);
curl_exec($ch);
curl_close($ch);
то есть это будет одной сессией, и капча вобьётся и данные улетят нормально?
так, значит ща чайку попью и допишу всё)
а вот цифирок я не получил(((то есть сама стрница post.php есть а вот цифирок хеша нету((и пишет моя супер антикапча:failed to open stream((
хотя ща кое-чт сменить попробую и посмотрю)
не получается получить полный адрес картинки((видно что-то опять пропустил((буду копаться ещё(
единственное, что я пока что понял, так это то, что мой скрипт круче любого хацкера))сайт который я парсил выдал при дебаге парсилки море ошибок XD
тока вот всё равно картинка не открылась(
а точно не имеет значения адрес картинки?у меня выглядит вот так Warning: imagecreatefrompng("post.php?id=d5a72f2e691be789f91b587f6beb4f5f") [function.imagecreatefrompng]: failed to open stream: No such file or directory in /home*******.php on line 4
не так это всё просто оказывается((
А у вас есть такой файл post.php?id=d5a72f2e691be789f91b587f6beb4f5f
в папке /home**** ???
ээ нет…это мой сервак, наверное надо указать полный путь до чужого хоста, типа site.ru/post.php?id=d5a72f2e691be789f91b587f6beb4f5f
но дело в том, что на страничке, которую парсю без хоста стоит.
окей, ща домой приду- исправлю, может дело в этом
> на страничке, которую парсю без хоста стоит.
возможно имеется ввиду без ХВОСТА?
> типа site.ru/post.php
не забудь про http://
PHP не экстросенс, сам не догадается куда нужно отправлять запрос
ну может без хвоста))спасибо)