Подключение Гуглового Референта к произвольному движку:
А теперь давайте напишем универсальный, гибкий и мощный код для работы под любым движком, юзающий возможности Гуглового референта.
Из соображений универсальности ему судьба состоять из двух независимых частей- отдельного и достаточно хитрого функционала по добыче и хранению в себе гугловых новостей (наречём его "Базовый Скрипт", дабы не путаться), и крошечного клиентского РНР кода, размещаемого на страничках, втыкающих в себя содержимое фидов Гуглового Референта.
Начнём со второго, как более простого.
Код, размещаемый на странице сайта (Клиентский Код):
Необходимо и достаточно, чтобы в месте размещения Клиентского Кода могли выполняться РНР инструкции.
Автора скрипта совершенно не интересует, как в конкретном движке надо вывернуться, чтобы на произвольной странице с контентом произвольный же 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) должна быть на тот домен, где стоит Базовый Код.
О дистанционировании этих двух кусочков.
Вам может показаться забавной мысль разместить Базовый Скрипт на одном из сайтов, и подключить к нему множество своих ресурсов в других доменах, а также, по простоте душевной и доброте сердца русского, позволить друзьям-товарищам тоже таскать фиды с этого Вашего Базового Скрипта. Жалко, что ли?
Тут может быть засада, причём сразу в двух направлениях.
- Данный онлайнхэлп неспроста включает в себя раздел про коварного Гугла.
Его сервера действительно устанавливают лимит на число обслуживаемых запросов с домена или айпишника сайта. И, как только Вы превысите за текущие сутки количество таких разрешённых запросов, так сразу же и получите пустоту на месте фида.
Именно во избежание таких вещей Гугловый Референт и кэширует фиды, чтобы при любой плотности трафика на Вашем сайте Референт брал с Гугла новости для данной страницы только раз в несколько суток, а не постоянно, при каждом хите на страницу.
И именно поэтому, ежели число таких страниц, отображающих в себе фиды, велико (сотни), настоятельно рекомендуется ставить время кэширования побольше. Чтобы совокупное число обращений к Гуглу за сутки было скромным и безобидным.
При этом не забывайте, что в айпишнике Вашего сайта могут жить ещё десятки и сотни других сайтов, творящих незнамо что и незнамо как. Вебмастеров, дружащих с головой, поступающих технически грамотно, очень немного. И всего один придурок, запинговавший любой из сервисов Гугла каким-нибудь скачанным с Интернета скриптом, смысл которого и принцип работы он и сам до конца не понимает, легко инициирует бан этого айпишника для всех прочих сервисов Гугла. Ибо Гуглу понятно, что в этом айпишнике явно сидит что-то придурочное, а потому ну его нафиг...
Хотите иметь стабильно работающий проект- давайте ему отдельный айпишник.
И воздержитесь от действий, приводящих к отказу в обслуживанию этого айпишника Гуглом.
Предельно прозрачный намёк даден выше. - Будет оптимально, если и Базовый скрипт, и сайт, пользующий Клиентский Код к нему, живут на одном физическом сервере. Домены у них могут быть разные, но сервер лучше пусть будет один и тот же.
Почему, понятно- время генерации документа (того, где размещён Клиентский Код) включает в себя и длительность запроса к Базовому Скрипту. Если последний находится где-то очень далеко, а не на этом же физическом сервере, то получите тормозной сайт.
Безусловно, оптимально вообще отказаться от использования урлов при запросе, а данные передавать методом POST с помощью, скажем, модуля CURL, с однозначным размещением Клиентского Кода и Базового Скрипта на одном сервере, и пользования только относительной адресации. Грамотный вебмастер это сделает легко.
Пожалуйста, при любых своих действиях думайте над вышесказанным.
Практический пример.
Отдельным документом мы уже рассматривали, как интегрировать Гуглового Референта в LastoBlog в качестве самостоятельной страницы на этом движке. Но давайте усложним задачу- засунем фид Гуглового Референта прямо в текст поста, где, как известно, РНР инструкции в принципе не выполняются. Что очень подходит для иллюстрации вышеописанной методики.
Последовательность действий будет такая:
- Файл Базового Скрипта base_script.php кладём в корень папки с блогом.
Там же располагаем фолдер дистрибутива Референта.
Папка для хранения кэша фидов автоматически оказывается по нужному пути.
Не забудьте стили Гуглового Референта перенести в файл стилей блога.
Либо убейте чебурашек в 21 и 33 строках, чтобы дефолтовые стили Референта могли быть задействованы. - Теперь в HTML коде поста нужно как-то обозначить то место, где Вы хотите воткнуть фид Референта.
Также здесь требуется задать и ключевик для фида.
Давайте не будем изобретать велосипед, а используем для этой цели предусморенный спецификацией HTML стандартный комментарий вида:<!-- google referent: "правильный" AND "ответ" +inurl:.ru -->
- заодно понимаем, что ключевик может включать в себя весь разрешённый синтакис поисковых запросов Гугла. В данном случае мы ищем ссылки на статьи про "правильный ответ" (слова кейворда могут стоять в разной последовательности, и разделяться включением других слов). Плюс нас интересуют только сайты в зоне ру.
Так и пишем такой комментарий в нужном месте любого поста.
Собственно комментарии визуально никак блогом не отображаются. - Теперь нам нужен клиентский код, который станет обнаруживать в статичном 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 инструкции.