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

26 ноября, 2009
php curl

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

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

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

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

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

  1. $login_url = 'http://my_site.com/';
  2. $agent = 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)';
  3.  
  4. $ch = curl_init(); //инициализация библиотеки
  5. //указываем адрес страницы
  6. curl_setopt($ch, CURLOPT_URL,$login_url);
  7. //указываем заголовок User-Agent
  8. curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  9. //указываем, что полученная страница должна быть сохранена в переменную
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  11. //указываем, что cURL должен переходить по редиректам
  12. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  13.  
  14. //выполняем запрос
  15. $page = curl_exec($ch);

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

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

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

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

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

  1. $referer = 'http://my_site.com/';
  2. $postLoginFields = array();
  3. $postLoginFields['login'] = 'your login';
  4. $postLoginFields['pass'] = 'your password';
  5.  
  6. //referer – адрес страницы с которой вы пришли,
  7. //т.е. нужно указать адрес страницы на которой находится форма
  8. curl_setopt($ch, CURLOPT_REFERER, $reffer);
  9. //указываем, что мы отправляем данные методом post
  10. curl_setopt($ch, CURLOPT_POST, 1);
  11. //добавляем строку с post данными
  12. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postLoginFields));

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

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

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

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

  1. //создаем файл для cookies
  2. $cookiefile = tempnam('path/to/cookie/folder', 'cookie_');
  3.  
  4. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
  5. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

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

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

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

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

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

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

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

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в PHP View Comments

]]>
  • Andrey
    Здравствуйте! А как можно послать следующий запрос на другую страницу этого же сайта, используя сохранённые куки?
  • Просто отправьте запрос из этого же скрипта.
    Ставите новый адрес страницы
    curl_setopt($ch, CURLOPT_URL, $protected);
    и отправляете запрос
    $page = curl_exec($ch);
  • Andrey
    Но почему-то не переходит по новому адресу.
  • Установите режим отладки

    curl_setopt($ch, CURLOPT_VERBOSE, TRUE)

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

  • Andrey
    Спасибо.
  • cURL - интересная тема. Нужно развивать :)
  • Хорошая статья получилась. Очень много полезной информации. cURL рулит!
  • Хочется продолжения, или даже серии постов о такой замечательной связке (PHP и cURL).
  • Статейка интересная. на phpClub не видел, а тут как раз на мой уровень (к сожалению пока не слишком высокий) знаний PHP
  • Ну в мирных целях использовать тако не очень хочется пока, а идейка сама по себе интересная.
  • Согласен, в мирных целях им приходится пользоваться не часто. Обычно удобнее использовать какой-нибудь готовый сервис.
  • >Я всегда знаю где находятся cookies и то, что у них уникальные имена

    Полностью с вами согласен.
  • ghost
    Даешь продолжение
  • А чем эта статья отличается от phpclub.

    Нашёл только одно - указали работу с кукисами
  • Big_Shark
    на phpclub статья написана на гиковском языке.
    Если вам не нужны статьи написанные на понятном языке то идем прямо на php.net и там читаем все что нужно.
  • Big_Shark, не хотел вас обидеть, просто не увидел ничего принципиально нового. Сам читаю статьи у буржуев в первую очередь.

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


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

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

    Я не хочу сказать, что моя статья лучше, чем на phpClub, потому что в ней больше пояснений. Лучше-хуже понятия относительные. Все зависит от предыдущей подготовки читателя. Кто-то глянет мельком на пример кода и сразу сможет изменить его под свои задачи, а кому-то нужно почитать об описании каждого параметра.
  • Хорошая статья.
    Можно делать продолжение, рассказать можно например о таком:
    +как считать и отправить сохраненную куку сайта
    +какие особенности ajax форм
    +как получить капчу, чтобы ввести ее вручную
    +как парсить полученные результаты и то с этим делать
    +как реализовать пакетное выполнение операций через curl, если на хостинге время выполнения скрипта ограничено в 30 сек
    +как работать через прокси
    (или по крайней мере накидать ссылок на другие статьи про curl)
    и т. д. :)
  • Спасибо, я учту :)
    Кстати, о двух последних пунктах я раньше рассказывал.
  • Big_Shark
    Очень хорошая идея!
    Я за!
    Кстати есть какие либо классы по работе с curl дабы не запоминать все эти замутные названия типа CURLOPT_POSTFIELDS и т.д. ?
blog comments powered by Disqus ]]>