Анализ трафика HTTP
Продолжение серии статей об Интернет-ботах.
Когда вы набираете в браузере адрес URI, он делает примерно то же самое, что мы делали в предыдущей статье с помощью Telnet-клиента. Но отправляет больше заголовков. Например, информацию о нем самом, о версии вашей ОС, передает cookies при их наличии. При переходе по ссылке отправляется адрес, откуда пользователь пришел на сайт. Различных заголовков очень много и описывать их все здесь не имеет смысла.
Для создания программы, эмулирующей браузер (Интернет-бот), необходим тщательный анализ цепочки HTTP запросов браузера и ответов на них.
Средства анализа
Существуют различные средства анализа трафика. Можно, например, установить специальный сетевой драйвер-фильтр. Однако значительно проще воспользоваться плагином к браузеру. Мне нравится вот этот (для Firefox): Live HTTP Headers.
Итак, нужен плагин. Этот или другой, главное, чтобы он сканировал заголовки как запросов, так и ответов.
Запускаем его и вводим в браузере «www.ya.ru». Я вижу вот что:
http://ya.ru/ GET / HTTP/1.1 Host: ya.ru User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive HTTP/1.x 200 OK Server: nginx Date: Mon, 25 Jan 2010 22:21:14 GMT Content-Type: text/html; charset=utf-8 Last-Modified: Tue, 12 Jan 2010 15:29:03 GMT Transfer-Encoding: chunked Connection: keep-alive Content-Encoding: gzip
Это стартовые строки и заголовки реального браузерного запроса и ответа ему. Здесь видно, что Firefox умеет принимать сжатый ответ, о чем сообщил серверу Яндекса. Тот это понял и прислал сообщение, упакованное методом gzip.
Отправка формы
Для примера, оставим комментарий на Свиттере.

К сожалению, большинство комментариев, посупающих на модерацию, именно такие
Итак, подготавливаем форму, как на картинке, запускаем плагин мониторинга HTTP, нажимаем «Отправить».
Запрос:
POST /wp-comments-post.php HTTP/1.1 Host: svitter.ru User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://svitter.ru/?p=378 Content-Type: application/x-www-form-urlencoded Content-Length: 350 author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&email=x%40x.com&url=x.com&comment=%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D0%BE%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5%2C+%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0+%D0%BF%D0%BE+%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5&submit.x=54&submit.y=12&submit=Submit+Comment&comment_post_ID=378&comment_parent=0
Браузер отправляет запрос методом POST, передвая введенную нами информацию в теле сообщения. Оно имеет такой вид:
param1=value1¶m2=value2¶m3=value3
Где param1, param2, param3 – имена параметров, а value1, value2, value3 – их значения. Таких пар имя-значение может быть сколь угодно много. Пробелы браузер заменил на «+», кирилицу и прочие специальные символы на их коды вида %XX или %XX%YY (если символ кодируется двумя байтами).
author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&email=x%40x.com&url=x.com&comment=%D0%9A%D1%83%D0%BF%D0%B8%D1%82%D1%8C+%D0%BE%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5%2C+%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0+%D0%BF%D0%BE+%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5&submit.x=54&submit.y=12&submit=Submit+Comment&comment_post_ID=378&comment_parent=0
Следует читать как:
author=Окна ПВХ& email=x@x.com& url=x.com& comment=Купить окна ПВХ, доставка по Москве& submit.x=54& submit.y=12& submit=Submit+Comment& comment_post_ID=378& comment_parent=0
Вот так можно оставлять комментарии на Свиттере Telnet-клиентом. Просто добавьте воды введите нужные заголовки и тело запроса.
Ответ:
HTTP/1.x 302 Moved Temporarily Via: 1.1 RGW Connection: Keep-Alive Proxy-Connection: Keep-Alive Transfer-Encoding: chunked Expires: Wed, 11 Jan 1984 05:00:00 GMT Date: Tue, 26 Jan 2010 16:05:10 GMT Location: http://svitter.ru/?p=378&cpage=1#comment-349 Content-Type: text/html Server: nginx/0.7.62 Keep-Alive: timeout=20 Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache X-Powered-By: PHP/5.3.1 Set-Cookie: comment_author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/ Set-Cookie: comment_author_email=x%40x.com; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/ Set-Cookie: comment_author_url=http%3A%2F%2Fx.com; expires=Sat, 08-Jan-2011 21:25:10 GMT; path=/ Last-Modified: Tue, 26 Jan 2010 16:05:10 GMT
Стартовая строка ответа говорит о том, что надо сделать редирект, а заголовок Location поясняет, куда именно. Как правило, скрипт обработки запроса POST делает перенаправление. Во-первых, это легче запрограммировать, а, во-вторых, пользователь сможет безболезненно обновлять страницу (без предупреждений о том, что данные формы будут снова отправлены).
Обратите внимание на заголовки Set-Cookie. Таким образом сервер сообщает браузеру, что введенные автором коментария данные (имя, email и url) нужно сохранить в cookies. Благодаря этому, при отправке следующего комментария останется ввести лишь текст сообщения.
А что же делать, если для доступа к сайту необходима авторизация? Об этом я расскажу в следующей статье. (скоро)
Recent Comments