LINUX.ORG.RU

Есть ли такой online сервис?


0

2

Чтобы скормить ему URL, а на выходе получить какую-то информацию о странице, например, title, keywords, description. Есть такое в интернетах? Понятно, что пишется за полчаса, но это ж надо бесплатный хостинг искать, смотреть, какие там подводные камни, кодить, выкладывать, тестировать...

★★

Ответ на: комментарий от trashymichael

а в чем, собственно, смысл?

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

и зачем для этого хостинг

а как без хостинга?

SOmni ★★ ()
Ответ на: комментарий от trashymichael

Если ты про безопасность, то не вижу проблем совсем. Достаточно заменить < и > на соответствующие коды и обрезать длину до разумной.

SOmni ★★ ()
Ответ на: комментарий от urxvt

Зачем онлайн сервис то?

За тем, что это непрофильная фигня, и затратная по ресурсам, к тому же (когда много URL-ов).

SOmni ★★ ()
Ответ на: комментарий от urxvt

И да, я уже накидал, но, как я уже сказал, это дорого и немного не по теме.

SOmni ★★ ()
Ответ на: комментарий от urxvt

И ещё, сейчас у меня это написано на питоне и работает, но т.к. питонячих хостингов меньше, чем пэхапэшных, то я хочу переписать это всё на php

function file_get_contents_curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    $data["page"] = curl_exec($ch);
    $data["ctype"] = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    curl_close($ch);
    return $data;
}
Почему это чудо для некоторых utf-ных сайтов возвращает всё как надо, а для других (например, для LOR) кучу непонятной фигни:
Title: LINUX.ORG.RU - Русская информация об ОС Linux
Скормив строку utf8_decode получаем нормальный текст, но для других utf-ных сайтов сразу возвращается нормальная строка, а скармливание utf8_decode приводит к куче ??? в выводе. $data[«ctype»] в обоих случаях равно utf-8. А ведь бывают и другие кодировки.

SOmni ★★ ()
Ответ на: комментарий от note173

Ну вот когда у вас сотня URL-ов на странице и надо получить title для всех (и это только для одного пользователя, у других пользователей другие URL-ы могут быть), а квоты ограничены, то начинаешь задумываться.

SOmni ★★ ()
Ответ на: комментарий от alix

А, вон ты о чём. Говорю же, затратно и непрофильно.

SOmni ★★ ()
Ответ на: комментарий от xtraeft

В моём случае проще своё написать, чем этим пользоваться. Нужен именно вебсервис, который бы вернул только нужное, а не сайт с кучей всего.

SOmni ★★ ()
Ответ на: комментарий от SOmni

А как в гугле реализован предпросмотр результатов поиска?

CyberTribe ★★ ()
Ответ на: комментарий от SOmni

function file_get_contents_curl

http://trac.balancer.ru/bors-core/browser/inc/http.php

function http_get_content($url, $raw = false) — занимается в том числе декодированием кодировки страницы, отличающейся от системной. Работает в подавляющем большинстве случаев (и во всех случаях с корректно отдаваемой сервером кодировкой).

KRoN73 ★★★★★ ()
Ответ на: комментарий от urxvt

Это называется просто?

Лениво смотреть, много букв и, по-моему, неадекватного кода. Но я много лет использую зоопарк кодировок, даже, подчас, смесь кодировок в рамках одного проекта (скажем, часть баз данных и часть выдачи в KOI8-R, часть — в UTF-8 или БД и файлы в WINDOWS-1251, выдача вперемешку WINDOWS-1251 и UTF-8), но со сложностями не сталкиваюсь.

KRoN73 ★★★★★ ()
Ответ на: комментарий от Xenesz

Оно, да не оно. Как это встроить на свой сайт? Никак.

SOmni ★★ ()
Ответ на: комментарий от KRoN73

С твоей функцией тоже на заработало, но проблема не в ней, и не в моей функции. Проблема в том, что при загрузке контента в DOMDocument некоторых страниц (ЛОРа, например), у него едет крыша и он ломает кодировку, так что пришлось делать извелечение meta и title на регэкспах (не хочу всякие хаки для DOMDocument использовать). Такие дела.

SOmni ★★ ()
Ответ на: комментарий от SOmni

Проблема в том, что при загрузке контента в DOMDocument некоторых страниц (ЛОРа, например), у него едет крыша и он ломает кодировку

Так в utf-8 работать надо. При чтении страницы конвертируешь в него и грузишь в нём.

так что пришлось делать извелечение meta и title на регэкспах

http://trac.balancer.ru/bors-core/browser/classes/bors/external/common.php
static function content_extract($url, $limit=1500)

Возвращает title/description/img. Массово используется для превращения простой однострочной ссылки в сообщении в отдельный блок.

Использует данные, возвращённые bors_lib_html::get_meta_data(), определённой в
http://trac.balancer.ru/bors-core/browser/classes/bors/lib/html.php

Таки да, всё на регекспах, но не из-за проблем кодировок, а из-за проблем с валидностью кода на многих источниках.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Так в utf-8 работать надо

Я, наверное, что-то не догоняю. Два сценария:
1. получаем страницу, выводим целиком (print $content) - всё нормально, всё читается;
2. получаем страницу, суём в DOMDocument, находим title по тэгу, выводим nodeValue, получаем нечитаемую некнвертируемую кашу.

SOmni ★★ ()
Ответ на: комментарий от SOmni

Системная кодировка какая?

DOM-документ в юникоде открывается или в latin1?

Вот первый попавшийся пример работы с DOM со страницей, скачанной приведённой выше функцией:

$html = bors_lib_http::get($url);
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

$title = $xpath->query("//div[@id='main-wide']/h3")->item(0)->nodeValue;
$body  = $xpath->query("//div[@id='main-wide']/div[@class='justify']")->item(0)->nodeValue;
// ...

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Системная кодировка какая?

utf8

Не, нифига:

@$url = $_GET["url"];
if (preg_match("/^http:\/\//", $url)) {
  $content = http_get_content($url);
  $dom = new DOMDocument('1.0', 'utf-8');
  $dom->loadHTML($content);
  $nodes = $dom->getElementsByTagName("title");
  print $nodes->item(0)->nodeValue;
}
Не работает, с $content = http_get_content($url, true); - тоже не работает.
---
function http_get_content($url, $raw = false) {
  $original_url = $url;
  if (preg_match("!^(.+?)#(.+)$!", $url, $m)) {
    $url = $m[1];
    $pure_url = $url;
  } elseif (preg_match("!^(.+?)\?(.+)$!", $url, $m)) {
    $pure_url = $m[1];
  }

  if (preg_match("/\.(pdf|zip|rar|djvu|mp3|avi|mkv|mov|mvi|qt)$/i", $pure_url)) {
    return "";
  }
  $header = array();
  $header[] = "Accept-Charset: utf-8";
  $header[] = "Accept-Language: ru, en";
  $ch = curl_init($url);
  curl_setopt_array($ch, array(
                               CURLOPT_TIMEOUT => 30,
                               CURLOPT_FOLLOWLOCATION => true,
                               CURLOPT_MAXREDIRS => 10,
                               CURLOPT_ENCODING => 'gzip,deflate',
                               CURLOPT_REFERER => $original_url,
                               CURLOPT_AUTOREFERER => true,
                               CURLOPT_HTTPHEADER => $header,
                               CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.94 Safari/534.13',
                               CURLOPT_RETURNTRANSFER => true,
                               CURLOPT_SSL_VERIFYPEER => false,
                               CURLOPT_HEADER => true,
                               ));
  $data = curl_exec($ch);
  if ($data === false) {
    echo '<small><i>[1] Curl error: ' . curl_error($ch) . '</i></small><br/>';
    return '';
  }
  $adat = explode("\n", $data);
  $pos = 0;
  $header = '';
  for($i=0; $i<count($adat); $i++) {
    $pos += strlen($adat[$i])+1;
    if (!trim($adat[$i])) {
      $header = join("\n", array_slice($adat, 0, $i-1));
      $data   = join("\n", array_slice($adat, $i+1));
      break;
    }
  }
  $data = trim($data);
  $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
  if (preg_match("!charset=(\S+)!i", $content_type, $m)) {
    $charset = $m[1];
  }
  elseif (preg_match("!<\?xml version=\S+ encoding=\"(.+?)\"!i", $data, $m)) {
    $charset = $m[1];
  }
  elseif (preg_match("!(Microsoft\-IIS|X\-Powered\-By: ASP\.NET)!", $header)) {
    $charset = 'windows-1251';
  }
  else {
    $charset = '';
  }
  curl_close($ch);
  if ($raw) {
    return $data;
  }
  if (empty($charset)) {
    if (preg_match("!<meta http\-equiv=(\"|')Content\-Type(\"|')[^>]+charset=(.+?)(\"|')!i", $data, $m))
      $charset = $m[3];
    elseif (preg_match("!<meta[^>]+charset=(.+?)(\"|')!i", $data, $m))
      $charset = $m[1];
  }
  if (!$charset) {
    $charset = "utf-8";
  }
  if ($charset) {
    $data = iconv($charset, "utf-8//IGNORE", $data);
  }
  return $data;
}

SOmni ★★ ()
Ответ на: комментарий от nyash

Основное требование - чтобы возвращало через jsonp, мне этим с клиентской машины надо пользоваться.

SOmni ★★ ()
Ответ на: комментарий от trashymichael

Ну некоторые пишут, что curl у них установлен, и его разрешено использовать. Хочется верить.

SOmni ★★ ()
Ответ на: комментарий от trashymichael

Пока что удача на моей стороне :)
http://p-info.net76.net/p-data.php?url=http://www.linux.org.ru&callback=LorSweetLor (www.000webhost.com)

Посмотрим, сколько они продержатся, а к тому времени я может ещё хостингов найду, сделаю балансер и кэширование, а также эмуляцию curl_followlocation (с этим тоже беда, не разрешают). Кстати, какой свободный хостинг может разрешить держать у себя балансировщик? :)

SOmni ★★ ()
Ответ на: комментарий от trashymichael

Мой сервис? УМВР. Или ты своё что-то туда затолкал и тестировал?

SOmni ★★ ()
Ответ на: комментарий от SOmni

после пары сотен обращений сервис ложится, ну оно и понятно bulk режим и кеширование это первое что надо было продумать ни один бесплатный хостинг не будет держать сервис с апи, хоть сколь-нибудь нагруженный (когда люди делают обращения но не заходят на страницу) по крайней мере хостинг в понимании пхп-разработчика и еще, давай уж и клиент-сайда, виджет какой, чтобы сразу это ванильно использовать

trashymichael ★★★ ()
Ответ на: комментарий от trashymichael

Будет время - будет и балансировщик и кеширование и bulk-режим (может быть), мне сейчас нужен был только proof-of-concept. Насчёт клиента не понял, что ты ожидаешь увидеть. Я это использую для своего виджета рейтингов на страничке статистики. Чтобы посмотреть, как это работает, надо в поле URL ввести адрес сайта, который использует виджет, например,
blogger.omg-linux.ru
(блог не мой, я просто разместил объяву, думаю, автор не будет против). Для этого сайта выводит только title, т.к. description и keywords отсутствуют, функции callbackStats и callbackURL смотреть в тут.

SOmni ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.