Подключение Гуглового Референта к произвольному движку.

Гугловый референт в качестве службы:

Из соображений универсальности разобъём скрипт на две независимых части. Пусть у нас будет отдельный функционал по добыче и хранению в себе гугловых новостей (наречём его "Базовый Скрипт", дабы далее не путаться), и крошечный клиентский РНР код, размещаемый на страничках, втыкающих в себя содержимое фидов Гуглового Референта.

Начнём со второго, как более простого.

Код, размещаемый на странице сайта (Клиентский Код):

Необходимо и достаточно, чтобы в месте размещения Клиентского Кода могли выполняться РНР инструкции.

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

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

Автор Гуглового Референта не консультирует по запуску РНР директив под разными CMS, и не станет отвечать на подобные вопросы. Для этого есть Гугл, спрашивайте своё "Как вставить PHP скрипт в ..."- такая проблематика встречалась людям тысячи раз, и все ответы давно найдены.

Теперь сам Клиентский Код для вставки в документы.
Он немного избыточен, но это оправдано:

<?php /* Выше этой строки в файле ничего не должно быть */

   
$echo=get_feed('ракета "Сатана"',10); # Ключевые слова

   
die($echo);

function 
get_feed($keywords,$num=5) {
   
$key='sekret_variable';               # Ключ. Измените его!
   
$arr=array(
      
'keywords' => $keywords
      
'charset'  => 'windows-1251',      # windows-1251, ISO-8859-1, UTF-8
      
'num'      => $num,                # Новостей в ленте, от 1 до 10
      
'key'      => md5($key.$keywords),
      
'host'     => 'http://site.ru/base.php',  # Базовый скрипт 
   
);
   if (
function_exists('curl_init') and $ch=@curl_init()) {
      
curl_setopt($chCURLOPT_URL$arr['host']);
      
curl_setopt($chCURLOPT_TIMEOUT20);
      
curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
      
curl_setopt($chCURLOPT_RETURNTRANSFER1);
      
curl_setopt($chCURLOPT_POSTTRUE);
      
curl_setopt($chCURLOPT_HEADERFALSE);
      
curl_setopt($chCURLOPT_POSTFIELDSurldecode(http_build_query($arr)));

      
$feed=trim(curl_exec($ch));
      
curl_close($ch);
      return 
$feed;
   } else return 
'Curl not found';
}

/* Ниже этой строки в файле ничего не должно быть. */ ?>

То, что можно и нужно менять, в коде сопровождено комментариями. Это:

  1. $key='sekret_variable';

    Значение переменной является "солью" для хэширования.
    sekret_variable замените на свои, другие буковки.

  2. http://site.ru/base.php

    URL, по которому проживает Базовый Скрипт.
    Указывайте тут реальный адрес.

  3. 'charset' => 'windows-1251'

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

    Обратите внимание, что кодировка сайта может не совпадать с кодировкой его документов. Про кодировку сайта тут речи вообще не идёт, мы говорим исключительно о документах.

    Если кодировки документов и сайта у Вас не совпадают, перекодируйте содержимое переменной $echo из кодировки документа в кодировку сайта любым из известных Вам операторов. Простейший iconv() вполне подойдёт.

  4. Со строкой $echo=get_feed('ракета "Сатана"',10);
    всё должно быть понятно - это ключевые слова для поиска по новостям, с полной поддержкой синтаксисов запроса Гугла. Плюс количество новостей (от 1 до 100 сниппетов).

Нетрудно видеть, что при наличии исходящих соединений на Вашем сервере, данный код кодирует и передаёт данные на внешний URL по POST-запросу, получая от расположенного там Базового Скрипта соответствующую запросу ленту Гуглового Референта, попадающую в переменную $echo, содержимое которой далее может быть подшито к документу, выведено по принту или эхо, либо запомнено в файл - это уже на Ваше усмотрение.

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

К получившейся ленте новостей Вы должны применить CSS стили. Подшивать их на стороне базового скритпа вряд ли разумно, так как разные потребители могут нуждаться в разных стилях.

Оформление Клиентского Кода в виде функции сделано исключительно для экранирования переменных от движка Вашего сайта. Можете функцию подшить и к самому движку, чтобы лента в документ вставлялась одним оператором.

Код, размещаемый на внешнем URL-е (Базовый Скрипт):

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

Сам код файла (в данном случае base.php, условно живущий по адресу http://site.ru/base.php, как это для примера указано в Клиентском Коде) не отличается особой сложностью:

<?php /* Выше этой строки в файле ничего не должно быть */
 
   
$sekret='sekret_variable';
   
$license="
     ======= Ваша лицензия: =======
     0eef7e19ff-1a337c9d53-2cf148ca83-
     31e51b5f3d-47b1371e2a-47d034706d-
     6343d26db1-7f1801016d-b0cb113ef7-
     d5301b4f44-e1bf1bd5ba
     ======= Ваша лицензия: =======
     "
# test.ru

   
foreach ($_POST as $k => $v) {
      $
$k=get_magic_quotes_gpc() ? stripslashes($v): $v;
   }
   foreach (array(
'key','num','keywords','charset','sekret','license') as $k) {
      if (!isset($
$k)) die($k.' not found.');
   }
   if (
md5($sekret.$keywords)!=$key) die('Illegal key');
 
   include_once(
'./googlereferent/design.php');

   
$n=array();
   
preg_match_all('~^5\.(\d{1,})\.\d{1,}~',phpversion(),$n);
 
   switch(isset(
$n[1][0]) ? $n[1][0]: 'na') {
      case 
2:
      case 
3:
      case 
4:
         include(
'./googlereferent/php_5_'.$n[1][0].'.php');
      break;
      default:
         die(
'Check PHP version! '.phpversion().' not supported.');
   }
 
   
$keywords=$charset=='windows-1251' 
      
$keywords:
      @
iconv($charset,'windows-1251//IGNORE',$keywords);
   
   
$news=new GoogleReferent;
   
$news->langsite('ru');
   
$news->keywords($keywords);
   
$news->codeto('windows-1251');
   
$news->cachetime(6000);
   
$news->feednumber($num);
   
$news->cache('./googlereferent/cash');
   
$news->template($googlereferent_template);
   
$news->ini_google_referent();
   
$content=$news->getnews();
 
   die (
$charset=='windows-1251' 
      
$content:
      @
iconv('windows-1251',$charset.'//IGNORE',$content)
   );

/* Ниже этой строки в файле ничего не должно быть. */ ?>

Обратите внимание, что язык ленты прописан тут, а не передаётся из клиентского кода (можете это сделать самостоятельно, если сильно хочется). Сам Базовый Скрипт должен быть выложен на сервер в ANSI кодировке (PHP редакторы могут оперировать кодировкой windows-1251 - она тоже пойдёт).

Комментировать особо нечего - код принимает данные от Клиентского Кода методом POST, проверяет подпись к запросу (самый первый оператор должен содержать ту же самую "соль" для хэша, что и Клиентский Код, иначе подпись не совпадёт), перекодирует ключевые слова из кодировки документа в виндовую, получает и запоминает ленту новостей при поиске по ключевым словам, саму ленту перекодирует, если это надо, в кодировку документа, и отправляет обычный HTML текст обратно Клиентскому Коду.

О дистанционировании этих двух кусочков.

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

Тут может быть засада, причём сразу по двум направлениям.

  1. Данный онлайнхэлп неспроста включает в себя раздел про коварного Гугла.

    Его сервера действительно устанавливают лимит на число обслуживаемых запросов с домена или айпишника сайта. И, как только Вы превысите за текущие сутки количество таких разрешённых запросов, так сразу же и получите пустоту на месте фида.

    Именно во избежание таких вещей Гугловый Референт и кэширует фиды, чтобы при любой плотности трафика на Вашем сайте Референт брал с Гугла новости для данной страницы только раз в несколько суток, а не постоянно, при каждом хите на страницу.

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

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

    Хотите иметь стабильно работающий проект - давайте ему отдельный айпишник. И воздержитесь от действий, приводящих к отказу в обслуживанию этого айпишника Гуглом.

  2. Будет оптимально, если и Базовый скрипт, и сайт, пользующий Клиентский Код к нему, живут на одном физическом сервере. Домены у них могут быть разные, но сервер лучше пусть будет один и тот же.

    Почему, понятно - время генерации документа (того, где размещён Клиентский Код) включает в себя и длительность запроса к Базовому Скрипту. Если последний находится где-то очень далеко, а не на этом же физическом сервере, то получите тормозной сайт.

Пожалуйста, при любых своих действиях думайте над вышесказанным.