Общение с пользователями на ваших сайтах из одного окна Jabber
Попривык я к Jabber-аккаунту в своём QIP`е, наэкспериментировался с установкой альтернативных Jabber-серверов, пришло время копать дальше. И посетила меня мысль, а коли Jabber-сервера поставляются в исходных кодах, наверняка можно использовать их граздо интереснее.А тут ещё на днях озадачился я таким вопросом как общение с пользователями сайта, но только так чтобы они что-то вводили в формочках на сайте, а я в какой-то программе мог с каждым из них общаться.
Тему эту я раскопал довольно глубоко, нашёл множество платных решений, и даже несколько глючных бесплатных вариантов. Но как-то было «не ice» от всего этого бедлама, да ещё и платить $100 не улыбалось.
Так вот вернёмся к нашему Jabber`у. Начал я с того, что стал ковырять исходники, но пятилетний перерыв в кодировании на C сказывался, и в конце концов всё закончилось гуглением на тему “Jabber PHP class”. Мои поиски увенчались успехом, и набрёл я Jabber Client Library от Centova Technologies Inc. На оф.сайте информации о библиотеке не нашёл, ну да не страшно.
Библиотека шла под лицензией LGPL, и мне этого было более чем достаточно. Пара примеров, тестов, несколько аккаунтов на разных jabber-серверах для тестирования скорости, и в результате у меня есть серверная часть которая умеет следующее:
Что есть на первом этапе
- Самописный Jabber-клиент запущен на сервере в режиме 24*7, благо полноценный root на dedicated-сервере позволяет ещё и не такое вытворять.
- Соединяется, общается с различными клиентами – хоть ботов пиши.
- Для начала обучил его нескольким командам:
- exit – без этой команды сложно, тем более что сервис работает круглосуточно
- whois – говорит как называется обращающийся к нему клиент, включая указание канала, поначалу полезно
- time – время на сервере
- online/away/dnd/xa – смена статуса Jabber-аккаунта на сервере
Так, ну это замечательно, только пока игрушечка получилась довольно плоской. Вешать команды по удалённому администрированию довольно просто, поэтому эту тему я здесь продолжать не буду.
Общение с сайтами
Займёмся моментом общения на сайте. В чём могут быть проблемы? Ну как всегда проблемы мы себе сами придумываем, поэтому давайте определимся с целями:
- На сайте могут быть одновременно несколько посетителей, и здорово было бы с каждым и них общаться отдельно, чтобы один не мешал другому.
- Ещё одно «было бы круто если»: реализация своеобразной службы тех.поддержки, чтобы посетитель сайта мог выбирать одного из представленных специалистов и общаться с ним.
- Ну и если мы делаем такие удобства для посетителя, хочется чтобы и тех.поддержке было удобно. Поэтому нужно реализовать принцип «одна задача в один момент», то есть сделать что-то типа одного активного клиента, и режима ожидания для других посетителей сайта. При этом специалист должен иметь возможность свободно переключаться между активными посетителями, то есть отвечать то одному то другому.
Ладно, хватит задач, будем решения придумывать
Сначала подумаем как это сделать Имеем: несколько специалистов и несколько посетителей. Значит нужны будут каналы, один канал привязывает одного посетителя к одному специалисту. При этом один посетитель имеет всегда один канал, у специалиста же может быть одноврменно несколько каналов.
Первое и самое простое решение: поназаводить 10-20 аккаунтов для специалиста, и потом учитывать их все на сервере. Решение простое, и достаточно хорошее – отдельные закладки в клиенте и прочеее. Но меня коробило одно: заводить аккаунт на сервере для добавления нового канала – не хорошо. Хотелось сделать каналы полностью виртуальными.
Хотелось, и сделал.
Денёк позабавлявшись с кодом, имеем:
- Jabber-клиент написан на PHP
- запускается на сервере, взаимодействует с базой данных MySQL (хранение истори, активные каналы, специалисты)
- имеет один master-аккаунт – то есть вся система работает через один jabber-аккаунт на любом из публичных серверов
- клиент поддерживает выполнение удалённых команд, как было описано выше
- поддерживает бесконечное количество «специалистов», каждый специалист может быть привязан к определённому домену
- поддерживает бесконечное количество «посетителей» сайта, каждый посетитель может выбирать одного из предлагаемых специалистов на данноме домене
- специалист имеет один активный канал и список находящихся в режиме ожидания, при этом он видит когда поступают новые сообщения на другие каналы, сколько из там уже накопилось
- специалист может в любой момент переключиться на другой канал, при этом текущий ставится как-бы на паузу. Переключившысь на ранее спящий канал, специалист получает все сообщения с него
- все каналы, даже в режиме паузы, продолжают принимать сообщения.
- благодаря ajax-чтению ответов в браузере посетителя, сессия не устаревает и не обрывается
- всё это работает через одну форму на сайте, одну закладку специалиста и всего один мастер-аккаунт для серверной части
- две дополнительные команды для специалиста:
- «?» — специалист может получить список всех своих каналов с некоторой статистикой
- «=N» — переключиться на канал N, например «=2» — переключиться на второй канал, ставя текущий на паузу.
Этот код я сделал больше с ознакомительной целью, чтобы понять как оно работает и что из этого можно в будущем досочинять. Поэтому может быть и в коде, и в базе данных можно что-то улучшить и додумать.
Известные проблемы, которые я допускаю для этой альфы:
- Плохо соединяется с GTalk и LiveJournal, но на сколько я понял, с ним проблемы в последние дни не только у меня.
- Внешняя часть посетителя – та что ajax-формочка в браузере – не работает под IE. Не хотелось под IE доделывать, и javascript-программист из меня тот ещё, поэтому те кто знаю – поправят ajax очень быстро или поставлят jquery/prototype, ну а потом это пример скорее о jabber-приёмах, а не об ajax в ослике =)
- Я пробовал работать через jabber.ru — он иногда подтормаживает или тогда начинает переправлять сообщения с задержкой, лучше используйте свои сервера.
- Скорее всего могут быть ещё какие-то ошибки, пока же делюсь тем что есть.
Мысли по доработке:
- Автоответчики на клиенте (у посетителя), когда статусы стоят N/A или DnD.
- Переброска клиента между специалистами. Делается очень просто – сменой ответственного аккаунта специалиста. Может пригодиться если клиент стучится не по адресу.
- При выделении нового канала для общения желательно чистить историю в messages, или перебрасывать её в специальное хранилище, иначе может получиться путаница между старыми каналами которые открыты и активны более 24 минут (стандартное время жизни сессии) и новыми каналами.
- Привести в приличный вид внешюю форму.
- Сделать статистику и отчёты по работе специалистов.
Состав по файлам:
- /index.php — файл с формой, его надо ставить на сайте
- /config.php — в данном случае в конфиге только база данных
- /server/index.php — Jabber-клиент, выступающий в качестве сервиса
- /server/config.php — конфигурация мастер-аккаунта, и общие настройки работы
- /jabber_chat.sql — дамп базы данных
Тестировал на:
- Браузеры: FF3, Opera10, Safari, Chrome
- Сервер: FreeBSD 6.2, PHP 5.2.4, MySQL 4.1.21
- Jabber-клиент: QIP Infium 9022
UPD2: закрываю демку, страшно -)
Код распространяется под LGPL.

комментарии (59)