Заполнение форм с помощью PHP и cURL

Владимир | | PHP.

php curl

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

В принципе, любой инструмент, предназначенный для автоматизации ваших действий, можно использовать для рассылки спама (в той или иной форме). К cURL это относится вдвойне, т.к. эта утилита позволяет имитировать работу браузера. Но на мой взгляд не правильно скрывать полезную информацию только потому, что кто-то может её использовать для рассылки спама.

Тем не менее, примеров работы с конкретными сайтами здесь не будет, только описание принципа работы и нужных функций.

Итак, у нас есть инструмент (cURL), который делает большую часть работы за нас. И для работы с ним существует ряд библиотек в том числе и для PHP.

Рассмотрим самый простой пример – получение страницы.

$login_url = 'http://my_site.com/';
$agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';

$ch = curl_init(); //инициализация библиотеки
//указываем адрес страницы
curl_setopt($ch, CURLOPT_URL,$login_url);
//указываем заголовок User-Agent
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
//указываем, что полученная страница должна быть сохранена в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//указываем, что cURL должен переходить по редиректам
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

//выполняем запрос
$page = curl_exec($ch);

Как видите, нужно инициализировать библиотеку, указать параметры подключения и отправить запрос. В результате страница будет сохранена в переменной page.

Теперь посмотрим, что нужно сделать для аутентификации на сайте и последующей работы с ним.

1) Отправить запрос с логином и паролем.

Предварительно нужно узнать названия полей в форме авторизации. На мой взгляд, лучше всего для этих целей подходит Firebug (плагин к FireFox). Т.е. вам нужно вручную зайти на сайт и посмотреть какие запросы отправляются и с какими параметрами.

Например, если форма аутентификации отправляет запрос на страницу
http://my_site.com/checklogin
а введенные данные передаются в полях login и pass методом post, то нужно указать следующие параметры.

$referer = 'http://my_site.com/';
$postLoginFields = array();
$postLoginFields['login'] = 'your login';
$postLoginFields['pass'] = 'your password';

//referer - адрес страницы с которой вы пришли,
//т.е. нужно указать адрес страницы на которой находится форма
curl_setopt($ch, CURLOPT_REFERER, $reffer);
//указываем, что мы отправляем данные методом post
curl_setopt($ch, CURLOPT_POST, 1);
//добавляем строку с post данными
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postLoginFields));

Обратите внимание, мы использовали параметр CURLOPT_REFERER, т.к. браузер передает адрес страницы с которой он пришел. В данном случае предполагается, что вы зашли на страницу с формой входа, заполнили ее (форму) и нажали кнопку «Войти», т.е. отправили запрос.

Кроме того, мы использовали функцию http_build_query для того, чтобы сформировать строку с post данными из массива. Это намного удобнее, чем составлять ее вручную.

2) Сохранить cookie.

Т.к. протокол HTTP не предусматривает сохранение состояния посетителя, то для этих целей обычно используют cookie. В нашем случае это означает, что в момент аутентификации сервер отправит нам cookie, а наша задача – её сохранить и использовать при выполнении следующих запросов. Делается это так.

//создаем файл для cookies
$cookiefile = tempnam('path/to/cookie/folder', 'cookie_');

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

Функция tempnam создаёт файл с уникальным именем. В первом параметре указываем размещение файла, во втором – префикс (не обязательно).

3) Заполнение форм на сайте.

Тут все просто. Порядок действий ничем не отличается от первого шага. Заполняете форму вручную, смотрите что и куда отправляется и рассказываете об этом cURL'у. Единственный нюанс – у вас уже должен быть сохраненный cookie.

Думаю, вы уже поняли, что используя cURL вы можете написать скрипт, который будет перемещаться по сайту и имитировать действия обычных пользователей. Но я хочу напомнить, что, во-первых, спамить плохо, во-вторых, такие действия обычно очень не нравятся администрации ресурсов. Поэтому не удивляйтесь если вас забанят по IP 😉 . И в-третьих, точно такие же скрипты можно использовать и в «мирных» целях, например, для создания автоматизированных тестов, проверки доступности сайтов, времени отклика и т.п.

Интересно почитать

На нашем сайте вы всегда найдете стихи о любви
Детская мебель б.у – хорошая возможность сэкономить.

Итак, как предпринимателю вести бухучет ИП? Несколько простых правил.

  • Хорошая статья.
    Можно делать продолжение, рассказать можно например о таком:
    +как считать и отправить сохраненную куку сайта
    +какие особенности ajax форм
    +как получить капчу, чтобы ввести ее вручную
    +как парсить полученные результаты и то с этим делать
    +как реализовать пакетное выполнение операций через curl, если на хостинге время выполнения скрипта ограничено в 30 сек
    +как работать через прокси
    (или по крайней мере накидать ссылок на другие статьи про curl)
    и т. д. 🙂

    • Big_Shark

      Очень хорошая идея!
      Я за!
      Кстати есть какие либо классы по работе с curl дабы не запоминать все эти замутные названия типа CURLOPT_POSTFIELDS и т.д. ?

    • Спасибо, я учту 🙂
      Кстати, о двух последних пунктах я раньше рассказывал.

  • Хорошая статья.
    Можно делать продолжение, рассказать можно например о таком:
    +как считать и отправить сохраненную куку сайта
    +какие особенности ajax форм
    +как получить капчу, чтобы ввести ее вручную
    +как парсить полученные результаты и то с этим делать
    +как реализовать пакетное выполнение операций через curl, если на хостинге время выполнения скрипта ограничено в 30 сек
    +как работать через прокси
    (или по крайней мере накидать ссылок на другие статьи про curl)
    и т. д. 🙂

    • Big_Shark

      Очень хорошая идея!
      Я за!
      Кстати есть какие либо классы по работе с curl дабы не запоминать все эти замутные названия типа CURLOPT_POSTFIELDS и т.д. ?

    • Спасибо, я учту 🙂
      Кстати, о двух последних пунктах я раньше рассказывал.

  • А чем эта статья отличается от phpclub.

    Нашёл только одно — указали работу с кукисами

    • Big_Shark

      на phpclub статья написана на гиковском языке.
      Если вам не нужны статьи написанные на понятном языке то идем прямо на php.net и там читаем все что нужно.

      • Big_Shark, не хотел вас обидеть, просто не увидел ничего принципиально нового. Сам читаю статьи у буржуев в первую очередь.

        Зачем при работе м кукисами, предварительно создавать файл под них, ведь cURL сам его создает?

        • Я согласен, принципиально нового здесь ничего нет. Но если подходить с такой позиции, то вообще нельзя писать о популярных библиотеках, т.к. у них, как правило, подробная документация и уже опубликовано множество статей и, может быть, книг.

          Например, я где-то слышал, что о Java опубликовано более 1000 книг. Думаю, тоже самое можно сказать и о PHP. Причем большинство из них для начинающих, а значит практически полностью повторяют друг друга. Тем не менее, читаются они по-разному 😉

          Я не хочу сказать, что моя статья лучше, чем на phpClub, потому что в ней больше пояснений. Лучше-хуже понятия относительные. Все зависит от предыдущей подготовки читателя. Кто-то глянет мельком на пример кода и сразу сможет изменить его под свои задачи, а кому-то нужно почитать об описании каждого параметра.

        • ведь cURL сам его создает?

          Вообще-то для меня так удобнее. Я всегда знаю где находятся cookies и то, что у них уникальные имена (на случай если несколько скриптов будут одновременно работать).

  • А чем эта статья отличается от phpclub.

    Нашёл только одно — указали работу с кукисами

    • Big_Shark

      на phpclub статья написана на гиковском языке.
      Если вам не нужны статьи написанные на понятном языке то идем прямо на php.net и там читаем все что нужно.

      • Big_Shark, не хотел вас обидеть, просто не увидел ничего принципиально нового. Сам читаю статьи у буржуев в первую очередь.

        Зачем при работе м кукисами, предварительно создавать файл под них, ведь cURL сам его создает?

        • Я согласен, принципиально нового здесь ничего нет. Но если подходить с такой позиции, то вообще нельзя писать о популярных библиотеках, т.к. у них, как правило, подробная документация и уже опубликовано множество статей и, может быть, книг.

          Например, я где-то слышал, что о Java опубликовано более 1000 книг. Думаю, тоже самое можно сказать и о PHP. Причем большинство из них для начинающих, а значит практически полностью повторяют друг друга. Тем не менее, читаются они по-разному 😉

          Я не хочу сказать, что моя статья лучше, чем на phpClub, потому что в ней больше пояснений. Лучше-хуже понятия относительные. Все зависит от предыдущей подготовки читателя. Кто-то глянет мельком на пример кода и сразу сможет изменить его под свои задачи, а кому-то нужно почитать об описании каждого параметра.

        • ведь cURL сам его создает?

          Вообще-то для меня так удобнее. Я всегда знаю где находятся cookies и то, что у них уникальные имена (на случай если несколько скриптов будут одновременно работать).

  • ghost

    Даешь продолжение

  • ghost

    Даешь продолжение

  • >Я всегда знаю где находятся cookies и то, что у них уникальные имена

    Полностью с вами согласен.

  • >Я всегда знаю где находятся cookies и то, что у них уникальные имена

    Полностью с вами согласен.

  • Ну в мирных целях использовать тако не очень хочется пока, а идейка сама по себе интересная.

    • Согласен, в мирных целях им приходится пользоваться не часто. Обычно удобнее использовать какой-нибудь готовый сервис.

  • Ну в мирных целях использовать тако не очень хочется пока, а идейка сама по себе интересная.

    • Согласен, в мирных целях им приходится пользоваться не часто. Обычно удобнее использовать какой-нибудь готовый сервис.

  • Статейка интересная. на phpClub не видел, а тут как раз на мой уровень (к сожалению пока не слишком высокий) знаний PHP

  • Статейка интересная. на phpClub не видел, а тут как раз на мой уровень (к сожалению пока не слишком высокий) знаний PHP

  • Хочется продолжения, или даже серии постов о такой замечательной связке (PHP и cURL).

  • Хочется продолжения, или даже серии постов о такой замечательной связке (PHP и cURL).

  • Хорошая статья получилась. Очень много полезной информации. cURL рулит!

  • Хорошая статья получилась. Очень много полезной информации. cURL рулит!

  • cURL — интересная тема. Нужно развивать 🙂

  • cURL — интересная тема. Нужно развивать 🙂

  • Andrey

    Здравствуйте! А как можно послать следующий запрос на другую страницу этого же сайта, используя сохранённые куки?

  • Просто отправьте запрос из этого же скрипта.
    Ставите новый адрес страницы
    curl_setopt($ch, CURLOPT_URL, $protected);
    и отправляете запрос
    $page = curl_exec($ch);

  • Andrey

    Спасибо.

  • Andrey

    Но почему-то не переходит по новому адресу.

  • Установите режим отладки

    curl_setopt($ch, CURLOPT_VERBOSE, TRUE)

    и посмотрите какие ошибки возникнут.
    Дело в том, что для авторизации сохранение cookie может быть недостаточно. Пример.

    • Alexsheva

      Благодаря этой теме разобрался с Curl и даже написал маленький парсер. Спасибо! Ждем продолжения!

  • Ildus Ildarovich

    Я новичек в этом деле, я так понял, что данный php код поможет заполнить поле, а как сделать чтоб после заполнение поля она нажал на кнопку
    Логин

    • Нет, этот код именно отправляет заполненную форму. Т.е. вводит данные в поля и нажимает кнопку.

      Посмотрите второй листинг.
      Строки 3 и 4 — заполнение полей. Отправка данных выполняется с помощью curl_exec

      • Ildus Ildarovich

        Не могу понять в чем дело…..(
        Пробую залогиниться данным методом? не получается(
        сайт http://www.lixano.de/
        пишу
        $postLoginFields['tpLogin'] = '250753@mail.ru';

        $postLoginFields['tpPassword'] = 'poiuyt';
        ничего не получается,
        Ув. Владимир что я делаю не правильно?

        • Если вы работаете с cURL, то при отладке нужно ориентироваться не на html разметку формы, а на данные, которые выводит отладчик (например, firebug).

          В данном случае, имена POST параметров, которые отправляются серверу, отличаются от имен полей в форме. Прилагаю скриншот.

        • Ildus Ildarovich

          Спасибо Владимир, я это не учел…
          По делу у мня так и не пошло, не логиниться к сожалению, в конце добавил строчку  echo curl_exec ($ch);
          при запуске скрипта выдает обычную не залогиненную страницу(

          может это изза того что далее страницу идут https ?

  • Drdez

    Профессиональное уничтожение клопов с дезстанцией ДокторДЕЗ- htp://www.доктордез.рф/

  • DonCheck

    «Доступ запрещен. Истек период сессии.» — такое мне пишет при дальнейшем прохождении по сайту (выполнял 3 пункт). А как правильно воспользоваться сохраненным куки, чтоб этого не случалось?

    • Вы установили опции
      curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
      curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);на шаге 3?

      • DonCheck

        Спасибо разобрался, просто авторизация проходила в два шага, надо было на следующий линк переходить который присылал сервер и там опять куки вставлять. Увидел как правильно обработать редирект тут 
        http://forum.php.su/topic.php?forum=73&topic=2334  ( еще пришлось вставить 
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);  )

        P.S. Спасибо вам за статью! Очень доступно объяснено. Ничего лишнего. Исходя из нее можно много что сделать.  

  • DonCheck

    а как с помощью этого же метода еще и файл отправить?

  • ЖЕНДОС

    подскажите мне на сайте моем надо регнуть 1милион акаунтов путем заполнения 5ти строчек как мне автоматизировать заполнения етих 5ти строчек разными логинами только в верхней строчке остальные строчки там где пароль и т д одинаковые я вписываю надо мне на боте как то сдлеать ето

  • ЖЕНДОС

    а не не5 строчек а там всего 4 строчки мне надо 10тысяч раз регнутся разными логинами, пароль, подтверждение пароля и емеил одинаковый будет для етих 10тысяч логинов как на боте так регнуть?

    • Если сайт Ваш, то Вы можете внести новые аккаунты сразу в базу данных. В этом случае не нужно заполнять никаких форм, просто напишите скрипт, который в цикле вставляет записи в базу.

  • schartem

    Подскажите, пожалуйста, почему результат работы скрипта отличается от работы браузера? Вроде бы все сделано верно. Отправляемые запросы посмотрел с помощью хрома (F12). Спасибо

  • schartem

    Подскажите, пожалуйста, почему результат работы скрипта отличается от работы браузера? Вроде бы все сделано верно. Отправляемые запросы посмотрел с помощью хрома (F12). Спасибо.

    /* */

  • schartem

    Подскажите, пожалуйста, почему результат работы скрипта отличается от работы браузера? Вроде бы все сделано верно. Отправляемые запросы посмотрел с помощью хрома (F12). Спасибо.

    $url = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppSchedulingGetInfo.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg%3d%3d';

    $agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';

    $referer = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppScheduling.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg==';

    $postLoginFields = array();

    $postLoginFields['__LASTFOCUS:'] = «»;

    $postLoginFields['__EVENTTARGET'] = «»;

    $postLoginFields['__EVENTARGUMENT'] = «»;

    $postLoginFields['__VIEWSTATE'] = «oR/RTjZiv/ZPwgjEDneDwNkm1iu3LTxLiyUpPJo+guTBgPXwM+qla8+fd9x+24lMUrz2P2FThy7gS979bICs8YUVRK9x7ZviKuFG5JYC/AsiIlH3WFRH5Vqlo5lGGwW36MzwPPY9DakT9njFMKWlhmA0IFlRI8E+J+7g9ehKHVNbNZQKjmMun4WvQO6C+2Srpob0XsicjWd9jRjKTcesVHyn9RIOiyGV1Ud5wdF9bOC5V2efOrHOuvQOgZgNf6LH4u1hul3ZlWhgGIagOnSBL1OSru/dsF7DMHS8JNz0FZEYEGw9rOsykhJFmEmL7wFFtu9f630K4z5uXAjN9vuYjV2DyxRmBlyWmnGbRC93NZ3ERkvwSBPqUm2rWGhGOKoFIRVnuh+Od2romvzOoiQCJvfauK1NJP+7lSOo0C6i3epu4hjEUA8mBpGrkQ/105glvxrI8i+BxNO05KMhQRObQIIch9N3gzM2LUtCzfdXxL1LbQnVJDUsnT7WffWml0jy98dsj4hEbmCI9vVOeAOHq/+yT/tDZFyNemjt1G2CnGl+LLLJmFbOhFdbEWBDrtkjz3O52QnFSS0uhzIG1txYm9ElAdInFYFhWG6cq+JtxyvISXN7e3ZWQyl4xvrxKsZSD2ugAN9Hy8q2LEo2s4ej1/5DDvuV6gcpLAjExVZBvN7DQiTrLnAR6nZtolVTWMZXn0GkY3CwV4v422Nt8I6EvqcqsaOIV+utpRYndwi9wmD2YWZclR0ql8DwwXMYYi6sj2xRLEDUlz1xDlqPNWh77pK4pg42YzXSMm04lsCtjD6UOngL6wMJ3OIx2DREoJ7aq0hYVCoFkI3hMqEvHA3EB+5wjm0a0czNxQZLOnnMhzXyfyEwiZRWSxtf0aUkWBDdsFkTym8No9so0rVJtwxQAqfje2DHINqxPXBEMQ+DQkrMe0a29FXBnRYlJOdfi0HYTRPgLOlalL/EtQDZ/VIaC6HLN1VhH+LqkxPOsvr6mYflltvA0iPmnDxN/GVaNEKxeoaaTtJX0plYJbbzZtxfC/Oy7ytALC4Itq57ebtJ2NJl97NdyVoro/tAjP/cNPWieoy+oOrhHPdSmvNa2hcaeWrqu1KIgFDOF82aqOEn58Vpl6u4MHX3JAWcvSpgUwVLnH/rIEKUdkayhfzVYtastbiySX8rsUff1EhlnF7f7K39Zx/jRTnEaZCiOwEHkJd1»;

    $postLoginFields['ctl00$plhMain$cboVAC'] = «14»;

    $postLoginFields['ctl00$plhMain$btnSubmit'] = «ОТПРАВИТЬ»;

    $postLoginFields['____Ticket'] = «1»;

    $postLoginFields['__EVENTVALIDATION'] = «ocN9/AWVkqNfVBdx4wlSJJXUC5GZ5dfdK6dtrVj3hGKXzAD49uvhKRKBIhIeRRIuTvxvEAiUdWDlJUvGn0fGO3zwrRw7iVe7yHiBEc00shTSKMMavWRYfd/D9G65u9xT1IX1MJmpIlM=»;

    include 'post.php';

    //создаем файл для cookies

    $cookiefile = tempnam('path/to/cookie/folder', 'cookie_');

    $ch = curl_init(); //инициализация библиотеки

    //указываем адрес страницы

    curl_setopt($ch, CURLOPT_URL,$url);

    //указываем заголовок User-Agent

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);

    //указываем, что полученная страница должна быть сохранена в переменную

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //указываем, что cURL должен переходить по редиректам

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    //referer — адрес страницы с которой вы пришли,

    //т.е. нужно указать адрес страницы на которой находится форма

    curl_setopt($ch, CURLOPT_REFERER, $referer);

    //указываем, что мы отправляем данные методом post

    curl_setopt($ch, CURLOPT_POST, 1);

    //добавляем строку с post данными

    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);

    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    //выполняем запрос

    $page = curl_exec($ch);

    curl_close($ch);

    echo $page;

  • schartem

    Простите за мусор снизу, ошибаюсь.
    Подскажите, пожалуйста, почему результат работы скрипта отличается от работы браузера? Вроде бы все сделано верно. Отправляемые запросы посмотрел с помощью хрома (F12). Спасибо.

    $url = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppSchedulingGetInfo.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg%3d%3d';

    $agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';

    $referer = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppScheduling.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg==';

    $postLoginFields = array();

    $postLoginFields['__LASTFOCUS:'] = «»;

    $postLoginFields['__EVENTTARGET'] = «»;

    $postLoginFields['__EVENTARGUMENT'] = «»;

    $postLoginFields['__VIEWSTATE'] = «oR/RTjZiv/ZPwgjEDneDwNkm1iu3LTxLiyUpPJo+guTBgPXwM+qla8+fd9x+24lMUrz2P2FThy7gS979bICs8YUVRK9x7ZviKuFG5JYC/AsiIlH3WFRH5Vqlo5lGGwW36MzwPPY9DakT9njFMKWlhmA0IFlRI8E+J+7g9ehKHVNbNZQKjmMun4WvQO6C+2Srpob0XsicjWd9jRjKTcesVHyn9RIOiyGV1Ud5wdF9bOC5V2efOrHOuvQOgZgNf6LH4u1hul3ZlWhgGIagOnSBL1OSru/dsF7DMHS8JNz0FZEYEGw9rOsykhJFmEmL7wFFtu9f630K4z5uXAjN9vuYjV2DyxRmBlyWmnGbRC93NZ3ERkvwSBPqUm2rWGhGOKoFIRVnuh+Od2romvzOoiQCJvfauK1NJP+7lSOo0C6i3epu4hjEUA8mBpGrkQ/105glvxrI8i+BxNO05KMhQRObQIIch9N3gzM2LUtCzfdXxL1LbQnVJDUsnT7WffWml0jy98dsj4hEbmCI9vVOeAOHq/+yT/tDZFyNemjt1G2CnGl+LLLJmFbOhFdbEWBDrtkjz3O52QnFSS0uhzIG1txYm9ElAdInFYFhWG6cq+JtxyvISXN7e3ZWQyl4xvrxKsZSD2ugAN9Hy8q2LEo2s4ej1/5DDvuV6gcpLAjExVZBvN7DQiTrLnAR6nZtolVTWMZXn0GkY3CwV4v422Nt8I6EvqcqsaOIV+utpRYndwi9wmD2YWZclR0ql8DwwXMYYi6sj2xRLEDUlz1xDlqPNWh77pK4pg42YzXSMm04lsCtjD6UOngL6wMJ3OIx2DREoJ7aq0hYVCoFkI3hMqEvHA3EB+5wjm0a0czNxQZLOnnMhzXyfyEwiZRWSxtf0aUkWBDdsFkTym8No9so0rVJtwxQAqfje2DHINqxPXBEMQ+DQkrMe0a29FXBnRYlJOdfi0HYTRPgLOlalL/EtQDZ/VIaC6HLN1VhH+LqkxPOsvr6mYflltvA0iPmnDxN/GVaNEKxeoaaTtJX0plYJbbzZtxfC/Oy7ytALC4Itq57ebtJ2NJl97NdyVoro/tAjP/cNPWieoy+oOrhHPdSmvNa2hcaeWrqu1KIgFDOF82aqOEn58Vpl6u4MHX3JAWcvSpgUwVLnH/rIEKUdkayhfzVYtastbiySX8rsUff1EhlnF7f7K39Zx/jRTnEaZCiOwEHkJd1»;

    $postLoginFields['ctl00$plhMain$cboVAC'] = «14»;

    $postLoginFields['ctl00$plhMain$btnSubmit'] = «ОТПРАВИТЬ»;

    $postLoginFields['____Ticket'] = «1»;

    $postLoginFields['__EVENTVALIDATION'] = «ocN9/AWVkqNfVBdx4wlSJJXUC5GZ5dfdK6dtrVj3hGKXzAD49uvhKRKBIhIeRRIuTvxvEAiUdWDlJUvGn0fGO3zwrRw7iVe7yHiBEc00shTSKMMavWRYfd/D9G65u9xT1IX1MJmpIlM=»;

    include 'post.php';

    //создаем файл для cookies

    $cookiefile = tempnam('path/to/cookie/folder', 'cookie_');

    $ch = curl_init(); //инициализация библиотеки

    //указываем адрес страницы

    curl_setopt($ch, CURLOPT_URL,$url);

    //указываем заголовок User-Agent

    curl_setopt($ch, CURLOPT_USERAGENT, $agent);

    //указываем, что полученная страница должна быть сохранена в переменную

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    //указываем, что cURL должен переходить по редиректам

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    //referer — адрес страницы с которой вы пришли,

    //т.е. нужно указать адрес страницы на которой находится форма

    curl_setopt($ch, CURLOPT_REFERER, $referer);

    //указываем, что мы отправляем данные методом post

    curl_setopt($ch, CURLOPT_POST, 1);

    //добавляем строку с post данными

    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);

    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    //выполняем запрос

    $page = curl_exec($ch);

    curl_close($ch);

    echo $page;

    • А в чем отличие? Главной страницы у http://www.visaservices.co.in нет?
      По ссылкам в скрипте получаю страницы с ошибками.

      • schartem

        Простите, три раза не тот код кинул. Смысл в том, чтобы менять значение выпадающего списка, отправлять форму и сохранять в переменную полученную страницу, хотя Вы это, наверное, и так поняли.

        $url = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppSchedulingGetInfo.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg%3d%3d';

        $agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';

        $referer = 'https://www.visaservices.co.in/Finland-russia-online/AppScheduling/AppScheduling.aspx?P=PcqAqEGdf4OMbJ1CZgKHSUN3Je9Uumiy6NGhvmhMab7phBf7hKlWsBQNrNze6jyj+86S93yLA0yGdiqvwB5yZg==';

        $postLoginFields = array();

        $postLoginFields['__LASTFOCUS:'] = «»;

        $postLoginFields['__EVENTTARGET'] = «»;

        $postLoginFields['__EVENTARGUMENT'] = «»;

        $postLoginFields['__VIEWSTATE'] = «oR/RTjZiv/ZPwgjEDneDwNkm1iu3LTxLiyUpPJo+guTBgPXwM+qla8+fd9x+24lMUrz2P2FThy7gS979bICs8YUVRK9x7ZviKuFG5JYC/AsiIlH3WFRH5Vqlo5lGGwW36MzwPPY9DakT9njFMKWlhmA0IFlRI8E+J+7g9ehKHVNbNZQKjmMun4WvQO6C+2Srpob0XsicjWd9jRjKTcesVHyn9RIOiyGV1Ud5wdF9bOC5V2efOrHOuvQOgZgNf6LH4u1hul3ZlWhgGIagOnSBL1OSru/dsF7DMHS8JNz0FZEYEGw9rOsykhJFmEmL7wFFtu9f630K4z5uXAjN9vuYjV2DyxRmBlyWmnGbRC93NZ3ERkvwSBPqUm2rWGhGOKoFIRVnuh+Od2romvzOoiQCJvfauK1NJP+7lSOo0C6i3epu4hjEUA8mBpGrkQ/105glvxrI8i+BxNO05KMhQRObQIIch9N3gzM2LUtCzfdXxL1LbQnVJDUsnT7WffWml0jy98dsj4hEbmCI9vVOeAOHq/+yT/tDZFyNemjt1G2CnGl+LLLJmFbOhFdbEWBDrtkjz3O52QnFSS0uhzIG1txYm9ElAdInFYFhWG6cq+JtxyvISXN7e3ZWQyl4xvrxKsZSD2ugAN9Hy8q2LEo2s4ej1/5DDvuV6gcpLAjExVZBvN7DQiTrLnAR6nZtolVTWMZXn0GkY3CwV4v422Nt8I6EvqcqsaOIV+utpRYndwi9wmD2YWZclR0ql8DwwXMYYi6sj2xRLEDUlz1xDlqPNWh77pK4pg42YzXSMm04lsCtjD6UOngL6wMJ3OIx2DREoJ7aq0hYVCoFkI3hMqEvHA3EB+5wjm0a0czNxQZLOnnMhzXyfyEwiZRWSxtf0aUkWBDdsFkTym8No9so0rVJtwxQAqfje2DHINqxPXBEMQ+DQkrMe0a29FXBnRYlJOdfi0HYTRPgLOlalL/EtQDZ/VIaC6HLN1VhH+LqkxPOsvr6mYflltvA0iPmnDxN/GVaNEKxeoaaTtJX0plYJbbzZtxfC/Oy7ytALC4Itq57ebtJ2NJl97NdyVoro/tAjP/cNPWieoy+oOrhHPdSmvNa2hcaeWrqu1KIgFDOF82aqOEn58Vpl6u4MHX3JAWcvSpgUwVLnH/rIEKUdkayhfzVYtastbiySX8rsUff1EhlnF7f7K39Zx/jRTnEaZCiOwEHkJd1»;

        $postLoginFields['ctl00$plhMain$cboVAC'] = «14»;

        $postLoginFields['ctl00$plhMain$btnSubmit'] = «ОТПРАВИТЬ»;

        $postLoginFields['____Ticket'] = «1»;

        $postLoginFields['__EVENTVALIDATION'] = «ocN9/AWVkqNfVBdx4wlSJJXUC5GZ5dfdK6dtrVj3hGKXzAD49uvhKRKBIhIeRRIuTvxvEAiUdWDlJUvGn0fGO3zwrRw7iVe7yHiBEc00shTSKMMavWRYfd/D9G65u9xT1IX1MJmpIlM=»;

        //создаем файл для cookies

        $cookiefile = tempnam('path/to/cookie/folder', 'cookie_');

        $ch = curl_init(); //инициализация библиотеки

        //указываем адрес страницы

        curl_setopt($ch, CURLOPT_URL,$url);

        //указываем заголовок User-Agent

        curl_setopt($ch, CURLOPT_USERAGENT, $agent);

        //указываем, что полученная страница должна быть сохранена в переменную

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        //указываем, что cURL должен переходить по редиректам

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

        //referer — адрес страницы с которой вы пришли,

        //т.е. нужно указать адрес страницы на которой находится форма

        curl_setopt($ch, CURLOPT_REFERER, $referer);

        //указываем, что мы отправляем данные методом post

        curl_setopt($ch, CURLOPT_POST, 1);

        //добавляем строку с post данными

        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postLoginFields));

        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);

        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        //выполняем запрос

        $page = curl_exec($ch);

        curl_close($ch);

        echo $page;

        • Теперь вижу. Попробуйте установить все заголовки запроса (request headers) как в браузере, а не только referer и user-agent.

        • schartem

          Какое-то изменение есть. Теперь скрипт очень долго думает и его выкидывает Maximum execution time, установленное у меня в 60 секунд. В чем может быть проблема?

          http://www.fayloobmennik.net/5488826

        • Проверьте есть ли ошибки:

          if (curl_errno($ch))
          {
          echo 'error:' . curl_error($ch);
          }

          И посмотрите заголовки ответа

          curl_setopt($ch, CURLOPT_HEADER, 1);

          $page = curl_exec($ch);

          $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
          $header = substr($page, 0, $header_size);
          $body = substr($page, $header_size);

        • schartem

          Как я понимаю скрипт дальше этой строчки не идет:
          $page = curl_exec($ch);

          и единственное, что он выдает это «Fatal error: Maximum execution time of 60 seconds exceeded in C:serverlocalfilesfinalauto.php on line 55»

          получается, что проверить на ошибки нельзя, как и посмотреть заголовки ответа, я правильно понимаю?

        • Это означает, что PHP прервал выполнение скрипта. Попробуйте увеличить параметр max_execution_time в php.ini.
          Но, скорее всего, сервер к которому вы отправляете запрос просто не отвечает.