как написать граббер

<?php
/*
*Как написать граббер.
*автор: nc_soft
*28.09.07
*/

/*
Любой граббер для удобства можно разделить на ТРИ оcновных части-этапа:
-получение
-обработка
-выдача

Получение.
Для того, что бы граббер нормально функционировал необходимо написать функцию для получнения
страницы с удаленного хоста по заданному url, надежнее пользоваться сокетами
(потому что библиотека CURL установлена не везде и не всегда, использовать file_get_contents()
и комбинации implode('',file(..)) конечно тоже можно, просто сокет предоставляет побольше возможностей.
Напишем функцию получния страницы по урл.
*/

function data($path,$host)
{
    /*
    $path путь к файлу скрипта, а так же передаваемые параметры
    $host сграббливаемый хост (например, sasisa.ru)
    */
    $fp = fsockopen($host, 80);
    if (!$fp)
    {
        die('ошибка');
    }
    else
    {
        $out = "GET $path HTTP/1.0\r\n";
        $out .= "Accept: image/gif, application/xhtml+xml, */*\r\n";
        $out .= "Accept-Language: ru\r\n";
        $out .= "Host: $host\r\n";

        //прикинемся оперой-мини
        $out .= "User-Agent: Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n";

        $out .= "Cache-Control: no-cache\r\n";
        $out .= "Connection: Close\r\n\r\n";

        fwrite($fp, $out);
        $headers = "";

        while ($str = trim(fgets($fp)))
        $headers .= "$str\n";

        $body = "";

        while (!feof($fp))
        $body .= fgets($fp);
        fclose($fp);
    }
    //возвращаем данные
    return $body;
}

/*
Итак, функция для получения страницы готова, теперь составим функцию для обработки данных, тоесть для
выреза рекламы, подмены ссылок итп
*/

/*
function process($s)
{
Здесь сложно дать какие-то рекоммендации, все "грабберописание" состоит в основном в
придумывании этой функции, сделаем пока что "заглушку" на этом месте

return $s;
}
*/

/*
Для корректной работы грабба необходимо теперь правильно определять переменную $path, для примера давайте граббить
всем известный http://wen.ru/forum/index.php
пример очень характерный, потому что многие "потенциальные жертвы" грабов (загруз центры например)
состоят как раз из одного файла
*/

//с хостом определились
$host='wen.ru';

if (empty($_SERVER['QUERY_STRING']))
{
    //начальная позиция
    $path='/forum/index.php';
}
else
{
    //новые параметры
    $path='/forum/?'.$_SERVER['QUERY_STRING'];
}

/*
теперь необходимо зайти на страницу форума и посмотреть ее в коде
видно что ссылки выдаются так
<a href="/forum/?p=1&f=1&w=htm">Общение</a>
для работы грабба достаточно изменить ссылку так
<a href="index.php?p=1&f=1&w=htm">Общение</a>
что и сделаем в функции process
*/


/*function process($s)
{
$s=str_replace('<a href="/forum/','<a href="index.php',$s);
return $s;
}*/

//можно в принципе запускать :) (ПЕРВЫЙ ЭТАП)
$s=data($path,$host);

//обрабатываем (ВТОРОЙ ЭТАП)
$s=process($s);

//выдаем результат (ТРЕТИЙ ЭТАП)
/*
третий этап не так прост как кажется, если вы граббите загрузки, то
необходимо организовать переадресацию на прямую ссылку с контентом
*/
header('Content-type:text/html;charset=utf-8');
echo $s;

/*
как видим, граббер вполне работает, только не грузятся смайлики,
давайте подкорректируем это и впишем свой копирайт на страницу :)
*/

function process($s)
{
    $s=str_replace('<a href="/forum/','<a href="'.$_SERVER['SCRIPT_NAME'],$s);

    //смайлы
    $s=str_replace('<img src="','<img src="http://wen.ru/',$s);

    //копирайт
    $s=str_replace('</body>','<div>(c)snippets</div></body>',$s);

    return $s;
}

/*
разумеется, вы не сможете написать в тему или создать ее, тут надо использовать
POST запросы, задача этой статьи не создание флудер-скрипта а ознакомление с
принципами написания грабберов.
*/

?>