Писал давненько статью для web-hacka, решил запостить и тут, наверняка найдутся люди которым она в чем то поможет. Итак.
===========================
/********* Предисловие ***********/
В один прекрасный день я столкнулся с задачей сделать авторассыльщик по доскам объявлений прямо с сайта заказчика. Порыл гугль, но ничего конкретного на эту тему не нашел , решил сделать сам.
Итак, для работы нам понадобится PHP как минимум четвертой версии (при младших версиях работоспособность не проверял) с прикрученной библиотекой CURL. Что это за штука и где ее найти можно прочитать
здесь . Даже если вы не собираетесь делать то, что я тут описываю, настоятельно рекомендую ознакомится с этой библиотекой, она вам обязательно понравится и в будущем пригодится. Поставили курл - вызываем phpinfo() и ищем там строчку
"CURL support ======== Enabled". Нашли? Тогда идем дальше.
Помимо CURL'а вам понадобятся как минимум начальные знания языка PHP, минимальное представление о работе протокола http и хорошее настроение, организованное любимым треком в WinAmp'е. Прямые руки, как всегда, приветсвуются.
/********* Преступим [теория]***********/
Чтобы не быть голословным, буду писать скриптег под реальный сайт - _optsib.ru. Заходим на сайт, тыкаем
"Доска объявлений" => "Добавить объявление". Смотрим в адресную строку браузера и видим там какую то бяку типа этой
s=20080ч221521288b93b4a822fe4e235843df043d76b774. Что то похожее на ПХП СессИд. Берем на заметку и открываем HTML код странички, плясать будем именно от него.
Там находим код формы, и выписываем имена полей, обязательных для заполнения. У нас это:
name, email, phone, razdel, zag, text. Их значения мы будем передавать на сервер заголовком POST (так как форма использует именно этот способ отправки).
Так же мы видим в коде еще хидден поля -
вот где на самом деле зарыта собака. У нас их три:
ins, s, и sort. Не закрывая первого, открываем любой другой браузер переходим на ту же страничку добавления объявления и сравнивая ее ХТМЛ код с кодом первого браузера, убеждаемся что hidden поля
ins и
sort статичны и несут служебную информацию, а вот поле s изменило свое значение, это и есть защита от спама, оно же предупреждает нас что одним запросом на сервер нам не обойтись.
/********* Преступим [кодим наконец то
]***********/
Итак создаем новый php-файл и начинаем кодить. Первым делом объявляем серверу что мы пришли, чтобы он выдал нам куки, по которым в последствии он будет сверять, не робот ли мы:
[code]
$url="http://optsib.ru/do.phtml";
$ua = 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)';
$ch=curl_init(); //инициализируем сеанс CURL
// ф-ция curl_setopt устанавливает параметры для запроса
curl_setopt($ch, CURLOPT_URL, $url); //указываем URL для запроса
curl_setopt($ch, CURLOPT_HEADER, 1); //просим CURL возвращать нам ответ
вместе с заголовками (обязательно)
curl_setopt($ch, CURLOPT_USERAGENT, $ua); //утверждаем что мы браузер чтоб не спалили
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //без коментариев
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //говорим что ответ сервера нам нада возвращать, а не выводить прямо в браузер.
$answer=curl_exec($ch); //выполняем сам запрос, ответ сервера сохраняем в $answer.
[/quote]
Далее выводим ответ в браузер чтобы глянуть что там у нас пришло в заголовках. Там видим что в заголовке нам выдают кукисы PHPSESSID. Выдираем их и сохраняем себе на память :
Код:
$sess_cookie=substr($answer, strpos($answer, "PHPSESSID=")+10, 32);
Дальше вспоминаем что у нас еще есть хидден поле
s, его значение тоже достаем:
Код:
$s_hidden=substr($answer, strpos($answer, 'name="s" value=')+16, 46);
Прямо как настоящий браузер мы приняли сессию, выданную нам доской, теперь можно послать объявление на доску:
Код:
$post="name=$company&email=$email&phone=$contacts&razdel=$cat
&zag=$ed_name&text=$text_full&ins=1&sort=2&s=$s_hidden";
/*сформировали строку пост данных состоящую из пар поле=>значение разделенных амперсандом (при необходимости строку надо url-кодировать)*/
curl_setopt($ch, CURLOPT_URL, "http://optsib.ru/insert.php"); //адрес на который шлем запрос (выдираем значение из action нашей формы)
curl_setopt($ch, CURLOPT_HEADER, 1); //дальше мы все уже видели
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, $sess_cookie); //а вот тут внимательнее! не забываем показать серверу наши, полученные ранее кукисы
curl_setopt($ch, CURLOPT_POST, 1); //говорим что у нас есть POST данные для сервера
curl_setopt($ch, CURLOPT_REFERER, "http://optsib.ru/do.phtml?d=ins&sort=2&s=$s_hidden"); /*ставим заголовок referer чтоб не спалится, вспоминаем про байду в адресной строке, теперь мы уже знаем что эта байда как раз значение нашего защитного поля */
curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //указываем на наши POST данные
$answer=curl_exec($ch); //выполняем запрос на сервер
Печатаем ответ в браузер, видим "Ваше объявление успешно добавлено" и радуемся.
Думаю на первый раз достаточно, это моя первая статья, просьба сильно не пинать . Ах да, об оптимизации кода я особо не заботился, в первую очередь пытаясь написать все как можно яснее. Если на сайте стоит защитная картинка, придется вам порыскать информацию об ее распознавании, ибо это выходит за границы данной статьи.