<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Программирование и вебдизайн &#187; HTTP</title>
	<atom:link href="http://rucode.infonex.us/category/http/feed/" rel="self" type="application/rss+xml" />
	<link>http://rucode.infonex.us</link>
	<description>Just another Informational Blog weblog</description>
	<lastBuildDate>Sat, 18 Feb 2012 12:37:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Автоматизация подписки на рассылку FeedBurner. Часть 3</title>
		<link>http://rucode.infonex.us/2010/03/09/avtomatizatsiya-podpiski-na-rassyilku-feedburner-chast-3/</link>
		<comments>http://rucode.infonex.us/2010/03/09/avtomatizatsiya-podpiski-na-rassyilku-feedburner-chast-3/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 17:28:13 +0000</pubDate>
		<dc:creator>Alex Nikitin</dc:creator>
				<category><![CDATA[email рассылки]]></category>
		<category><![CDATA[feedburner]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[бот]]></category>
		<category><![CDATA[Интернет]]></category>
		<category><![CDATA[Наше ПО]]></category>

		<guid isPermaLink="false">http://svitter.ru/?p=929</guid>
		<description><![CDATA[Заключительная часть трилогии о том, как взять feedburner’овскую капчу, заставить пользователя ввести её и подписать его на рассылку feedburner.
Часть 1, Часть 2
В этой статье разберем серверную часть программы – php-скрипт, задача которого обратиться к сервису feedburner, получить капчу, передать пользователю, принять расшифровку капчи от пользователя и передать feedburner. Я использовал ZendFramework, но в основном по [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://www.clearcrystalmedia.com/gc/wp-content/uploads/2008/01/feedburner-logo.png" alt="" width="266" height="47" />Заключительная часть трилогии о том, как взять feedburner’овскую капчу, заставить пользователя ввести её и подписать его на рассылку feedburner.</p>
<p><a href="http://svitter.ru/?p=792">Часть 1</a>, <a href="http://svitter.ru/?p=845">Часть 2</a></p>
<p>В этой статье разберем серверную часть программы – php-скрипт, задача которого обратиться к сервису feedburner, получить капчу, передать пользователю, принять расшифровку капчи от пользователя и передать feedburner. Я использовал ZendFramework, но в основном по мелочи.<br />
<span id="more-929"></span><br />
Итак, весь скрипт состоит из двух больших блоков. Первый – для случая, когда мы только получаем капчу, второй – для случая, когда пользователь её уже расшифровал.</p>
<p>Когда мы обращаемся к фидбернеру в первый раз отрабатывает следующий скрипт:</p>
<div class="wp_syntax">
<div class="code">
<pre class="php" style="font-family:monospace;"><span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Http_Client<span style="color: #009900;">&#40;</span><span style="color: #666666; font-style: italic;">/* здесь должна идти строка с адресом рассылки, которую генерирует feedburner */</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
	        <span style="color: #0000ff;">'loc'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ru_RU'</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'uri'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #666666; font-style: italic;">/* данные вашей рассылки */</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #666666; font-style: italic;">/* данные вашей рассылки */</span><span style="color: #339933;">,</span>
	    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$resp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'POST'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	<span style="color: #666666; font-style: italic;">// выполняем POST запрос</span>
<span style="color: #000088;">$headers</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resp</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getHeaders</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// меняем относительные пути на полные</span>
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span>  <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'captcha?'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'http://feedburner.google.com/fb/a/captcha?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$resp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span>  <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'=&quot;/fb'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'=&quot;http://feedburner.google.com/fb'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// В ответ на наш запрос feedburner генерирует форму</span>
<span style="color: #666666; font-style: italic;">// для заполнения с рядом скрытых (hidden) полей.</span>
<span style="color: #666666; font-style: italic;">// Значение этих полей нам нужно достать и отправить</span>
<span style="color: #666666; font-style: italic;">// обратно фидбернеру при следующем обращении</span>
<span style="color: #666666; font-style: italic;">// Здесь я опушу большую часть однотипных действий</span>
<span style="color: #000088;">$pos1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action=&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pos1</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pos11</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pos11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$pos1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'input type=&quot;hidden&quot; name=&quot;uri&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pos1</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">38</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pos11</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uri</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$uri</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pos11</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
…</pre>
</div>
</div>
<p>А далее нам остается только сформировать собственный кусок кода HTML, который AJAX вернет клиенту:</p>
<div class="wp_syntax">
<div class="code">
<pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>form<span style="color: #339933;">&gt;</span>
	<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbaction&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbaction&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">/&gt;</span>
	<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fburi&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fburi&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">/&gt;</span>
	<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbemail&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbemail&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">/&gt;</span>
	<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbtoken&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbtoken&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">/&gt;</span>
	<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;hidden&quot;</span> id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbcookie&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;fbcookie&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">/&gt;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;</span></pre>
</div>
</div>
<p>$action, $uri, $email, $token – то, что мы достали из кода, сгенерированного фидбернером. $headers[‘Set-cookie’] – куки которые, установил фидбернер, их также нужно передать.</p>
<p>А теперь рассмотрим действия, когда пользователь ввел капчу, которую предложил нам фидбернер и отправил данные в наш серверный скрипт.</p>
<div class="wp_syntax">
<div class="code">
<pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// клиент для HTTP-запросов</span>
<span style="color: #000088;">$client</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Http_Client<span style="color: #009900;">&#40;</span><span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// устанавливаем параметры, которые получили в прошлый</span>
<span style="color: #666666; font-style: italic;">// раз от фидбернера</span>
<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParameterPost</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'loc'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ru_RU'</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'token'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'token'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'uri'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uri'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'captcha'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'captcha'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
	        <span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span>
	    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// не забываем добавить куки</span>
<span style="color: #000088;">$cookie</span> <span style="color: #339933;">=</span> Zend_Http_Cookie<span style="color: #339933;">::</span><span style="color: #004000;">fromString</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cookie'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setCookie</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cookie</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// делаем POST запрос к фидбернеру</span>
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'POST'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre>
</div>
</div>
<p>Вот и все. В $response у нас попадет ответ от фидбернера. Он скажет, что, либо регистрация прошла успешно, либо мы неправильно ввели капчу, либо плохой e-mail и т.п. Я ничего лучше не придумал, как проверять полученный текст на наличие каких-то ключевых слов. Это, в общем-то, тривиальная задача.</p>
<p><img src="http://feeds.feedburner.com/~r/svitter/articles/~4/Pni2aDYoc_o" height="1" width="1"/></p>
<div id="crp_related"><h4>Related Posts:</h4><ul><li><a href="http://rucode.infonex.us/2010/04/05/kodikevich-i-vyichislitelnyiy-klaster/" rel="bookmark" class="crp_title">Кодикевич и вычислительный кластер</a></li><li><a href="http://rucode.infonex.us/2010/04/09/russkiy-yazyik-vyibor-okonchaniy/" rel="bookmark" class="crp_title">Русский Язык. Выбор окончаний</a></li><li><a href="http://rucode.infonex.us/2010/03/19/rasputyivanie-zlogo-koda/" rel="bookmark" class="crp_title">Распутывание злого кода</a></li><li><a href="http://rucode.infonex.us/2010/02/04/kak-napisat-svoy-sobstvennyiy-im-bot-menee-chem-za-5-minut/" rel="bookmark" class="crp_title">Как написать свой собственный IM бот менее, чем за 5 минут</a></li><li><a href="http://rucode.infonex.us/2010/04/06/kompaniya-stimulsoft-obyavlyaet-o-vyihode-novoy-versii-2010-1-generatorov-otchetov-stimulsoft-reports/" rel="bookmark" class="crp_title">Компания Стимулсофт объявляет о выходе новой версии 2010.1 генераторов отчетов Stimulsoft Reports</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://rucode.infonex.us/2010/03/09/avtomatizatsiya-podpiski-na-rassyilku-feedburner-chast-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Анализ трафика HTTP</title>
		<link>http://rucode.infonex.us/2010/02/09/analiz-trafika-http/</link>
		<comments>http://rucode.infonex.us/2010/02/09/analiz-trafika-http/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 16:06:27 +0000</pubDate>
		<dc:creator>Dmitriy Lyapin</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Live HTTP Headers]]></category>
		<category><![CDATA[Инструментарий]]></category>

		<guid isPermaLink="false">http://svitter.ru/?p=772</guid>
		<description><![CDATA[Продолжение серии статей об Интернет-ботах.
Часть 1, Часть 2, Часть 3
Когда вы набираете в браузере адрес URI, он делает примерно то же самое, что мы делали в предыдущей статье с помощью Telnet-клиента. Но отправляет больше заголовков. Например, информацию о нем самом, о версии вашей ОС, передает cookies при их наличии. При переходе по ссылке отправляется адрес, [...]]]></description>
			<content:encoded><![CDATA[<p><em>Продолжение серии статей об Интернет-ботах.</em></p>
<p><a href="http://svitter.ru/?p=497">Часть 1</a>, <a href="http://svitter.ru/?p=621">Часть 2</a>, <strong>Часть 3</strong></p>
<p>Когда вы набираете в браузере адрес URI, он делает примерно то же самое, что мы делали в <a href="http://svitter.ru/?p=621">предыдущей статье</a> с помощью Telnet-клиента. Но отправляет больше заголовков. Например, информацию о нем самом, о версии вашей ОС, передает cookies при их наличии. При переходе по ссылке отправляется адрес, откуда пользователь пришел на сайт. Различных заголовков очень много и описывать их все здесь не имеет смысла.</p>
<p>Для создания программы, эмулирующей браузер (<strong>Интернет-бот</strong>), необходим тщательный анализ цепочки HTTP запросов браузера и ответов на них.</p>
<p><span id="more-772"></span></p>
<h2>Средства анализа</h2>
<p>Существуют различные средства анализа трафика. Можно, например, установить специальный сетевой драйвер-фильтр. Однако значительно проще воспользоваться плагином к браузеру. Мне нравится вот этот (для Firefox): <a href="https://addons.mozilla.org/en-US/firefox/addon/3829">Live HTTP Headers</a>.</p>
<p>Итак, нужен плагин. Этот или другой, главное, чтобы он сканировал заголовки как запросов, так и ответов.</p>
<p>Запускаем его и вводим в браузере &laquo;www.ya.ru&raquo;. Я вижу вот что:</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">http://ya.ru/
&nbsp;
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
&nbsp;
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</pre>
</div>
</div>
<p>Это стартовые строки и заголовки реального браузерного запроса и ответа ему. Здесь видно, что Firefox умеет принимать сжатый ответ, о чем сообщил серверу Яндекса. Тот это понял и прислал сообщение, упакованное методом gzip.</p>
<h2>Отправка формы</h2>
<p>Для примера, оставим комментарий на Свиттере.</p>
<p><img src="http://svitter.ru/wp-content/uploads/2010/02/1.jpg" alt="" width="526" height="408" class="alignnone size-full wp-image-773" /></p>
<p>К сожалению, большинство комментариев, посупающих на модерацию, именно такие <img src='http://svitter.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Итак, подготавливаем форму, как на картинке, запускаем плагин мониторинга HTTP, нажимаем &laquo;Отправить&raquo;.</p>
<p>Запрос:</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">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
&nbsp;
author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&amp;email=x%40x.com&amp;url=x.com&amp;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&amp;submit.x=54&amp;submit.y=12&amp;submit=Submit+Comment&amp;comment_post_ID=378&amp;comment_parent=0</pre>
</div>
</div>
<p>Браузер отправляет запрос методом POST, передвая введенную нами информацию в теле сообщения. Оно имеет такой вид:</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">param1=value1&amp;param2=value2&amp;param3=value3</pre>
</div>
</div>
<p>Где param1, param2, param3 &#8211; имена параметров, а value1, value2, value3 &#8211; их значения. Таких пар имя-значение может быть сколь угодно много. Пробелы браузер заменил на &laquo;+&raquo;, кирилицу и прочие специальные символы на их коды вида %XX или %XX%YY (если символ кодируется двумя байтами).</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">author=%D0%9E%D0%BA%D0%BD%D0%B0+%D0%9F%D0%92%D0%A5&amp;email=x%40x.com&amp;url=x.com&amp;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&amp;submit.x=54&amp;submit.y=12&amp;submit=Submit+Comment&amp;comment_post_ID=378&amp;comment_parent=0</pre>
</div>
</div>
<p>Следует читать как:</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">author=Окна ПВХ&amp;
email=x@x.com&amp;
url=x.com&amp;
comment=Купить окна ПВХ, доставка по Москве&amp;
submit.x=54&amp;
submit.y=12&amp;
submit=Submit+Comment&amp;
comment_post_ID=378&amp;
comment_parent=0</pre>
</div>
</div>
<p>Вот так можно оставлять комментарии на Свиттере Telnet-клиентом. Просто <strike>добавьте воды</strike> введите нужные заголовки и тело запроса.</p>
<p>Ответ:</p>
<div class="wp_syntax">
<div class="code">
<pre class="text" style="font-family:monospace;">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&amp;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</pre>
</div>
</div>
<p>Стартовая строка ответа говорит о том, что надо сделать редирект, а заголовок Location поясняет, куда именно. Как правило, скрипт обработки запроса POST делает перенаправление. Во-первых, это легче запрограммировать, а, во-вторых, пользователь сможет безболезненно обновлять страницу (без предупреждений о том, что данные формы будут снова отправлены).</p>
<p>Обратите внимание на заголовки <strong>Set-Cookie</strong>. Таким образом сервер сообщает браузеру, что введенные автором коментария данные (имя, email и url) нужно сохранить в cookies. Благодаря этому, при отправке следующего комментария останется ввести лишь текст сообщения.</p>
<p>А что же делать, если для доступа к сайту необходима <strong>авторизация</strong>? Об этом я расскажу в следующей статье. <strong>(скоро)</strong></p>
<p><img src="http://feeds.feedburner.com/~r/svitter/articles/~4/rdBDEGoUrkA" height="1" width="1"/></p>
<div id="crp_related"><h4>Related Posts:</h4><ul><li><a href="http://rucode.infonex.us/2010/03/07/php-i-utf-8/" rel="bookmark" class="crp_title">PHP и UTF-8</a></li><li><a href="http://rucode.infonex.us/2010/01/28/chto-vazhno-znat-o-http/" rel="bookmark" class="crp_title">Что важно знать о HTTP</a></li><li><a href="http://rucode.infonex.us/2010/03/09/avtomatizatsiya-podpiski-na-rassyilku-feedburner-chast-3/" rel="bookmark" class="crp_title">Автоматизация подписки на рассылку FeedBurner. Часть 3</a></li><li><a href="http://rucode.infonex.us/2010/04/05/kodikevich-i-vyichislitelnyiy-klaster/" rel="bookmark" class="crp_title">Кодикевич и вычислительный кластер</a></li><li><a href="http://rucode.infonex.us/2010/02/25/rabota-s-formatom-zip-v-c/" rel="bookmark" class="crp_title">Работа с форматом ZIP в C#</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://rucode.infonex.us/2010/02/09/analiz-trafika-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Что важно знать о HTTP</title>
		<link>http://rucode.infonex.us/2010/01/28/chto-vazhno-znat-o-http/</link>
		<comments>http://rucode.infonex.us/2010/01/28/chto-vazhno-znat-o-http/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 14:55:22 +0000</pubDate>
		<dc:creator>Dmitriy Lyapin</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Telnet]]></category>
		<category><![CDATA[Инструментарий]]></category>
		<category><![CDATA[Интернет]]></category>

		<guid isPermaLink="false">http://svitter.ru/?p=621</guid>
		<description><![CDATA[Продолжение серии статей об Интернет-ботах.
Часть 1, Часть 2, Часть 3
HTTP (Hyper Text Transport Protocol) &#8211; это тот самый язык, на котором разговаривают браузеры с веб-серверами.
Самое важное о HTTP:

протокол предполагает наличие сервера и клиента (клиент посылает запрос &#171;хочу страницу index.html&#187;, сервер отвечает &#171;на тебе эту страницу, вот ее содержимое&#187;)
это текстовый протокол (запросы и ответы имеют понятный [...]]]></description>
			<content:encoded><![CDATA[<p><em>Продолжение серии статей об Интернет-ботах.</em></p>
<p><a href="http://svitter.ru/?p=497">Часть 1</a>, <strong>Часть 2</strong>, <a href="http://svitter.ru/?p=772">Часть 3</a></p>
<p>HTTP (<a href="http://ru.wikipedia.org/wiki/HTTP">Hyper Text Transport Protocol</a>) &#8211; это тот самый язык, на котором разговаривают браузеры с веб-серверами.</p>
<p>Самое важное о HTTP:</p>
<ul>
<li>протокол предполагает наличие сервера и клиента (клиент посылает запрос &laquo;хочу страницу index.html&raquo;, сервер отвечает &laquo;на тебе эту страницу, вот ее содержимое&raquo;)</li>
<li>это текстовый протокол (запросы и ответы имеют понятный человеку вид, их можно читать в обычном текстовом редакторе)</li>
<li>каждое сообщение состоит из стартовой строки, заголовков и тела (об этом подробнее дальше)</li>
</ul>
<p><img src="http://svitter.ru/wp-content/uploads/2010/01/svideteli_osvidetelstvovanija.jpg" alt="svideteli_osvidetelstvovanija" width="307" height="148" class="alignright size-full wp-image-636" /></p>
<p>Перечисленные особенности делают HTTP очень простым и расширяемым. Например, когда возникла задача сохранять информацию на машине клиента, протокол переписывать не пришлось. Все что надо было сделать &#8211; добавть один новый заголовок запроса (Cookie) и один &#8211; ответа (Set-Cookie).</p>
<p>Ниже по тексту я буду предлагать вам делать разные вещи. Например, скачать Яндекс Telnet-клиентом. &laquo;Пощупав&raquo; HTTP своими руками, проще понять его принцип. Но можно и просто читать, специально для вас у меня припасены скриншоты <img src='http://svitter.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-621"></span></p>
<h2>Минимальный HTTP запрос</h2>
<p>Скачаем содержимое сайта www.ya.ru без браузера. Для этого подойдет Telnet-клиент, который наверняка есть в вашей ОС. Чтобы воспользоваться им в Windows, запустите интерпретатор командной строки (cmd.exe). Далее набирайте текст, как на картинке, и нажимайте Enter.</p>
<p><img src="http://svitter.ru/wp-content/uploads/2010/01/11.jpg" alt="1" width="677" height="85" class="alignnone size-full wp-image-622" /></p>
<p>Появился пустой черный экран. Вводите:</p>
<pre>
GET / HTTP/1.1
</pre>
<p>Нажимайте Enter. Пусть вас не смущает, что ничего не отображается на экране. Продолжайте ввод:</p>
<pre>
Host: www.ya.ru
</pre>
<p>Нажимайте Enter <strong>дважды</strong>.</p>
<p>Это был HTTP-запрос. А вот и ответ:</p>
<p><img src="http://svitter.ru/wp-content/uploads/2010/01/21.jpg" alt="2" width="677" height="290" class="alignnone size-full wp-image-623" /></p>
<p>Что же мы сделали:</p>
<ol>
<li>подключились к серверу ya.ru на 80-ый порт (стандартный для HTTP)</li>
<li>отправили сообщение, состоящее из стартовой строки и одного заголовка</li>
<li>получили ответ, состоящий из стартовой строки, семи заголовков и тела</li>
</ol>
<p>В стартовой строке запроса необходимо указать HTTP метод, URI документа и версию HTTP. В заголовке Host &#8211; имя хоста. Это был минимальный запрос. Если что-нибудь убрать, сервер скажет &laquo;Bad request&raquo;.</p>
<p>Ответ начинается со стартовой строки &laquo;HTTP/1.1 200 OK&raquo;, что означает, что наш запрос обработан успешно. Нам присылают желанный документ, содержимое которого находится в теле HTTP ответа. Именно его мы увидим, если нажмем в браузере кнопку &laquo;Исходный код страницы&raquo;. Из заголовков хотел бы обратить ваше внимание только на Content-Length &#8211; здесь указан размер тела сообщения в байтах.</p>
<p>Пустая строка означает, что заголовки закончились и начинается тело сообщения. Именно поэтому мы нажимали Enter дважды в конце запроса.</p>
<h2>Методы HTTP</h2>
<p>Стартовая строка запроса начинается с названия метода, то есть имени основной операции, производимой над ресурсом.</p>
<p>Основные методы:</p>
<ul>
<li>GET &#8211; используется при наборе адреса вручную или переходе по ссылке</li>
<li>POST &#8211; используется при отправке формы</li>
</ul>
<p>Думаю, что распределение частоты запросов примерно такое:</p>
<ul>
<li>99.9% &#8211; GET</li>
<li>0.1% &#8211; POST (читают Интернет намного чаще, чем пишут)</li>
<li>0% &#8211; <a href="http://ru.wikipedia.org/wiki/HTTP#.D0.9C.D0.B5.D1.82.D0.BE.D0.B4.D1.8B">другие методы</a> (имеют скорее историческую ценность)</li>
</ul>
<p><em>Примечание: не стоит воспринимать эти цифры буквально.</em></p>
<p>При обращении к серверному скрипту обычно передаются параметры запроса. Например, URI <strong>http://svitter.ru/?p=621</strong> означает, что я хочу прочитать статью #621. Методом GET можно передать парамтеры только через <a href="http://svitter.ru/?p=557">URI</a>. С помощью POST их можно передавать как через URI, так и в теле сообщения.</p>
<p>В <a href="http://svitter.ru/?p=772">следующей статье</a> я напишу, как анализировать HTTP трафик. Это необходимо для создания программы, эмулирующей браузер (ведь нам нужен <strong>Интернет-бот</strong>, помните? <img src='http://svitter.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p><img src="http://feeds.feedburner.com/~r/svitter/articles/~4/evQtyrZu8aw" height="1" width="1"/></p>
<div id="crp_related"><h4>Related Posts:</h4><ul><li><a href="http://rucode.infonex.us/2010/02/06/sql-zagadka-pro-dni-rozhdeniya/" rel="bookmark" class="crp_title">SQL-загадка про дни рождения</a></li><li><a href="http://rucode.infonex.us/2010/02/15/zagadka-pro-bityi/" rel="bookmark" class="crp_title">Загадка про биты</a></li><li><a href="http://rucode.infonex.us/2010/02/09/analiz-trafika-http/" rel="bookmark" class="crp_title">Анализ трафика HTTP</a></li><li><a href="http://rucode.infonex.us/2010/03/07/php-i-utf-8/" rel="bookmark" class="crp_title">PHP и UTF-8</a></li><li><a href="http://rucode.infonex.us/2010/01/27/privlekatelnyie-giki/" rel="bookmark" class="crp_title">Привлекательные гики</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://rucode.infonex.us/2010/01/28/chto-vazhno-znat-o-http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

