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

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

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

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

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

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
       $keywords='ключевик';
       $num=10;
       $charset='windows-1251';     # Возможны: windows-1251, ISO-8859-1, UTF-8
       $sekret='sekret_variable';
       $content=file_get_contents(
          'http://site.com/base_script.php?words='.rawurlencode($keywords).
          '&num='.$num.
          '&key='.substr(md5($sekret.$keywords),10,10).
          '&charset='.$charset
       );

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

  • В первой строке мы задаём через переменную тему ленты новостей.
    Никто не запрещает получать ключевик (уместный для данной страницы) от Вашего движка.
  • Вторая строка кода оговаривает максимальное число новостей в ленте.
    Помним о логике работы Гуглового референта- это число от 1 до 10 включительно.
  • Далее мы задаём кодировку ленты.
    Потому как сайт может быть и не только в виндовой кодировке, верно?
  • Четвёртая строка кода содержит секретный ключ.
    Его должны знать как этот Клиентский Код, так и Базовый Скрипт.
    Для чего, Вам уже должно быть понятно.
    Базовый Скрипт должен обрабатывать запросы только Ваших сайтов.
  • В шестой строке как раз и задан URL Базового Скрипта.
  • Остальное трогать не надо. Это просто подстановка параметров в URL.

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

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    <?php
     
       $sekret='sekret_variable';
       $license="
         ======= Ваша лицензия: =======
         0eef7e19ff-1a337c9d53-2cf148ca83-
         31e51b5f3d-47b1371e2a-47d034706d-
         6343d26db1-7f1801016d-b0cb113ef7-
         d5301b4f44-e1bf1bd5ba
         ======= Ваша лицензия: =======
         "; # test.ru
    
       $keywords=isset($_GET['words']) ? stripslashes(rawurldecode($_GET['words'])): '';
       $key=isset($_GET['key']) ? $_GET['key']: die('Key not exist.');
       $num=isset($_GET['num']) ? $_GET['num']: die('Num not found.');
       $charset=isset($_GET['charset']) ? $_GET['charset']: die('Charset not exist.');
     
       if (substr(md5($sekret.$keywords),10,10)!=$key) die('Illegal key');
     
       include_once ("./googlereferent/googlereferent_template.php");
    #  include_once ("./googlereferent/googlereferent_css.php");
       include_once ("./googlereferent/googlereferent.inc.php");
     
       $news=new GoogleReferent;
       $news->langsite('ru');
       $news->keywords($keywords);
       $news->codeto('windows-1251');
       $news->cachetime(6000);
       $news->feednumber($num);
       $news->cache('./data/logs');
       $news->template($googlereferent_template);
       $news->ini_google_referent();
       $content=# $googlereferent_css.
       $news->getnews();
     
       header("Content-Type: text/html; charset=".$charset, false);
       echo ($charset=='windows-1251') ? 
          $content:
          @iconv('windows-1251',$charset.'//IGNORE',$content);
     
    ?>

Обратите внимание, что язык ленты (строка 25) прописан тут, а не передаётся из клиентского кода (можете это сделать самостоятельно, если сильно хочется), и CSS файл Гуглового Референта не подцеплен (заблокирован чебурашками в строчках 21 и 33). Ибо стили для фида всё-таки лучше задавать в основном файле стилей сайта, так как Базовый Скрипт может работать в интересах нескольких ресурсов, с различными дизайнами самих ресурсов (а стало быть, и лент).

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

Лицензия (строки с 4 по 11) должна быть на тот домен, где стоит Базовый Код.

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

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

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

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

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

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

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

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

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

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

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

    Безусловно, оптимально вообще отказаться от использования урлов при запросе, а данные передавать методом POST с помощью, скажем, модуля CURL, с однозначным размещением Клиентского Кода и Базового Скрипта на одном сервере, и пользования только относительной адресации. Грамотный вебмастер это сделает легко.

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

Практический пример.

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

Последовательность действий будет такая:

  1. Файл Базового Скрипта base_script.php кладём в корень папки с блогом.
    Там же располагаем фолдер дистрибутива Референта.
    Папка для хранения кэша фидов автоматически оказывается по нужному пути.

    Не забудьте стили Гуглового Референта перенести в файл стилей блога.
    Либо убейте чебурашек в 21 и 33 строках, чтобы дефолтовые стили Референта могли быть задействованы.

  2. Теперь в HTML коде поста нужно как-то обозначить то место, где Вы хотите воткнуть фид Референта.
    Также здесь требуется задать и ключевик для фида.

    Давайте не будем изобретать велосипед, а используем для этой цели предусморенный спецификацией HTML стандартный комментарий вида:
    <!-- google referent: "правильный" AND "ответ" +inurl:.ru -->

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

    Так и пишем такой комментарий в нужном месте любого поста.
    Собственно комментарии визуально никак блогом не отображаются.

  3. Теперь нам нужен клиентский код, который станет обнаруживать в статичном HTML коде страниц комментарии указанного формата, изымать их из кода страниц, и замещать соответствующим фидом.

    Воткнуть такой Клиентский Код можно в несколько альтернативных мест. Но проще всего поступить, как обычно: пойти в папку активированного в блоге дизайна (по умолчанию это ./data/tpl/default/), и прямо после открывающего тега <?php файла дизайна design.php прописать вот такой фрагмент РНР кода:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
       if (preg_match_all("/<\!-- google referent\: (.+) -->/Usi",$echo,$ttl)) {
          list($num,$base_script,$charset,$sekret)=array(
             3,
             $turl.'/base_script.php',
             'windows-1251',
             'sekret_variable'
          );
          for ($gri=0; $gri < count($ttl[1]); $gri++) {
             $gr=file_get_contents(
                $base_script.'?words='.rawurlencode($ttl[1][$gri]).
                '&num='.$num.
                '&key='.substr(md5($sekret.$ttl[1][$gri]),10,10).
                '&charset='.$charset
             );
             if (strlen($gr) > 100) $echo=str_replace(
                '<!-- google referent: '.$ttl[1][$gri].' -->',
                '<p class="panel">Новости по теме «'.str_replace('"','',$ttl[1][$gri]).
                '»:</p><br>'.$gr.'<br><br>',
                $echo
             );
          }
       }

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

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