Делимся секретами создания сайтов

cUrl && ereg

в общем загржаю страницу через курлы, надо её распарсить и отправить некоторые данные обратно:
$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, которое вверху...?просто чёт я всё на сокетах писал, а тут решил попробовать на курлах.
извиняюсь, если непонятно, просто пока даже и сам не втыкаю в этот бред((

Ответы: 29 → “cUrl && ereg”

  1. Игорь Самохин Ответить

    .

  2. Лев Большун Ответить

    если ты поставил curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1), то curl_exec возвращает ответ в виде строки
    поэтому припиши $str = curl_exec($ch); и делай с $str что угодно

  3. Антон Пахомов Ответить

    хм, видно доки не докурил(большое спасибо, строчку, что мне была нужна я спарсил, а вот отправить её?желательно в этом же цикле, в массиве $date
    там дальше тогда вот так у меня:
    preg_match("(id=[[:alnum:]]+\")si",$str,$regs);
    list ($sub)=$regs;
    и как $sub отправить сразу же?

  4. Алексей Вишняков Ответить

    куда ты хочешь отправить?
    Постом? Пиши в $postdata
    Гетом? меняй $url

  5. Алексей Вишняков Ответить

    Вообще у тебя бред какой-то написан:

    for ($ii=0; $ii<=count($data); $ii++) {
    $name = $data[$ii];
    $value = $data[$ii+1];
    $ii++;
    $temp[] = urlencode($name)."=".urlencode($value);
    }

    Что делает этот быдлокод?

    PS Вопрос риторический

  6. Антон Пахомов Ответить

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

  7. Алексей Вишняков Ответить

    Про быдлокод: использование инкремента внутри фора – очень нехороший стиль. Хуже чем гоуту) Это вроде еще в 8-ом классе объясняли.

    > вот тока как отправить ответ вместе с данными
    точно так же как и другие данные. ($poatdata .= '&captcha='.$captcha;)

    Я обычно с помощью Tamper Data копирую POST запрос и вставляю в него нужные мне переменные

  8. Антон Пахомов Ответить

    у меня даже слов нет(
    вот это
    $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

  9. Алексей Вишняков Ответить

    Капча меняется при обращении к картинке.
    делаешь сначала гет запрос к картинке потом пост запрос отправляешь с данными капчи

  10. Александр Сердюк Ответить

    надо понимать, что проблема в том, что одним запросом он берет капчу, получает что надо слать, а когда отсылает – там уже другая капча)

  11. Алексей Вишняков Ответить

    no11
    такого не может быть

  12. Антон Пахомов Ответить

    #11 ну хоть кто-то понял, о чем я спрашиваю)
    #12 то есть, если я запрошу капчу img.php?id=fkfufk5hf6 и потом отправлю её со следующим запросом, то она не сменится?приду домой-ппробую набросать код, мож получится)

  13. Александр Сердюк Ответить

    #12
    ну как не может?
    Схема такая: мы открываем страницу(устанавливается сессия на наш заход), смотрим рисунок и помимо нужных полей вводим и капчу, отсылаем и капча сверяется с последней сгенеренной для нашей сессии, так?
    А тут происходит след. образом:
    чувак заходит на страницу, хавает капчу и парсит данные, отправляет их, но сессия уже другая для второго запроса (запроса для той же страницы, но уже со вставкой данных).

  14. Александр Сердюк Ответить

    А решение простое: надо узнать куда отсылается форма с пост данными и второй запрос делать на нее))
    т.е. первым разом парсим форму и капчу (а также action формы), а вторым на этот action шлем всю инфу скопом(в т.ч. и капчу)

  15. Алексей Вишняков Ответить

    Ладно, с "не может" я погорячился.
    просто не делают так обычно.

    no13 в общем да.
    только не капчу надо отправлять, код который на ней )

  16. Антон Пахомов Ответить

    аааа
    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);

  17. Антон Пахомов Ответить

    тьфу, забыл $str=$postdata

  18. Алексей Вишняков Ответить

    Между еще не забудь получить саму капчу.
    А то как ты будешь ее вычислять?

  19. Антон Пахомов Ответить

    …..
    $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 разве всё будет работать?

  20. Александр Сердюк Ответить

    антикапчу – в студию :) )
    no17,
    да.
    Как правило если идет action на ту же страницу, то проверяется существование одной или нескольких переменных формы в $_POST. т.е. как только ты просто загружаешь страницу, массив пост у тебя пустой, и поэтому тебе выводицца форма. А когда ты жмакаешь кнопку отправить, то пост уже не пустой и идет его обработка :) и там уже капча не выводитца, а проверяется…
    одним сеансом.. а почему нет-то?

  21. Александр Сердюк Ответить

    кстати в 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 (а так как ты ее не закрыл, то переустанавливать не надо)

  22. Антон Пахомов Ответить

    :P да какая это антикапча)просто сравниваю картинку со шрифтом и всё)
    тогда вот так правильный код:
    $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);
    то есть это будет одной сессией, и капча вобьётся и данные улетят нормально?
    так, значит ща чайку попью и допишу всё)

  23. Антон Пахомов Ответить

    а вот цифирок я не получил(((то есть сама стрница post.php есть а вот цифирок хеша нету((и пишет моя супер антикапча:failed to open stream((
    хотя ща кое-чт сменить попробую и посмотрю)

  24. Антон Пахомов Ответить

    не получается получить полный адрес картинки((видно что-то опять пропустил((буду копаться ещё(

  25. Антон Пахомов Ответить

    единственное, что я пока что понял, так это то, что мой скрипт круче любого хацкера))сайт который я парсил выдал при дебаге парсилки море ошибок XD
    тока вот всё равно картинка не открылась(
    а точно не имеет значения адрес картинки?у меня выглядит вот так Warning: imagecreatefrompng("post.php?id=d5a72f2e691be789f91b587f6beb4f5f") [function.imagecreatefrompng]: failed to open stream: No such file or directory in /home*******.php on line 4
    не так это всё просто оказывается((

  26. Алексей Вишняков Ответить

    А у вас есть такой файл post.php?id=d5a72f2e691be789f91b587f6beb4f5f
    в папке /home**** ???

  27. Антон Пахомов Ответить

    ээ нет…это мой сервак, наверное надо указать полный путь до чужого хоста, типа site.ru/post.php?id=d5a72f2e691be789f91b587f6beb4f5f
    но дело в том, что на страничке, которую парсю без хоста стоит.
    окей, ща домой приду- исправлю, может дело в этом

  28. Алексей Вишняков Ответить

    > на страничке, которую парсю без хоста стоит.
    возможно имеется ввиду без ХВОСТА?

    > типа site.ru/post.php
    не забудь про http://

    PHP не экстросенс, сам не догадается куда нужно отправлять запрос

  29. Антон Пахомов Ответить

    ну может без хвоста))спасибо)

Ответить