Можно как-то определить, не скачав файл, что в нем контент?

scandal

Новичок
Можно как-то определить, не скачав файл, что в нем контент?

Доброе утро!
Можно как-то определить, не скачав файл, что в нем текст? Так как не нужно скачивать по ссылке, если там картинка, прога, архив и прочее. Нужно скачивать, только в случае, если это вебстраница.
Для скачивания я использую следующую функцию:
PHP:
function get_content($hostname, $path)
{ 
    $line = "";
    $fp = fsockopen($hostname, 80, $errno, $errstr, 30); 
    if (!$fp) echo "$errstr ($errno)<br />\n"; 
    else
    { 
      $headers = "GET $path HTTP/1.1\r\n"; 
      $headers .= "Host: $hostname\r\n"; 
      $headers .= "Connection: Close\r\n\r\n"; 
      fwrite($fp, $headers); 
      while (!feof($fp))
      { 
        $line .= fgets($fp, 1024); 
      } 
      fclose($fp); 
    } 
    return $line; 
}
а еще в инете нашел вот такой кусок:
PHP:
<?php
// preconditions
$port = 80 | 443
$host = "www.example.com";
$method = "POST" | "GET";
$contenttype = "text/html" | "text/plain" | "text/xml" | ...;
$data = "<something>";

// script
if($port == 443)
      $sslhost = "ssl://".$host;
else
      $sslhost = $host;
$fp = fsockopen($sslhost, $port);
fputs($fp, "$method $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Content-type: $contenttype\r\n");
fputs($fp, "Content-length: ".strlen($data)."\r\n");
fputs($fp, "Connection: close\r\n");
fputs($fp, "\r\n");
?>
Можно ли как-то использовав то, что в этом куске, переделать функцию get_content для решения моей задачки?
Только не посылайте, пожалуйста, читать RFC2616 - Hypertext Transfer Protocol. Вряд ли я на такое способен.
 

Апокалипсис

тех дир matras.ru
scandal
На этом форуме принято отвечать - если спрашивают для чего Вы хотите реализовать то, о чем спрашиваете.
 

scandal

Новичок
двое на одного! :)
Поисковик свой узкотематический хочу сделать.
Не беспокойтесь, индексировать будем только сайты, хозяева которых сами этого хотят.
Нужно скрипт научить скачивать только ссылки на другие страницы.
Поэтому, наверное, для начала нужно научиться распознавать файлы, в которых текст, а не картинка, например.

Данная тема является логическим продолжением (по крайнем мере для меня) темы
http://phpclub.ru/talk/showthread.php?s=&threadid=109396&perpage=20&pagenumber=1
 

waza123

Новичок
polzujsa fsockopen, i HTTP protokolam.

vsa fi6ka v sleduj6em:

1. konekti6sa na http server, posilae6 emu vse neobxodimiji headeri dlja dostupa na fail, dapustim na fail asd.htm
2. dalee tebe server otve4aet headerami,

HTTP/1.1 200 OK
Content-Type text/html


kak vidna content-type tebe govorit, (a imenno server tebe govorit)
4to dannij fail eta text/html , toest HTML fail asd.htm , esli tebe eto podxodit, to prodolzhae6 ska4evatj polnij otvet, esli net, to obrivae6 sojedenenie

esli tam budet dapustim

image/gif
to jasno 4to eta uzhe image, i te ono nenada, to obrivae6 sojedenenie..
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
waza123
"Старайтесь не писать латиницей," (из правил)
 

scandal

Новичок
Вот, переделал функцию get_content:
PHP:
function get_content($hostname, $path)
{ 
    $line = "";
    // Устанавливаем соединение, имя которого
    // передано в параметре $hostname
    $fp = fsockopen($hostname, 80, $errno, $errstr, 30); 
    // Проверяем успешность установки соединения
    if (!$fp) echo "$errstr ($errno)<br />\n"; 
    else
    { 
      // Формируем HTTP-запрос для передачи его серверу
      $headers = "GET $path HTTP/1.1\r\n"; 
      $headers .= "Host: $hostname\r\n"; 
      $headers .= "Connection: Close\r\n\r\n"; 
      // Отправляем HTTP-запрос серверу
      fwrite($fp, $headers); 
      // Проверим, является ли скачиваемый файл вебстраницей?
      $line = fread($fp, 1024);
      if(strpos($line,'Content-Type: text/html')==false) {
	      	      echo '$hostname-$path is a not webpage<br/>';
	      	      return "";
      }
      else{
	      echo "$hostname-$path is a webpage<br/>";
	      while (!feof($fp)) { 
	        $line .= fread($fp, 1024); 
	      } 
	      fclose($fp); 
  	  }
    } 
    return $line; 
}
Два вопроса.
1. Скачиваю первый кусок размером 1024 байт и проверяю на наличие "Content-Type: text/html". Достаточно ли 1024 байт?
2. Нужно ли заменять strpos на stripos?
 

Baranov_Dron

Новичок
хехе) я же говорил в той теме, что много трудностей берёте себе на голову. Теперь постараюсь пару советов дать.
1) Получаете все URL с страницы
2) Все URL превращаем в абсолютные
3) Выкидывает из массива все не http протокольные ссылки.
4) определяем расширение файла, и удаляем те, которые имеют расширение отсюда
PHP:
private $bannedExtensions = array('bmp', 'fif', 'gif', 'ipx', 'j2c', 'j2k', 'gp2', 'jpeg', 'jpg', 'lwf',
	                                'png', 'lwf', 'png', 'tif', 'tiff', 'wbmp', 'xbm', 'ani', 'asf', 'asx',
	                                'avi', 'flc', 'fli', 'flv', 'm1v', 'm2v', 'mov', 'mpeg', 'mpg', 'ram',
	                                'rm', 'rv', 'smil', 'viv', 'vob', 'wmv', 'ape', 'm3u', 'mid', 'mp2',
	                                'mp3', 'ra', 'riff', 'voc', 'wav', 'wma', 'ace', 'arc', 'arj', 'cab',
	                                'gz', 'jar', 'lay', 'lei', 'lha', 'pak', 'pdf', 'rar', 'tar', 'tgz',
	                                'z', 'zip', 'class', 'css', 'dtd', 'ent', 'js', 'ssi', 'swf', 'vbs',
	                                'xsl', 'msi', 'exe', 'sis', 'djvu');
5) дальше извлекаем только url с этого сайта, вот понятный думаю код..
PHP:
public function isThisSiteUrl()
{
    $host = parse_url($this->url, PHP_URL_HOST);
    $host = preg_replace('!^www\.!', '', $host);

    $mainurl =  preg_replace('!^http:\/\/!', '',  $this->MainUrl);
    $mainurl =  parse_url('http://'.$mainurl, PHP_URL_HOST);
    $mainurl =  preg_replace('!^www\.!', '',  $mainurl);

    if (strcasecmp($mainurl, $host) == 0)
    {
         return true;
    }
    else
    {
         return false;
    }
}
6) Дальше уже останутся как правило только нормальные текстовые страницы, дальше грузишь по очереди эти ссылки, с учётом, что грузишь всегда максиум 200 килобайт, если больше то это уже 99процентно не текстовое содержимое. Ну а дальше уже посмотреть текст ли в странице или нет - не проблема.

-~{}~ 28.07.08 16:46:

Автор оригинала: scandal
1. Скачиваю первый кусок размером 1024 байт и проверяю на наличие "Content-Type: text/html". Достаточно ли 1024 байт?
Я бы послал тебя читать http RFC. Что является разделителем header и body запроса? \r\n\r\n, вот и грузи пока не дойдёшь для них. НО ПОЛНОСТЬЮ полагаться на Content-Type я бы не стал. Вдруг сервак не пошлёт эту строчку?!

-~{}~ 28.07.08 16:50:

Автор оригинала: scandal
2. Нужно ли заменять strpos на stripos?
Я бы заменил, на stripos. Как миниум не повредит. Мало ли что взбредёт админу веб сервера.
 

kruglov

Новичок
Baranov_Dron
Вообще-то лучше задавать список разрешенных разрешений (а лучше mime-типов, а то xxx.php - это картинка или текст? А если там imagejpeg?), а не запрещенных.
 

HraKK

Мудак
Команда форума
kruglov
А если я в jpg встрою php?:) при это миме будет верный)
 

kruglov

Новичок
НО ПОЛНОСТЬЮ полагаться на Content-Type я бы не стал. Вдруг сервак не пошлёт эту строчку?!
Ага, а то еще вдруг он вообще сервак для каунтер-страйк.

-~{}~ 28.07.08 17:26:

Автор оригинала: HraKK
kruglov
А если я в jpg встрою php?:) при это миме будет верный)
Мы не от инъекций спасаемся, а поисковик текстовый пишем. Я к тому, что разрешение типа php, asp или даже exe не говорит ровным счетом ничего о "текстовости" контента ресурса.
 

gray07

Новичок
Автор оригинала: kruglov
Вообще-то лучше задавать список разрешенных разрешений (а лучше mime-типов
Но чтобы использовать mime-типы, нужно будет посылать http запрос на каждую ссылку (в том числе и картинки)? Имхо это не нужно
 

kruglov

Новичок
Но чтобы использовать mime-типы, нужно будет посылать http запрос на каждую ссылку (в том числе и картинки)? Имхо это не нужно
Если некто пишет курсовую, то ему это не нужно. А если некто пишет нормальный продукт, чтобы им люди могли пользоваться...
 

Baranov_Dron

Новичок
Автор оригинала: kruglov
Baranov_Dron
Вообще-то лучше задавать список разрешенных разрешений (а лучше mime-типов, а то xxx.php - это картинка или текст? А если там imagejpeg?), а не запрещенных.
А дочитать мои пункты некак? Мы не избавимся, а ОТСЕИМ ненужные.
По поводу наоборот разрешённых - не катит. Точно не помню почему, но проблем было много.
Мой алгоритм, уложенный в 6 пунктов сбоев не давал. Прежде, чем критиковать отдельный пункт лучше прочитай весь алгоритм работы. 1-2 получение ссылок, 3-5 отсев, 6 грузим неотсеянные ссылки, поставив лимит на одну ссылку загружать контент в размере максимум 200 килобайт, если загрузили 200, и это не всё, т.е. файл больше, он идёт лесом. В противном случае проверяем текстовый ли это файл(html, xml, txt, etc).
 

kruglov

Новичок
Baranov_Dron

Простите, можно ссылку на коммерческий поисковик, на котором применяется ваш алгоритм? Потому что, признаюсь, у вас я вижу только облегчения работы программисту в ущерб функциональности и универсальности, причем этот ущерб быстро бы "выплыл" при серьезном использовании. Этот алгоритм имеет право на существование, если ему надо будет индексировать какие-то свои подконтрольные сайты, но в "диком" интернете он будет "давать маху".

"Расширение" о контенте не говорит в общем случае ничего. Текст может выдаваться по адресу blabla.zip и картинка по адресу about/image (сам так часто делаю).

-~{}~ 29.07.08 13:30:

gray07
Но чтобы использовать mime-типы, нужно будет посылать http запрос на каждую ссылку (в том числе и картинки)? Имхо это не нужно
На картинки (ресурсы, на которые ведут ссылки типа <img src="">) текстовому поисковику запросов посылать само собой не нужно, если автор сайта в <img> грузит тексты, значит он не хочет, чтобы этот текст читали пользователи, ибо они его и не увидят.
 

gray07

Новичок
Автор оригинала: Baranov_Dron
Мой алгоритм, уложенный в 6 пунктов сбоев не давал.
А ты хранишь все уже "пройденные" страницы, или есть какой-то хитрый способ?
И каким образом обходишь бан, который выдает сайт, если слишком часто с него запрашивать страницы?
 
Сверху