PHP (Статей: 62)

<?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 запросы, задача этой статьи не создание флудер-скрипта а ознакомление с
принципами написания грабберов.
*/
?>
Итак, типы. Язык php – язык с динамической типизацией. В отличие от многих языков программирования, таких как C, C++, Java, мы не должны четко указывать тип для каждой из наших переменных. Более того, тип переменной может меняться. Что такое тип? Тип переменной – это вид информации, которая хранится в переменной. К примеру: $text = “строка” – означает, что перенная $text содержит строковый тип данных, и, соответственно, переменная $text – строковая переменная, а $var = 5 – соответственно целочисленная переменная.
Тип меняется например в следующем случае:
$text = "строка";
$text = 5;
Здесь переменная сначала была строковой, а потом стала целочисленной.
Не смотря на то, что в большинстве случаем мы не должны следить за типами наших переменных, все-таки существуют задачи, где без этого не обойтись. К примеру:
$text = "5";
$text = $text + 7;
Скорее всего такой код вызовет ошибку, так, как к строке мы прибавляем число. И если бы интерпретатор все делал за нас, то не понятно, что мы хотели. То ли результат соединения двух строк “57? , то ли сложение двух чисел 13.
Итак, php поддерживает 8 простых типов:
boolean (логический);
integer (целый);
float (с плавающей точкой);
string (строковый).
array (массив);
object (объект).
resource (ресурс);
NULL.
Я не буду писать про каждый из типов здесь. Про каждый из типов, я расскажу в контексте других постов. А сейчас достаточно их запомнить или добавить пост в закладки, чтобы знать где оно лежит)).
Условные конструкции. Условные конструкции – конструкции выполняющие определенное действие, если соблюдается определенное условие. В языке php это конструкция if…else. Эту конструкцию нельзя изучать в отрыве от типа boolean. Сама конструкция выглядит так:
if (условие) {
   действие 1;
   действие 2;
   действие n;
}
else {
   другие действия;
}
Имеенно в качестве условия и выступает переменная типа boolean. Это достаточно простой тип. Он может принимать всего 2 значения: TRUE и FALSE. Существуют операторы, которые могут принимать эти же 2 значения – это операторы сравнения: == , <=, >=, > , < и !. Соответственно это – равно, меньше или равно, больше или равно, больше, меньше и логическое НЕ. К примеру:
$a = 4;
$b = 6;
$a == $b; - возвращает FALSE
$a <= $b; - возвращает TRUE
$a < $b ; -возвращает TRUE
Вернемся к управляющим конструкциям. В условии должен быть boolean. Например стоит задача: Если число подписчиков больше или равно 1000, то вывести надпись вы не можите подписаться, если меньше, то вывести надпись вы подписались.
<?php
  $num = 100;           //Вводим число подписчиков
  if ($num >= 1000) {   // проверяем колличесво подписчиков.
    echo "вы не можите подписаться";
  }
  else {
    echo "вы подписались";
  }
?>
Единственное, о чем я здесь не рассказал – это комментарии. Все что написано после двух слешей, не считается программой, а предназначено только для читающего код.
Облако тегов / Авторы