<?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>TracKer&#039;s blog&#187; Программирование</title>
	<atom:link href="http://tracker2k.kiev.ua/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://tracker2k.kiev.ua</link>
	<description>in Development</description>
	<lastBuildDate>Tue, 13 Jul 2010 15:44:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Произвольное чтение из удаленного (внешнего) файла</title>
		<link>http://tracker2k.kiev.ua/random-reading-from-remote-file.html</link>
		<comments>http://tracker2k.kiev.ua/random-reading-from-remote-file.html#comments</comments>
		<pubDate>Tue, 19 May 2009 08:39:31 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/?p=615</guid>
		<description><![CDATA[Зашел сегодня на AskDev и обнаружил такой вопрос. Более чем уверен что каждый более-менее продвинутый (да и не только) пользователь интернета скачивал оттуда относительно большие файлы &#8211; например MP3. Особенно сложно это было сделать раньше когда был сплошной Dial-Up с отвратительным качеством связи и постоянными разрывами. Единственный действенный способ скачать большие файлы был с помощью [...]]]></description>
			<content:encoded><![CDATA[<p>Зашел сегодня на <strong>AskDev</strong> и обнаружил <a href="http://www.askdev.ru/question/%D0%94%D0%BE%D1%81%D1%82%D1%83%D0%BF_%D0%BA_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%87%D0%B0%D1%81%D1%82%D0%B8_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0/">такой вопрос</a>.</p>
<p>Более чем уверен что каждый более-менее продвинутый (да и не только) пользователь интернета скачивал оттуда относительно большие файлы &#8211; например <strong>MP3</strong>. Особенно сложно это было сделать раньше когда был сплошной <strong>Dial-Up</strong> с отвратительным качеством связи и постоянными разрывами. <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Единственный действенный способ скачать большие файлы был с помощью менеджера закачек, и было очень приятно когда сервер, на котором лежал желанный файл, поддерживал заветную <strong>докачку</strong>. Именно с ее помощью и можно прочитать любую область удаленного файла.</p>
<p>В Википедии <a href="http://en.wikipedia.org/wiki/HTTP">написано</a>:</p>
<blockquote><p>The HTTP/1.1 <span class="mw-redirect">webserver</span> publishes its ability to respond to requests for certain byte ranges of the document by setting the header <strong>Accept-Ranges: bytes</strong>. This is useful if the client needs to have only certain portions of a resource sent by the server, which is called byte serving.</p></blockquote>
<p>Подробнее читаем <a href="http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00">тут</a>.</p>
<p>А теперь отвечаю на вопрос: доступ к произвольной части удаленного файла <strong>возможен</strong>, правда не всегда. Как я писал выше, необходимо чтобы сервер поддерживал функцию &#8220;докачки&#8221;.</p>
<p>Немного тестов и у меня получились вот такие две функции:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> isRestoreSupported<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
&nbsp;
	<span style="color: #000088;">$supported</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_NOBODY<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$headers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$headers</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">&quot;accept-ranges&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #000088;">$pos</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$val</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;bytes&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$pos</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$supported</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$supported</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$headers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$supported</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> selectedRead<span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$position</span><span style="color: #339933;">,</span> <span style="color: #000088;">$size</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
&nbsp;
	<span style="color: #000088;">$position_end</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$position</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$size</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$hdr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
&nbsp;
		<span style="color: #0000ff;">&quot;Range: bytes=<span style="color: #006699; font-weight: bold;">$position</span>-<span style="color: #006699; font-weight: bold;">$position_end</span>&quot;</span>
&nbsp;
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$ch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_NOBODY<span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #339933;">,</span> CURLOPT_HTTPHEADER<span style="color: #339933;">,</span> <span style="color: #000088;">$hdr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ch</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Не оптимизировано, но для демонстрации сгодится. Теперь находим какой-то файл и вызываем следующим образом:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$restore_support</span> <span style="color: #339933;">=</span> isRestoreSupported<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://ru.akella.com/Files/Patches/N/NeverWinterNights2/nwn2rus104.exe&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$restore_support</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Restore supported<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Reading...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;===[Data - Begin]===<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> selectedRead<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://ru.akella.com/Files/Patches/N/NeverWinterNights2/nwn2rus104.exe&quot;</span><span style="color: #339933;">,</span> <span style="color: #208080;">0x4e</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">39</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>===[Data - End]===<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Restore not supported<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>В результате имеем:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Restore supported
Reading...
===[Data - Begin]===
This program cannot be run in DOS mode.
===[Data - End]===</pre></div></div>

<p>Суть проста: сначала мы спрашиваем у сервера понимает ли он параметр заголовка <strong>Range</strong> (в народе &#8211; <em>докачка</em>), при этом с помощью <strong>CURLOPT_NOBODY</strong> ограничиваемся ответом сервера в виде одного заголовка, и в случае успеха скачиваем нужный нам кусок.</p>
<p><strong>Шоубизнес</strong>: Хорошо спел <a href="http://pozorzvezd.ru/tags/aleksandr-rybak/">Александр Рыбак</a> потому и занял первое место на Евровидении, давно уже хочется сказки&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/random-reading-from-remote-file.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Облегчаем жизнь с помощью PHP.JS</title>
		<link>http://tracker2k.kiev.ua/oblegchaem-zhizn-s-pomoshhyu-php-to-javascript.html</link>
		<comments>http://tracker2k.kiev.ua/oblegchaem-zhizn-s-pomoshhyu-php-to-javascript.html#comments</comments>
		<pubDate>Thu, 15 Jan 2009 11:43:06 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP2JS]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/?p=464</guid>
		<description><![CDATA[Часто работая над созданием различных интернет-проектов программист сталкивается с необходимостью написания какого-то кода на JavaScript. Однако при этом легко можно столкнуться с проблемой нехватки функций. Например мне недавно нужно было сгенерировать MD5 на стороне клиента, пришлось бы искать альтернативу, если бы я не знал о PHP.JS. Когда-то прочитав о нем, пользуюсь и по сей день. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://phpjs.org/"><img class="aligncenter" title="PHP.JS" src="http://phpjs.org/img/logosmall.jpg" alt="" width="120" height="54" /></a></p>
<p>Часто работая над созданием различных интернет-проектов программист сталкивается с необходимостью написания какого-то кода на JavaScript. Однако при этом легко можно столкнуться с проблемой нехватки функций. <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Например мне недавно нужно было сгенерировать MD5 на стороне клиента, пришлось бы искать альтернативу, если бы я не знал о <a href="http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_md5/"><strong>PHP.JS</strong></a>. Когда-то <a href="http://www.jeka911.com/articles/webdev/javascript_php_functions/" target="_blank">прочитав</a> о нем, пользуюсь и по сей день. С тех пор количество функций увеличилось до <strong>263</strong> и продолжает увеличиваться. Еще один плюс, что не обязательно использовать файл который предоставляется в проекте целиком, необходимые функции можно вынести и тем самым облегчить работу Браузера клиента.</p>
<p>Сайт проекта: <a href="http://phpjs.org" target="_blank">http://phpjs.org</a></p>
<p>Список функций: <a href="http://phpjs.org/functions/index" target="_blank">http://phpjs.org/functions/index</a></p>
<p>Блог разработки: <a href="http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing/" target="_blank">http://kevin.vanzonneveld.net/techblog/article/phpjs_licensing/</a></p>
<p>В ближайшее время на сайте проекта планируется добавить функцию компиляции необходимых функций в один файл, чтобы исключить ненужные.</p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/oblegchaem-zhizn-s-pomoshhyu-php-to-javascript.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>feof() не знает о конце файла</title>
		<link>http://tracker2k.kiev.ua/feof-ne-znaet-o-konce-fajla.html</link>
		<comments>http://tracker2k.kiev.ua/feof-ne-znaet-o-konce-fajla.html#comments</comments>
		<pubDate>Fri, 16 May 2008 18:40:09 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[feof]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/feof-ne-znaet-o-konce-fajla.html</guid>
		<description><![CDATA[Интересной и, кстати сказать, очень неожиданной новостью для меня стало то, что feof() на самом деле не знает о конце файла, прочитали ли мы последний символ/байт или все еще готовы читать дальше. Собственно поподробнее. Писал я маленький скрипт, ориентированный на использование бинарных файлов. В общем-то все было уже готово, однако в самый последний момент было [...]]]></description>
			<content:encoded><![CDATA[<p>Интересной и, кстати сказать, очень неожиданной новостью для меня стало то, что <a href="http://ua.php.net/manual/ru/function.feof.php" target="_blank">feof()</a> на самом деле не знает о конце файла, прочитали ли мы последний символ/байт или все еще готовы читать дальше.</p>
<p>Собственно поподробнее.</p>
<p>Писал я маленький скрипт, ориентированный на использование бинарных файлов. В общем-то все было уже готово, однако в самый последний момент было обнаружено, что по непонятной причине в буфере к прочитанным данным почему-то приплюсовывается дополнительно 10 байт данных (забитых нулями). Я не мог понять почему <strong>fread(</strong>) читает за пределами файла, а <strong>feof()</strong> не находит его конец, прочитывая последний байт. Провозился 4 часа, потом решил поискать&#8230; <a href="http://ua.php.net/manual/ru/function.feof.php#67261" target="_blank">И нашел</a>.</p>
<p>Принцип работы с функцией <strong>feof()</strong> следующий:  необходимо дочитать до конца файла, а потом прочитать еще один или более символов/байт за пределами файла, и только после этого <strong>feof()</strong> поймет что файл всетаки кончился.</p>
<p>Оказывается об этом люди знали еще в 2005 году, однако никакого намека в мануале PHP найти не удалось. Есть даже заявление на исправление ошибки в <a href="http://bugs.php.net/bug.php?id=35136" target="_blank">баг-трейсе</a>, однако по комментарию одного из разработчиков становится понятно, что это скорее фича языка, чем баг.</p>
<p>Особенно эта фича рулит при работе с бинарными файлами, где каждый байт на счету. <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Будте внимательны, фичи на каждом шагу! <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/feof-ne-znaet-o-konce-fajla.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как избавиться от внешних ссылок в WordPress</title>
		<link>http://tracker2k.kiev.ua/kak-izbavitsya-ot-vneshnix-ssylok-v-wordpress.html</link>
		<comments>http://tracker2k.kiev.ua/kak-izbavitsya-ot-vneshnix-ssylok-v-wordpress.html#comments</comments>
		<pubDate>Sun, 20 Jan 2008 19:41:13 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[noindex]]></category>
		<category><![CDATA[redirect]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[внешние ссылки]]></category>
		<category><![CDATA[ссылки]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/kak-izbavitsya-ot-vneshnix-ssylok-v-wordpress.html</guid>
		<description><![CDATA[Спросил меня недавно NOMAD &#8220;Как избавиться от ВС в комментариях&#8221;, решил поделиться опытом, как это сделать в WordPress. Первое что важно запомнить, это то что ссылки на комментаторов нельзя ни в коем случае удалять, это признак плохого тона автора блога. Удаляя ссылку вы разрушаете связь с комментатором. Вместо этого ссылку можно немного модифицировать, отправив ее, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html#comments" target="_blank">Спросил</a> меня недавно NOMAD &#8220;Как избавиться от ВС в комментариях&#8221;, решил поделиться опытом, как это сделать в WordPress.</p>
<p>Первое что важно запомнить, это то что ссылки на комментаторов нельзя ни в коем случае удалять, это признак плохого тона автора блога. Удаляя ссылку вы разрушаете связь с комментатором. Вместо этого ссылку можно немного модифицировать, отправив ее, например, через скрипт переадресации. Таким образом Внешний Адрес будет находится как-бы в вашем домене, и как Внешняя Ссылка учитываться не будет.</p>
<p>О том как сделать скрипт переадресации я писал в этом посте: <a href="http://tracker2k.kiev.ua/ubiraem-vneshnie-ssylki.html" target="_blank">Убираем внешние ссылки</a>. Сделать нужно все что написано в посте, вплоть до запрета его индексации в <strong>robots.txt</strong>.</p>
<p>Как только скрипт готов идем в папку с темплейтом вашего блога, к примеру &#8220;<strong>/wp-content/themes/default/</strong>&#8221; находим файл &#8220;<strong>functions.php</strong>&#8221; и редактируем его.</p>
<p>Перед тем как перейти непосредственно к редактированию, разберем основные источники ВС в блоге на WordPress и методы борьбы с ними.</p>
<p>И так первый источник ВС это ссылки на автора темы. Обычно они расположен в футере (<strong>footer.php</strong>), но бывают и исключения, поэтому первым делом следует прошерстить темплейт на их наличие. Бороться с ними не сложно. Такие ссылки можно просто взять в &#8220;<strong>&lt;noindex&gt;</strong>&#8220;, примерно так:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;noindex&gt;Powered by &lt;a href=&quot;http://wordpress.org/&quot;&gt;WordPress&lt;/a&gt;&lt;/noindex&gt;</pre></div></div>

<p>Все что попадает в &#8220;<strong>&lt;noindex&gt;</strong>&#8221; не будет учитываться роботом Яндекса, поэтому с этим тегом нужно быть по осторожнее.</p>
<p>Со статическими ВС разобрались, теперь приступим к динамическим. Осталось несколько мест где могут появляться ВС, это: посты (содержание постов), комментарии и sidebar (их может быть несколько и называться они могут по разному, но это сути не меняет). Теперь перейдем непосредственно к редактированию &#8220;<strong>functions.php</strong>&#8221; о котором я писал выше.</p>
<p>Начнем с Постов. Чтобы избавиться от ВС в содержании поста необходимо поставить фильтр на &#8220;the_content&#8221;. Система фильтров в WordPress очень хорошо развита и позволяет фильтровать практически все что угодно. Итак ставим фильтр:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_content'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Вторым параметром к <strong>add_filter</strong> мы указываем функци, которая и будет фильтровать текст. Собственно код функции:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> preg_callback2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'http'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'https'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$need</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$replace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua/redirect.php?&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$need</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$need</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$replace</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> removeLinks<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> is_feed<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace_callback</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@(]*href=&quot;)([^&gt;\&quot;]*)(&quot;[^&gt;]*&gt;)@i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;preg_callback2&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace_callback</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@(]*href=\')([^&gt;\&quot;]*)(\'[^&gt;]*&gt;)@i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;preg_callback2&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Для замены ссылок я использовал регулярные выражения, поэтому добавилась еще одна функция обратного вызова. Чтобы адаптировать под себя вам следует заменить всего два параметра в функции <strong>preg_callback2</strong>, а именно <strong>$need</strong> и <strong>$replace</strong>. В $need следует указать полный адрес вашего сайта без слеша в конце, а в $replace путь в redirect.php со знаком вопроса (&#8220;<strong>?</strong>&#8220;) в конце. В принципе с постами мы закончили.</p>
<p>Теперь перейдем к комментариям. С ними, в принципе, дела обстоят точно также. Следует отфильтровать всего три &#8211; четыре параметра, с использованием описанной выше функции. Другими словами к написанному выше следует дописать:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment_text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_comment_author_link'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_comment_author_url_link'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment_url'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Идем дальше. Следующим пунктом идет sidebar. С ним сложнее всего. С сайдбаре может быть множество виджетов генерируемых другими плагинами, которые в свою очередь генерируют ВС. Однако весь сайдбар ставить в &lt;noindex&gt; было бы ошибкой, так как можно лишится индексации многих страниц и разделов. Я расскажу о тех Виджетах с которыми работал.</p>
<p>Проше всего бороться с ВС у виджета <strong>Text</strong>, в нем у меня лежали каунтеры, кнопки и пр. Тут всеголишь следует добавить в начало и конец кода в Виджете &#8220;<strong>&lt;noindex&gt;</strong>&#8221; и &#8220;<strong>&lt;/noindex&gt;</strong>&#8221; соответственно. Далее виджет <strong>Links</strong>, он используется для генерации <strong>Blogroll</strong>. Тут необходимо установить еще один фильтр и написать еще одну функцию:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> removeLinks_Blogroll<span style="color: #009900;">&#40;</span><span style="color: #000088;">$p1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$p1</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua/redirect.php?&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link_url</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$p1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
&nbsp;
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_bookmarks'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks_Blogroll'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Подразумевается, что в <strong>Blogroll </strong>все ссылки Внешние, поэтому их проверка не производится. Чтобы адаптировать под себя, следует заменить &#8220;<strong>http://tracker2k.kiev.ua/redirect.php?</strong>&#8221; на то же значения что и <strong>$replace</strong> в <strong>preg_callback2</strong>. Также генерировать ВС может виджет <strong>Meta</strong>, вместо него я использую собственный, заменяющий его. Чтобы внести изменения в остальные виджеты генерирующие ВС необходимо править код WordPress, что весьма не хорошо. Некоторые виджеты, работающие на базе дополнительных плагинов дают возможность вставлять свои теги в свои начало и конец, например <strong>Flickr</strong>.<br />
Собственно все.</p>
<p>В итоге у вас должен получиться следующий код:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> preg_callback2<span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'http'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$url</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'https'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$need</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$replace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua/redirect.php?&quot;</span><span style="color: #339933;">;</span> 
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$need</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$need</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$replace</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> removeLinks<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> is_feed<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace_callback</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@(]*href=&quot;)([^&gt;\&quot;]*)(&quot;[^&gt;]*&gt;)@i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;preg_callback2&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace_callback</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'@(]*href=\')([^&gt;\&quot;]*)(\'[^&gt;]*&gt;)@i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;preg_callback2&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
&nbsp;
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_content'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment_text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_comment_author_link'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_comment_author_url_link'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'comment_url'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> removeLinks_Blogroll<span style="color: #009900;">&#40;</span><span style="color: #000088;">$p1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$p1</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://tracker2k.kiev.ua/redirect.php?&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link_url</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$p1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> 
&nbsp;
add_filter<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'get_bookmarks'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'removeLinks_Blogroll'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/kak-izbavitsya-ot-vneshnix-ssylok-v-wordpress.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Определение браузера и ОС клиента</title>
		<link>http://tracker2k.kiev.ua/opredelenie-brauzera-i-os-klienta.html</link>
		<comments>http://tracker2k.kiev.ua/opredelenie-brauzera-i-os-klienta.html#comments</comments>
		<pubDate>Sun, 18 Nov 2007 15:51:34 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[browscap]]></category>
		<category><![CDATA[browser detection]]></category>
		<category><![CDATA[get_browser]]></category>
		<category><![CDATA[user agent]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/blog/126-opredelenie-brauzera-i-os-klienta.html</guid>
		<description><![CDATA[В PHP есть встроенная функция get_browser(), которая позволяет определить каким browser&#8217;ом пользуется клиент. mixed get_browser &#40; &#91;string $user_agent &#91;, bool $return_array&#93;&#93; &#41; Все бы было хорошо, но данная функция привязана к INI файлу (browscap.ini), который не поставляется в стандартной сборке PHP, требует определенной настройки и периодического обновления INI файла, содержащего информация о браузерах. Все это [...]]]></description>
			<content:encoded><![CDATA[<p>В PHP есть встроенная функция <a TARGET="_blank" HREF="http://php.net/manual/en/function.get-browser.php">get_browser()</a>, которая позволяет определить каким browser&#8217;ом пользуется клиент.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">mixed <span style="color: #990000;">get_browser</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#91;</span>string <span style="color: #000088;">$user_agent</span> <span style="color: #009900;">&#91;</span><span style="color: #339933;">,</span> bool <span style="color: #000088;">$return_array</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span></pre></div></div>

<p>Все бы было хорошо, но данная функция привязана к INI файлу (<a TARGET="_blank" HREF="http://browsers.garykeith.com/downloads.asp">browscap.ini</a>), который не поставляется в стандартной сборке PHP, требует определенной настройки и периодического обновления INI файла, содержащего информация о браузерах. Все это обычно не работает на хостингах, а если и работает, то <strong>browscap.ini</strong>, скорее всего, очень древний и толку от него мало.</p>
<p>В поисках решения я обнаружил интересный проект Джонатана Стоппани &#8220;<a TARGET="_blank" HREF="http://garetjax.info/projects/browscap/">Browser Capabilities PHP Project</a>&#8220;. Автор проекта написал класс который служит заменой функции <strong>get_browser()</strong>. Класс называется <strong>Browscap</strong> и позволяет подключить browscap.ini <strong>динамически</strong>, он преобразует browscap.ini в понятный для PHP массив и далее работает с уже ним, но коме этого он умеет автоматически производить обновление библиотеки browscap.ini через определенный промежуток времени.</p>
<p>Кроме всего выше перечисленного класс позволяет определить такие данные о браузере клиента как Платформу (ОС), Поддержку Java и JavaScript, Робот ли клиент (Google, Yandex) и много другого.</p>
<p>Пример:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Loads the class </span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'Browscap/Browscap.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Creates a new Browscap object (loads or creates the cache) </span>
<span style="color: #000088;">$bc</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Browscap<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Browscap/cache'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #666666; font-style: italic;">// Gets information about the current browser's user agent </span>
<span style="color: #000088;">$current_browser</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$bc</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBrowser</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;">// Output the result </span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$current_browser</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Результат выполнения:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">Array</span>
<span style="color: #009900;">&#40;</span>
    <span style="color: #009900;">&#91;</span>browser_name<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Opera<span style="color: #339933;">/</span><span style="color:#800080;">9.23</span> <span style="color: #009900;">&#40;</span>Windows NT <span style="color:#800080;">5.1</span><span style="color: #339933;">;</span> U<span style="color: #339933;">;</span> ru<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#91;</span>browser_name_regex<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> ^opera<span style="color: #339933;">/</span><span style="color: #cc66cc;">9</span>\<span style="color: #339933;">.</span>2<span style="color: #339933;">.*</span> \<span style="color: #009900;">&#40;</span>windows nt <span style="color: #cc66cc;">5</span>\<span style="color: #339933;">.</span>1<span style="color: #339933;">.*</span>\<span style="color: #009900;">&#41;</span><span style="color: #339933;">.*</span>$
    <span style="color: #009900;">&#91;</span>browser_name_pattern<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Opera<span style="color: #339933;">/</span><span style="color:#800080;">9.2</span><span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span>Windows NT <span style="color:#800080;">5.1</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span>
    <span style="color: #009900;">&#91;</span>Parent<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Opera <span style="color:#800080;">9.2</span>
    <span style="color: #009900;">&#91;</span>Platform<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> WinXP
    <span style="color: #009900;">&#91;</span>Win32<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>Browser<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> Opera
    <span style="color: #009900;">&#91;</span>Version<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color:#800080;">9.2</span>
    <span style="color: #009900;">&#91;</span>MajorVer<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">9</span>
    <span style="color: #009900;">&#91;</span>MinorVer<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span>
    <span style="color: #009900;">&#91;</span>Frames<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>IFrames<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>Tables<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>Cookies<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>BackgroundSounds<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>JavaApplets<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>JavaScript<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>CSS<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span>
    <span style="color: #009900;">&#91;</span>CssVersion<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span>
    <span style="color: #009900;">&#91;</span>supportsCSS<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span>
    <span style="color: #009900;">&#91;</span>Alpha<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>Beta<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>Win16<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>Win64<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>AuthenticodeUpdate<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>CDF<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>VBScript<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>ActiveXControls<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>Stripper<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>isBanned<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>WAP<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>isMobileDevice<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>isSyndicationReader<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>Crawler<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>AOL<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>aolVersion<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
    <span style="color: #009900;">&#91;</span>netCLR<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> 
    <span style="color: #009900;">&#91;</span>ClrVersion<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
<span style="color: #009900;">&#41;</span></pre></div></div>

<p>Browscap качаем тут: <a TARGET="_blank" HREF="http://garetjax.info/projects/browscap/#download">http://garetjax.info/projects/browscap/#download</a><br />
Сам browscap.ini можно взять тут: <a TARGET="_blank" HREF="http://browsers.garykeith.com/downloads.asp">http://browsers.garykeith.com/downloads.asp</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/opredelenie-brauzera-i-os-klienta.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Убираем внешние ссылки</title>
		<link>http://tracker2k.kiev.ua/ubiraem-vneshnie-ssylki.html</link>
		<comments>http://tracker2k.kiev.ua/ubiraem-vneshnie-ssylki.html#comments</comments>
		<pubDate>Sat, 17 Nov 2007 12:25:44 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[sape.ru]]></category>
		<category><![CDATA[внешние ссылки]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/blog/125-ubiraem-vneshnie-ssylki.html</guid>
		<description><![CDATA[Недавно писал про искоренение &#8220;ссылок через скрипт-редирект&#8221; непосредственно в браузере конечного пользователя. Теперь же хочу написать про совсем маленький скрипт который осуществляет этот редирект и помогает избавиться от внешних ссылок. Применяют такой скрипт в определенных случаях, например: при искоренение внешних ссылок в случае их продажи, например в sape.ru, при подсчет кликов по ссылкам (при клике [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно <a HREF="http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html" TARGET="_blank">писал</a> про искоренение &#8220;ссылок через скрипт-редирект&#8221; непосредственно в браузере конечного пользователя. Теперь же хочу написать про совсем маленький скрипт который осуществляет этот редирект и помогает избавиться от внешних ссылок.</p>
<p>Применяют такой скрипт в определенных случаях, например: при искоренение внешних ссылок в случае их продажи, например в <a HREF="http://www.sape.ru/r.f9a51c268c.php" TARGET="_blank">sape.ru</a>, при подсчет кликов по ссылкам (при клике сначала статистические данные заносятся в БД, после чего осуществляется переадресация на нужный ресурс).</p>
<p>А сам скрипт совсем маленький, фактически вот он:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>
<span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;QUERY_STRING&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;QUERY_STRING&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$uri</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>И все <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Файл называется <strong>redirect.php</strong> и  находится в корне вашего сайта (чтобы к нему было легче обращаться).</p>
<p>Обращаться же к нему необходимо следующим образом: если нужно сделать переадресацию на <strong>http://google.com</strong>, то необходимо указать следующий адрес в ссылке:</p>
<p><strong>http://yoursite.com/redirect.php?http://www.google.com</strong>.</p>
<p>Если вы используете <a TARGET="_blank" HREF="http://www.sape.ru/r.f9a51c268c.php">sape.ru</a>, то это не запрещено их правилами и хорошо действует для избавления от внешних ссылок, но стоит также помнить, что такие ссылки очень плохо индексируются роботами (Google, Yandex), поэтому к ним лучше запретить доступ роботов через файл <strong>robots.txt</strong> со следующим содержанием:</p>
<pre>
User-Agent: *
Disallow: /redirect.php</pre>
<p>Это значит что все ссылки которые начинаются с &#8220;<strong>/redirect.php</strong>&#8221; роботом обрабатываться не будут.</p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/ubiraem-vneshnie-ssylki.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Приводим внешние ссылки в человеческий вид</title>
		<link>http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html</link>
		<comments>http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html#comments</comments>
		<pubDate>Thu, 15 Nov 2007 10:41:21 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[внешние ссылки]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/blog/122-privodim-vneshnie-ssylki-v-chelovecheskij-vid.html</guid>
		<description><![CDATA[Сейчас на разных сайтах часто можно заметить ссылки на внешние ресурсы через какой-то внутренний скрипт, например такие: http://tracker2k.kiev.ua/redirect.php?http://google.com Причины делать такие ссылки у каждого свои: кто-то продает место под ссылки в sape.ru или еще где-то и экономит внешние ссылки, кто-то не хочет, чтобы их индексировали роботы, кто-то считает переходы. В моем случае ссылки продаются в [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас на разных сайтах часто можно заметить ссылки на внешние ресурсы через какой-то внутренний скрипт, например такие:  <strong>http://tracker2k.kiev.ua/redirect.php?http://google.com</strong></p>
<p>Причины делать такие ссылки у каждого свои: кто-то продает место под ссылки в <a HREF="http://www.sape.ru/r.f9a51c268c.php" TARGET="_blank">sape.ru</a> или еще где-то и экономит внешние ссылки, кто-то не хочет, чтобы их индексировали роботы, кто-то считает переходы. В моем случае ссылки продаются в <a HREF="http://www.sape.ru/r.f9a51c268c.php" TARGET="_blank">sape.ru</a> <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  и, честно говоря, меня не устраивал их внешний вид в браузере, и я решил это дело исправить и написал простенький скрипт на JavaScript с использованием<a HREF="http://jquery.com/" TARGET="_blank"> jQuery</a> и вставил его в header.php (шаблон верхней части страницы в WordPress&#8217;е).</p>
<p>Сам код выглядит так:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script TYPE<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>   
$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>   
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">each</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>  
    <span style="color: #003366; font-weight: bold;">var</span> remove_str <span style="color: #339933;">=</span> <span style="color: #3366CC;">'http://tracker2k.kiev.ua/redirect.php?'</span><span style="color: #339933;">;</span>  
    <span style="color: #003366; font-weight: bold;">var</span> str <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">href</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> remove_str.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>str <span style="color: #339933;">==</span> remove_str<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  
      <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">href</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">href</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>remove_str.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
    <span style="color: #009900;">&#125;</span>  
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Работает это так: как только страница загрузилась мы ищем все ссылки на странице которые начинаются с <strong>remove_str</strong>, после чего удаляем из них <strong>remove_str</strong>. И все <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>В итоге получаем, уменьшение количества внешних ссылок за счет использования вашего внутреннего скрипта и человеческий вид ссылок в браузере за счет моего скрипта <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Конечно это не применимо для подсчета переходов, потому что как только ссылка в браузере будет изменена переход будет осуществляться напрямую, а не через ваш скрипт.</p>
<p>Чтобы использовать у себя, в <strong>remove_str</strong> нужно указать с чего начинается ссылка, этот текст впоследствии будет из нее удален. Остальное можно оставить как есть и использовать. Код вставляется в тело HTML, то есть сразу после тега BODY.</p>
<p>Единственный замеченный минус – код не всегда до конца выполняется в Internet Explorer&#8217;е.</p>
<p>Возможно <a HREF="http://apazhe.net" TARGET="_blank">Арсений Фёдоров</a> заинтересуется <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/privodim-vneshnie-ssylki-v-chelovecheskij-vid.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Рисуем в чужом Direct3D приложении</title>
		<link>http://tracker2k.kiev.ua/5.html</link>
		<comments>http://tracker2k.kiev.ua/5.html#comments</comments>
		<pubDate>Thu, 31 May 2007 12:26:13 +0000</pubDate>
		<dc:creator>TracKer</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[direct3d]]></category>
		<category><![CDATA[directx]]></category>
		<category><![CDATA[hook]]></category>

		<guid isPermaLink="false">http://tracker2k.kiev.ua/blog/?p=5</guid>
		<description><![CDATA[Однажды я нашел такую программу как Fraps, она рисовала счетчик FPS в приложениях DirectX. Мне захотелось написать что-то подобное. И вот что у меня получилось&#8230; Что нужно иметь для работы: http://madshi.net/ &#8211; madCodeHook из madCollection, для перехвата вызовов DirectX и не только http://sourceforge.net/projects/delphi-dx9sdk &#8211; Новые заголовки DirectX 9 для Delphi http://www.mirgames.ru/articles/directx/dxtutorial.html &#8211; И обязательно прочитать [...]]]></description>
			<content:encoded><![CDATA[<p>Однажды я нашел такую программу как Fraps, она рисовала счетчик FPS в приложениях DirectX. Мне захотелось написать что-то подобное. И вот что у меня получилось&#8230;<br />
Что нужно иметь для работы:</p>
<ul>
<li><a href="http://madshi.net">http://madshi.net/</a> &#8211; <strong>madCodeHook</strong> из <strong>madCollection</strong>, для перехвата вызовов <strong>DirectX</strong> и не только</li>
<li><a href="http://sourceforge.net/projects/delphi-dx9sdk">http://sourceforge.net/projects/delphi-dx9sdk</a> &#8211; Новые заголовки <strong>DirectX 9</strong> для <strong>Delphi</strong></li>
<li><a href="http://www.mirgames.ru/articles/directx/dxtutorial.html">http://www.mirgames.ru/articles/directx/dxtutorial.html</a> &#8211; И обязательно прочитать эту статью чтобы именть какое-то представление о работе <strong>DirectX</strong> <img src='http://tracker2k.kiev.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>И так, приступим.</p>
<p>Попробуем написать какой-то текст в чужем приложении. Для этого на нужно кстановить перехватчик (hook или хук) на вызовы трех функций, нужных нам для отрисовки нашего текста. Но сделать это не так просто. Для того чтобы выполнить наш програмный код в чужем приложении необходимо создать DLL с этим кодом и провести так называемую &#8220;DLL инъекцию&#8221; (DLL Injection). Для этого необходимо создать приостановленый процесс (запустьть наше DirectX приложение вызовом <strong>CreateProcessA</strong> с флагом <strong>CREATE_SUSPENDED</strong>), далее Инджектировать нашу DLL в процесс (вызов <strong>InjectLibraryA</strong>), и продолжить выполнение нашего процесса (вызов <strong>ResumeThread</strong>).<br />
Код:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">uses</span> Direct3D9<span style="color: #000066;">,</span> madCodeHook<span style="color: #000066;">;</span>procedure TForm1<span style="color: #000066;">.</span><span style="color: #006600;">Button1Click</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> start<span style="color: #000066;">:</span> TStartupInfo<span style="color: #000066;">;</span> procInfo<span style="color: #000066;">:</span> TProcessInformation<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  ZeroMemory<span style="color: #000066;">&#40;</span><span style="color: #000066;">@</span>start<span style="color: #000066;">,</span> <span style="color: #000066;">SizeOf</span><span style="color: #000066;">&#40;</span>start<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  start<span style="color: #000066;">.</span><span style="color: #006600;">cb</span><span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #000066;">SizeOf</span><span style="color: #000066;">&#40;</span>Start<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span> CreateProcessA<span style="color: #000066;">&#40;</span>
    <span style="color: #ff0000;">'E:\Games\Lineage II\system\l2.exe'</span><span style="color: #000066;">,</span>
    <span style="color: #ff0000;">''</span><span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">True</span><span style="color: #000066;">,</span> CREATE_SUSPENDED<span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span>
    <span style="color: #ff0000;">'E:\Games\Lineage II\system'</span><span style="color: #000066;">,</span>
    start<span style="color: #000066;">,</span> procInfo<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000000; font-weight: bold;">not</span> InjectLibraryA<span style="color: #000066;">&#40;</span>
    procInfo<span style="color: #000066;">.</span><span style="color: #006600;">hProcess</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'my_lib.dll'</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
    ShowMessage<span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'failed'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    ResumeThread<span style="color: #000066;">&#40;</span>procInfo<span style="color: #000066;">.</span><span style="color: #006600;">hThread</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre></div></div>

<p>Теперь, что качается самой DLL. Первым делом нужно установить хук на вызов <strong>Direct3DCreate9</strong> из<strong> d3d9.dll.</strong> Далее нужно установить хук на создание <strong>D3DDevice, </strong>потом на метод интерфейса <strong>IDirect3D9.CreateDevice</strong> (тут также необходимо произвести инициализацию шрифта которым мы будим писать текст), и наконец на метод интерфейса <strong>IDirect3DDevice9.EndScene</strong> (тут мы будим писать текст).<br />
Код:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">library</span> my_lib<span style="color: #000066;">;</span>uses
  SysUtils<span style="color: #000066;">,</span> Classes<span style="color: #000066;">,</span> madCodeHook<span style="color: #000066;">,</span>
  Windows<span style="color: #000066;">,</span> Direct3D9<span style="color: #000066;">,</span> D3DX9<span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span>
  D3DObj<span style="color: #000066;">:</span> IDirect3D9<span style="color: #000066;">;</span>
  D3DDev<span style="color: #000066;">:</span> IDirect3DDevice9<span style="color: #000066;">;</span>
  g_Font<span style="color: #000066;">:</span> ID3DXFont<span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> GetInterfaceMethod<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> intf<span style="color: #000066;">;</span> methodIndex<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">dword</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">dword</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">&#40;</span>intf<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> methodIndex <span style="color: #000066;">*</span> <span style="color: #0000ff;">4</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> EndScene9Next <span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> HResult <span style="color: #000000; font-weight: bold;">stdcall</span> <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> CreateDevice9Next <span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Pointer</span><span style="color: #000066;">;</span> Adapter<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">LongWord</span><span style="color: #000066;">;</span>
        DeviceType<span style="color: #000066;">:</span> TD3DDevType<span style="color: #000066;">;</span> hFocusWindow<span style="color: #000066;">:</span> HWND<span style="color: #000066;">;</span> BehaviorFlags<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">DWord</span><span style="color: #000066;">;</span>
        pPresentationParameters<span style="color: #000066;">:</span> PD3DPresentParameters<span style="color: #000066;">;</span>
        out ppReturnedDeviceInterface<span style="color: #000066;">:</span> IDirect3DDevice9<span style="color: #000066;">&#41;</span> <span style="color: #000066;">:</span> HRESULT <span style="color: #000000; font-weight: bold;">stdcall</span> <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span> Direct3DCreate9Next<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000066;">&#40;</span>SDKVersion<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">LongWord</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">DWORD</span> <span style="color: #000000; font-weight: bold;">stdcall</span> <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> EndScene9Callback<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> HResult<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">stdcall</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  TextRect<span style="color: #000066;">:</span> TRect<span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  TextRect <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Rect</span><span style="color: #000066;">&#40;</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  g_Font<span style="color: #000066;">.</span><span style="color: #006600;">DrawTextA</span><span style="color: #000066;">&#40;</span>
    <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Превед!!! :)'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span>
    <span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>TextRect<span style="color: #000066;">,</span>
    DT_LEFT <span style="color: #000000; font-weight: bold;">or</span> DT_NOCLIP<span style="color: #000066;">,</span>
    D3DCOLOR_RGBA<span style="color: #000066;">&#40;</span><span style="color: #9ac;">$00</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">&#41;</span>
  <span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  Result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>EndScene9Next<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> CreateDevice9Callback<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">pointer</span><span style="color: #000066;">;</span> Adapter<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">LongWord</span><span style="color: #000066;">;</span> DeviceType<span style="color: #000066;">:</span> TD3DDevType<span style="color: #000066;">;</span>
  hFocusWindow<span style="color: #000066;">:</span> HWND<span style="color: #000066;">;</span> BehaviorFlags<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">DWord</span><span style="color: #000066;">;</span> pPresentationParameters<span style="color: #000066;">:</span> PD3DPresentParameters<span style="color: #000066;">;</span>
  out ppReturnedDeviceInterface<span style="color: #000066;">:</span> IDirect3DDevice9<span style="color: #000066;">&#41;</span> <span style="color: #000066;">:</span> HRESULT<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">stdcall</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">var</span>
  A<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CreateDevice9Next<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #000066;">,</span> adapter<span style="color: #000066;">,</span> DeviceType<span style="color: #000066;">,</span> hFocusWindow<span style="color: #000066;">,</span> BehaviorFlags<span style="color: #000066;">,</span>
    pPresentationParameters<span style="color: #000066;">,</span> ppReturnedDeviceInterface<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  D3DDev <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ppReturnedDeviceInterface<span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>result <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    A <span style="color: #000066;">:</span><span style="color: #000066;">=</span> D3DXCreateFont<span style="color: #000066;">&#40;</span>
      D3DDev<span style="color: #000066;">,</span> <span style="color: #0000ff;">100</span><span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> FW_BOLD<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">,</span>
      <span style="color: #000000; font-weight: bold;">false</span><span style="color: #000066;">,</span> DEFAULT_CHARSET<span style="color: #000066;">,</span>
      OUT_DEFAULT_PRECIS<span style="color: #000066;">,</span>
      ANTIALIASED_QUALITY<span style="color: #000066;">,</span>
      DEFAULT_PITCH <span style="color: #000000; font-weight: bold;">or</span> FF_DONTCARE<span style="color: #000066;">,</span>
      <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Arial'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span>
      g_Font
    <span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    HookCode<span style="color: #000066;">&#40;</span>GetInterfaceMethod<span style="color: #000066;">&#40;</span>ppReturnedDeviceInterface<span style="color: #808080; font-style: italic;">{^}</span><span style="color: #000066;">,</span> <span style="color: #0000ff;">42</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span>
      <span style="color: #000066;">@</span>EndScene9Callback<span style="color: #000066;">,</span> <span style="color: #000066;">@</span>EndScene9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> Direct3DCreate9Callback<span style="color: #000066;">&#40;</span>SDKVersion<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">LongWord</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">DWORD</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">stdcall</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">begin</span>
  Result<span style="color: #000066;">:</span><span style="color: #000066;">=</span>Direct3DCreate9Next<span style="color: #000066;">&#40;</span>SDKVersion<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  D3DObj <span style="color: #000066;">:</span><span style="color: #000066;">=</span> IDirect3D9<span style="color: #000066;">&#40;</span>Result<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>Result &amp;lt<span style="color: #000066;">;</span>&amp;gt<span style="color: #000066;">;</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #000000; font-weight: bold;">begin</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span><span style="color: #000066;">@</span>CreateDevice9Next <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span>
      UnhookCode<span style="color: #000066;">&#40;</span><span style="color: #000066;">@</span>CreateDevice9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
    HookCode<span style="color: #000066;">&#40;</span>GetInterfaceMethod<span style="color: #000066;">&#40;</span>result<span style="color: #000066;">,</span> <span style="color: #0000ff;">16</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>CreateDevice9Callback<span style="color: #000066;">,</span> <span style="color: #000066;">@</span>CreateDevice9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
  <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">begin</span>
  HookAPI<span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'d3d9.dll'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Direct3DCreate9'</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>Direct3DCreate9Callback<span style="color: #000066;">,</span> <span style="color: #000066;">@</span>Direct3DCreate9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">.</span></pre></div></div>

<p>Первое что выполняется в DLL, это:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">HookAPI<span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'d3d9.dll'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Direct3DCreate9'</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>Direct3DCreate9Callback<span style="color: #000066;">,</span> <span style="color: #000066;">@</span>Direct3DCreate9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></pre></div></div>

<p>Эта функция осущесвляет перехват функции <strong>Direct3DCreate9</strong>, находящейся в библиотеке <strong>d3d9.dll</strong> и заменяет ее на вызов функции <strong>Direct3DCreate9Callback</strong> (которая описана выше в коде). Подробнее об этой функции можно узнать тут: <a href="http://help.madshi.net/ApiCodeHooking.htm">http://help.madshi.net/ApiCodeHooking.htm</a><br />
После этого мы ждем когда главное приложение вызовет <strong>Direct3DCreate9</strong> и сработает <strong>Direct3DCreate9Callback</strong>. В <strong>Direct3DCreate9Callback </strong>мы вызываем настоящую функцию, указатель на которую хранится в переменной <strong>Direct3DCreate9Next</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Direct3DCreate9Next<span style="color: #000066;">&#40;</span>SDKVersion<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></pre></div></div>

<p>В результате этого мы получаем указатель на интерфейс <strong>IDirect3D9</strong>, а именно объект <strong>D3DObj</strong>. Теперь нас интересует процесс создания <strong>IDirect3DDevice9</strong>, для этого мы ставим хук на метод <strong>IDirect3D9.CreateDevice</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">HookCode<span style="color: #000066;">&#40;</span>GetInterfaceMethod<span style="color: #000066;">&#40;</span>result<span style="color: #000066;">,</span> <span style="color: #0000ff;">16</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>CreateDevice9Callback<span style="color: #000066;">,</span> <span style="color: #000066;">@</span>CreateDevice9Next<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></pre></div></div>

<p>В качестве медода мы пишем не его название, а его порядковый номер в объявлении, в данном случае <strong>16</strong>. Ниже на рисунке показан пример с нумерацией.</p>
<p style="text-align: center"><img src="http://tracker2k.kiev.ua/wp-content/uploads/2007/06/interface_methods_small.png" alt="interface_methods_small.png" /></p>
<p>Теперь мы ждем вызова <strong>CreateDevice9Callback</strong>. Как только это происходит мы делаем вызов самой функции <strong>Direct3DCreate9Next</strong>, и получаем объект <strong>D3DDev</strong>, после этого создаем объект шрифта <strong>g_Font</strong> вызовом <strong>D3DXCreateFont</strong>. Паремтры этой функции более подробно можно узнать тут: <a href="http://msdn2.microsoft.com/en-us/library/bb172773.aspx">http://msdn2.microsoft.com/en-us/library/bb172773.aspx</a></p>
<p>И тут же ставим хук на вызов метода <strong>IDirect3DDevice9.EndScene</strong>, он имеет номер <strong>42</strong>.</p>
<p>Все приготовления завершены. Теперь мы ждем вызова <strong>EndScene9Callback</strong>. В этой функции мы осуществляем сам процесс рисования следующим вызовом:</p>

<div class="wp_syntax"><div class="code"><pre class="delphi" style="font-family:monospace;">TextRect <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Rect</span><span style="color: #000066;">&#40;</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">,</span><span style="color: #0000ff;">100</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span>
g_Font<span style="color: #000066;">.</span><span style="color: #006600;">DrawTextA</span><span style="color: #000066;">&#40;</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'Превед!!! :)'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">,</span> <span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">,</span>
  <span style="color: #000066;">@</span>TextRect<span style="color: #000066;">,</span> DT_LEFT <span style="color: #000000; font-weight: bold;">or</span> DT_NOCLIP<span style="color: #000066;">,</span>
  D3DCOLOR_RGBA<span style="color: #000066;">&#40;</span><span style="color: #9ac;">$00</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">,</span> <span style="color: #9ac;">$ff</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span></pre></div></div>

<p>Подробную информацию об этой функции можно прочесть тут:<br />
<a href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c_Feb_2006/ID3DXFont__DrawText.asp">MSDN Help</a></p>
<p>Пример работы программы:<br />
<a href="http://tracker2k.kiev.ua/_public/blog/directx_dll_injection/shot00004.jpg">shot00004.jpg</a></p>
<p>Ну и собственно работающий Исходник:<br />
<a href="http://tracker2k.kiev.ua/_public/blog/directx_dll_injection/directx_dll_injection_src.rar">directx_dll_injection_src.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tracker2k.kiev.ua/5.html/feed</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
	</channel>
</rss>

