Обещаный пост про то как я организовал доставку статистики сайта прямо в мессенджер. В данном конкретном случае меня интересовало с какого поисковика и по какому запросу пришел посетитель. Ведь одно дело если мы смотрим статистику по прошествии какого-то времени, а совсем другое когда мы можем её оценивать в реальном времени.
Ничего особо сложного в решении поставленной задачи нету, но тем не менее и написать обещал, и в твиттере уже есть как минимум 1 человек которому интересно, да и когда объясняешь много нового сам узнаёшь.
Нам необходимо написать 2 основных части. Первая — определение поисковика и запроса, вторая — отправка в джаббер. Язык у нас, естественно PHP.
Часть 1. Обработка суперглобального массива $_SERVER[‘HTTP_REFERER’]
Вся информация о поисковике и запросе хранится в суперглобальной переменной $_SERVER[‘HTTP_REFERER’]. При переходе с поискового сервиса выглядит примерно так: http://yandex.ru/yandsearch?text=%D0%BE%D0%B7%D0%B8%D0%BE&stpar2=%2Fh1%2Ftm8%2Fs1&stpar4=%2Fs1&stpar1=%2Fu0.
Для того что бы отсеять те случаи когда человек приходит не с поисковика и не нагружать сервер лишний раз я решил соорудить проверку на наличие запроса после адреса.
// кладём суперглобальную переменную в обычную, чтоб удобней работать было
$url = $_SERVER['HTTP_REFERER'];
// parse_url – разбиваем запрос на составляющие и отправляем в массив $complete
// urldecode – декодируем символы «%D0%BE%D0%B7%» в человеко-разумный вид
// trim – чистим содержимое от лишних пробелов и прочей пакости
$complete = parse_url(urldecode(trim($url)));
/* после всего колдовства массив $complete выглядит у нас примерно так:
Array
(
[scheme] => http
[host] => yandex.ru
[path] => /yandsearch
[query] => text=озио&stpar2=/h1/tm8/s1&stpar4=/s1&stpar1=/u0
)
*/
// выполняем остальной код только при наличии элемента query
if ($complete['query'] != '') {
parse_str($complete['query'], $output);
Тем самым мы не просто осуществили проверку на поисковость запроса, но и убили лишнего зайца выполнив часть кода необходимого в дальнейшем.
Теперь когда мы имеем разложенный по полочкам URL в массиве $complete всё значительно упрощается. Ну и для удобства мы точно также раскладываем по элементам содержимое элемента query, что бы иметь сам поисковый запрос отдельной переменной. А после уже начинаем проверку на поисковик.
Ну и после того как мы отпарсили элемент $complete[‘query’] мы имеем свой элемент массива с ключевой фразой. В зависимости от поисковика элемент имеет своё название, например на Яндексе ключевая фраза передаётся в переменной text, значит и элемент массива у нас называется $output[‘text’].
// функция eregi ищет в переменной $url слово 'yandex', если есть, то исполняется if
if (eregi('yandex', $url)) {
echo 'Вы пришли с Яндекса по запросу '.$output['text'];
}
Точно таким же образом с помощью elseif проверяем на причастность запроса к остальным поисковикам. Кстати, тут встретил такую малюсенькую тонкость — помимо обычного поиска Яндекса есть ведь ещё и Яндекс.Блоги и Яндекс.Картинки и всякое такое. Что бы их отловить надо использовать if с условием eregi(‘blogs.yandex’, $url), что, впрочем, логично.
Часть 2. Отправка сообщений в мессенджер с помощью фрэймворка xmphp.
Да-да, фрэймворка. Ну нафиг мне нужно рыться в спецификации xmpp если колесо давно изобретено?
Выбор фрэймворка был очень прост. На сайте xmpp.org он оказался единственным, без проблем позволяющим отправлять сообщения, написав всего пару строчек кода. Хотя, конечно, с ним тоже пришлось повозиться.
Во-первых, он не захотел работать со специально зарегистрированным мной ботом на gmail, хотя судя по примерам со страницы проекта gmail — стандарт. В общем благо проблем с Jabber-серверами у нас нету и я зарегистрировал бота на jabber.ru.
Во-вторых, возникла проблема с кодом, нашлась функция, которую текущая версия php определяла как не существующую вовсе, благо функция была задействована в выводе лога при отладке, так-что я просто её закомментарил и никаких проблем тут не возникло.
Ну и в-третьих, скрипт отказывался работать с включённым SSL/TLS шифрованием.
Всё что нужно для того чтобы фрэймворк заработал — надо закачать на сайт папку XMPPHP и прописать на странице пару строчек кода.
include ‘XMPPHP/XMPP.php’;
$conn = new XMPPHP_XMPP('allports.jabber.ru', 443, 'логин', 'пароль', 'xmpphp', 'jabber.ru', $printlog=false, $loglevel=XMPPHP_Log::LEVEL_INFO);
try
{
$conn->connect();
$conn->use_encryption = false;
$conn->processUntil('session_start');
$conn->presence();
$conn->message('mr_ozio@livejournal.com', $output[text]."\n---\nЯндекс\n$doc_url");
$conn->disconnect();
} catch(XMPPHP_Exception $e) {
die($e->getMessage());
}
Тут дальше есть несколько вариантов. Вполне логично было бы вынести отправление в отдельный класс, но я как обычно решил всё упростить (или усложнить, тут с какой стороны посмотреть) и добавил в проверку по каждому поисковику.
Вот и всё.
А вот так это сегодня смотрелось в моём Pidgin’е.
теги: jabber, jabber.ru, xmphp, xmpp, статистика