Общение с пользователями на ваших сайтах из одного окна Jabber

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

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

Тему эту я раскопал довольно глубоко, нашёл множество платных решений, и даже несколько глючных бесплатных вариантов. Но как-то было «не ice» от всего этого бедлама, да ещё и платить $100 не улыбалось.

Так вот вернёмся к нашему Jabber`у. Начал я с того, что стал ковырять исходники, но пятилетний перерыв в кодировании на C сказывался, и в конце концов всё закончилось гуглением на тему “Jabber PHP class”. Мои поиски увенчались успехом, и набрёл я Jabber Client Library от Centova Technologies Inc. На оф.сайте информации о библиотеке не нашёл, ну да не страшно.

Библиотека шла под лицензией LGPL, и мне этого было более чем достаточно. Пара примеров, тестов, несколько аккаунтов на разных jabber-серверах для тестирования скорости, и в результате у меня есть серверная часть которая умеет следующее:

Что есть на первом этапе

  1. Самописный Jabber-клиент запущен на сервере в режиме 24*7, благо полноценный root на dedicated-сервере позволяет ещё и не такое вытворять.
  2. Соединяется, общается с различными клиентами – хоть ботов пиши.
  3. Для начала обучил его нескольким командам:
    • exit – без этой команды сложно, тем более что сервис работает круглосуточно
    • whois – говорит как называется обращающийся к нему клиент, включая указание канала, поначалу полезно
    • time – время на сервере
    • online/away/dnd/xa – смена статуса Jabber-аккаунта на сервере
Ничего особенного получается что нет, но достаточно для того чтобы понять что теперь можно через Jabber-клиент выполнять на сервере любые предусмотренные команды, вплоть до SUDO =)

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

Общение с сайтами


Займёмся моментом общения на сайте. В чём могут быть проблемы? Ну как всегда проблемы мы себе сами придумываем, поэтому давайте определимся с целями:

  1. На сайте могут быть одновременно несколько посетителей, и здорово было бы с каждым и них общаться отдельно, чтобы один не мешал другому.
  2. Ещё одно «было бы круто если»: реализация своеобразной службы тех.поддержки, чтобы посетитель сайта мог выбирать одного из представленных специалистов и общаться с ним.
  3. Ну и если мы делаем такие удобства для посетителя, хочется чтобы и тех.поддержке было удобно. Поэтому нужно реализовать принцип «одна задача в один момент», то есть сделать что-то типа одного активного клиента, и режима ожидания для других посетителей сайта. При этом специалист должен иметь возможность свободно переключаться между активными посетителями, то есть отвечать то одному то другому.

Ладно, хватит задач, будем решения придумывать


Сначала подумаем как это сделать Имеем: несколько специалистов и несколько посетителей. Значит нужны будут каналы, один канал привязывает одного посетителя к одному специалисту. При этом один посетитель имеет всегда один канал, у специалиста же может быть одноврменно несколько каналов.

Первое и самое простое решение: поназаводить 10-20 аккаунтов для специалиста, и потом учитывать их все на сервере. Решение простое, и достаточно хорошее – отдельные закладки в клиенте и прочеее. Но меня коробило одно: заводить аккаунт на сервере для добавления нового канала – не хорошо. Хотелось сделать каналы полностью виртуальными.

Хотелось, и сделал.


Денёк позабавлявшись с кодом, имеем:
  1. Jabber-клиент написан на PHP
  2. запускается на сервере, взаимодействует с базой данных MySQL (хранение истори, активные каналы, специалисты)
  3. имеет один master-аккаунт – то есть вся система работает через один jabber-аккаунт на любом из публичных серверов
  4. клиент поддерживает выполнение удалённых команд, как было описано выше
  5. поддерживает бесконечное количество «специалистов», каждый специалист может быть привязан к определённому домену
  6. поддерживает бесконечное количество «посетителей» сайта, каждый посетитель может выбирать одного из предлагаемых специалистов на данноме домене
  7. специалист имеет один активный канал и список находящихся в режиме ожидания, при этом он видит когда поступают новые сообщения на другие каналы, сколько из там уже накопилось
  8. специалист может в любой момент переключиться на другой канал, при этом текущий ставится как-бы на паузу. Переключившысь на ранее спящий канал, специалист получает все сообщения с него
  9. все каналы, даже в режиме паузы, продолжают принимать сообщения.
  10. благодаря ajax-чтению ответов в браузере посетителя, сессия не устаревает и не обрывается
  11. всё это работает через одну форму на сайте, одну закладку специалиста и всего один мастер-аккаунт для серверной части
  12. две дополнительные команды для специалиста:
    • «?» — специалист может получить список всех своих каналов с некоторой статистикой
    • «=N» — переключиться на канал N, например «=2» — переключиться на второй канал, ставя текущий на паузу.
Качаем, смотрим, изучаем, развиваем. — 36 KB

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

Известные проблемы, которые я допускаю для этой альфы:
  1. Плохо соединяется с GTalk и LiveJournal, но на сколько я понял, с ним проблемы в последние дни не только у меня.
  2. Внешняя часть посетителя – та что ajax-формочка в браузере – не работает под IE. Не хотелось под IE доделывать, и javascript-программист из меня тот ещё, поэтому те кто знаю – поправят ajax очень быстро или поставлят jquery/prototype, ну а потом это пример скорее о jabber-приёмах, а не об ajax в ослике =)
  3. Я пробовал работать через jabber.ru — он иногда подтормаживает или тогда начинает переправлять сообщения с задержкой, лучше используйте свои сервера.
  4. Скорее всего могут быть ещё какие-то ошибки, пока же делюсь тем что есть.
Мысли по доработке:
  1. Автоответчики на клиенте (у посетителя), когда статусы стоят N/A или DnD.
  2. Переброска клиента между специалистами. Делается очень просто – сменой ответственного аккаунта специалиста. Может пригодиться если клиент стучится не по адресу.
  3. При выделении нового канала для общения желательно чистить историю в messages, или перебрасывать её в специальное хранилище, иначе может получиться путаница между старыми каналами которые открыты и активны более 24 минут (стандартное время жизни сессии) и новыми каналами.
  4. Привести в приличный вид внешюю форму.
  5. Сделать статистику и отчёты по работе специалистов.
Состав по файлам:
  • /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
UPD: здесь видно интерфейс, настроен на мой аккаунт — прошу не спамить

UPD2: закрываю демку, страшно -)

Код распространяется под LGPL.
+78
31 января 2009, 21:53
138

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

+1
spyfzm #
А живой пример для теста есть?
0
iliacmd #
Подборка плагинов для jquery в одном архиве
depositfiles.com/files/p4n63yqqg
0
spyfzm #
Нечаянно минусанул, извиняюсь =(
Это же не живой пример, а архив плагинов. Живой пример был, теперь нет.
+1
mishinoleg #
прошу не спамить, на мой аккаунт настроено пока
+1
spyfzm #
«Каналы» со стороны специалистов — это разные ресурсы типа bot-jid@server.com/specialist1, наверное, или вы какой-то велосипед придумали?
0
mishinoleg #
не-не, специалист — это одно, а канал — это другое в данном случае.
Хотя то что вы предлагаете я понял, и тоже об этом думал, но это во-первых потребовало бы либо разные учётки на каждого специалиста и набор каналов, либо если учётка всёже одна а специалистов много и каналов много… тогда что — создавать их бесконечно?
0
spyfzm #
не-не-не-не-не! Аккаунт на сервере — один, спец 1 подключается к аккаунту любым клиентом, не только вашим, с ресурсом spec1, клиент видит его онлайн как «специалист номер 1» без всякого намека на джаббер. Спец 2 подключается с другой машины к тому же аккаунту с ресурсом spec2, причем первый остается в сети и продолжает общаться со своими клиентами.
Но имхо, все это глупости. Поднимайте джаббер сервер сами или ставьте гуглаппс и давайте каждому спецу по аккаунту, выделив клиентам один аккаунт со случайно генерируемыми ресурсами. на сайте ражмещаете виджет, настроенный на коннект с этим аккаунтом, в список контактов — всех спецов, показывать только тех, кто в сети. ИМХО так было бы правильнее.
0
mishinoleg #
да, всё это я проходил — всё это можно,
это всего лишь как вы выразились «Велосипед», интересно было решить задачку одним окном, может в будущем пригодится

а цель-то стояла сначала просто библиотеку посмотреть, всё что дальше пошло — как-то само получилось =)
0
stoune #
bot-jid@server.com/specialist1 то что specialist1 — это ресурс в терминологии XMPP. но позволяет их под одной учётной записи сидеть нескольким пользователям. Ресурсам можно задавать также приоритеты.
0
spyfzm #
Спасибо, но уже давно знаю.
НЛО прилетело и опубликовало эту надпись здесь
+4
mishinoleg #
пока никуда не устанавливал, просто упражняюсь
а в будущем… две тысячи в день вас устроит?
НЛО прилетело и опубликовало эту надпись здесь
+3
mishinoleg #
а при чём здесь посещаемость, что-то я не уловил
НЛО прилетело и опубликовало эту надпись здесь
+6
dmitryus #
ну вот обязательно найдется человек которому скучно но при этом вместо того чтобы сесть и придумать хотя бы велосипед будет со скуки с… ть в комментах с умным видом, «просто от желания чего нитиь этакое» умное сказать.
НЛО прилетело и опубликовало эту надпись здесь
–4
dmitryus #
Ну в общем у меня тоже грубовато получилось…
0
usetester #
Вы удивитесь, но нужда в чате с посетителем корреляции с количеством этих посетителей не имеет :) Если вы продаете товар десяток килобаксов — то нужно увешаться чатами, чтобы обхаживать каждого зашедшего…
0
stoune #
Я думаю что при продажах в 10-к килобаксов пользователь купит решение от Jive. А как proof of concept статья может сойти, посему заплюсовал.
–1
small_jam #
Не хотите подумать о привязке comet'a?
С вас сервер, с меня клиент :)
0
mishinoleg #
всегда можно попробовать, честно говоря не думал так серьзно, если что — пишите в личку
+2
bogus92 #
Какое совпадение! Неделю назад получил заказ на создание онлайн службы тех. поддержки по ICQ и Mail.ru агенту. Я, естественно, сразу решил все делать через Jabber. Начал гуглить по поводу php+jabber, нашел эту же библиотеку, сделал все через JQuery, долго думал как заставить скрипт работать постоянно, ведь нельзя прерывать соединение. Вобщем при загрузке страницы запускал в фоне через AJAX скрипт который через БД отправляет и получает сообщения которые обрабатывает та же форма через AJAX. Все, казалось бы работает отлично, пока я не решил попробовать запустить 2 раза скрипт одновременно, как от двух клиентов. И тут, как говорят в простонародье, облом! Скрипт не хотел запускаться второй раз в фоне и все сообщения со второго клиента шли к первому, что не очень приятно. Потом глянул, как устроены другие онлайн клиенты Jabber, в частности JWChat. Он работает без всяких серверных скриптов, только JS и это очень сильно меня удивило. Почитав документацию я узнал у такой штуке, как HTTP-Bind, который позволяет подключатся к серверу, но при этом не держать активного соединения, что очень удобно в данном случае. Начал гуглить по этому поводу и нашел библиотеку Lightr, однако она находится в состоянии альфа и в ней очень много глюков, сейчас вот сижу их правлю, чтобы заработало.
0
Rommidze #
Попробуйте почитать про http streaming. Правда оно не дружит с AJAX а IE, и оно постоянно держит открытый коннект. Мы с использованием этой технологии пишем чат сервис. Оно уже более-менее работает, и даже держит до 350 человек одновременно на стареньком p3 сервере.
0
stoune #
Не надо зацикливатся на PHP.
Посмотрите не этот клиент www.igniterealtime.org/projects/sparkweb/index.jsp

+2
cucik #
Сплошные наезды на автора :)
От себя скажу автору спасибо. Для меня сейчас как раз востребован вопрос удобной online связи посетитель-тех. поддержка.
Рассматривал как вариант продукты LiveChat, но платить денюжки за это пока не хочется. После этой статьи решил делать все самому. Допилить малость ваш вариант и будет вполне удобный, работоспособный инструмент.
0
mishinoleg #
спасибо, этого я и хотел добиться, это всё равно далеко не готовый инструмент, но тем не менее хороший примерчик чтобы что-то делать.
–1
stoune #
Если не зацикливатся на PHP тем более дедик имееете то можете найти значительно больший спектр готовых решений, например:
www.igniterealtime.org/projects/sparkweb/index.jsp
code.stanziq.com/speeqe
code.stanziq.com/punjab

Уровень решения выбираете по своей потребности.
0
uMg #
эхх изкоропки это умеет сервер openfire + флешевый клиент из комплекта…
+1
Britannic #
В самом простом виде такая фишка реализована в проекте hab.la
Когда то появлялась статья на хабре в его пользу…
0
dimiork #
Не хотелось бы сбивать с такой правильной идеи, как то что Вы задумали на Jabber- протоколе, но если нужно готовое и бесплатное, то погуглите на запрос: siteheart… Люди пользуются…
А Вам браво! :)
+1
ColorPrint #
Штука хорошая, но то что привязана к своему собственному клиенту — не радует
+1
mkevac #
Похоже всё-таки заспамили? Сейчас по адресу возвращается 404.
+3
mishinoleg #
убрал потому что пошли запросы с инъекциями, у нас народ некультурный оказался.
НЛО прилетело и опубликовало эту надпись здесь
+1
Thoggen #
Все тоже самое проще и быстрее с помощью Google ChatBack Bages не получится?
0
frenzis #
попробовал, потыкал, как то коряво работает, не впечатлило…
0
ColorPrint #
угу, пользуюсь, удобная штука.
планировал полностью саппорт сделать через Google Apps, но в данный момент останавливает то что с конца прошлого года транспорты аськи не работают через gtalk, а поддержка аськи тоже нужна :(
0
etc #
Идея очень интересная, но реализовать нужно попробовать на более эффективных для этого дела языках (тот же демон-клиент) :)
+1
Zhilinsky #
hab.la/ — видели?
0
mishinoleg #
видимо стоит всёже мне посмотреть =)
0
AHrEJI #
Хм… а что если попробовать развить эту идею немного в другую сторону?
Было бы неплохо иметь веб-чат, который бы подключался к конференции в джаббере. Конечно, в связке с собственным сервером джаббера.
Чтобы желающие монгли общаться либо через веб, либо через свой любимый Jabber-клиент
0
mishinoleg #
запросто реализуется, даже на основе уже приведённых в моём коде функциях, хотите попробовать?
0
AHrEJI #
Да, хотелось бы… жаль знаний не хватает пока :)
+1
AlexeyTokar #
0
deGreeZ #
извините за занудство, но «При этом ожин посетитель имеет всегда один канал...»
глаз споткнулся =)
–1
AlexeyTokar #
можете так же попробовать заточить наш сервис под свои нужды, создав отдельную комнату для целей поддержки пользователей, назначив на нее админов и повесив соответствующую ссылку на своей странице.

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

Используя данный подход Вы сможете поддерживать пользователей и из своих десктопных Jabber клиентов (на данный момент адрес конференции можно посмотреть в сурсе страницы в переменной ROOM_NAME)
0
mishinoleg #
интересно, молодцы, хорошая идея, и реализация на уровне,
а почему так долго появляется первая выдача? вроде и выдачу не готовите, и сайт внешний не опрашиваете, но что-то долго.
И… да, если бы можно было с одной стороны запросить ваш виджет при помощи допустим XHR и показать пользователю, а с другой иметь некий удобоворимый интерфейс подключения Менеджера — это было бы как раз решение задачи.

Но вы всё равно молодцы, беру ваш проект на заметку.
0
AlexeyTokar #
первый раз подгружается довольно увесистая библиотека — из-за этого так долго. Вообще там еще много места для оптимизации — будем работать над этим

з.ы. А что Вы имеете ввиду над «некий удобоваримый интерфейс подключения Менеджера»?
0
mishinoleg #
интерфейс — какое-то клиентсвое приложение, не будет же менеджер сайта сидеть постоянно в браузере чтобы общаться с посетителями, поэтому нужно приложние, желательно со звуковыми уведомлялками чтобы не проспать посетителя, я так себе это представляю
0
AlexeyTokar #
Вам никто уже сейчас не запрещает использовать любой клиент, поддерживающий XMPP, для общения в этих чатах
0
shandor #
Ребята, молодцы, что поддерживаете технологию jabber!
Очень раз был увидеть список сервисов в браузере psi на сервере chat.ru.
Я думаю вам следует анонсировать эту фичу на хабре как очень хороший пример использования jabber-технологий.
0
NAZGULhabr #
Прикольно. У меня джаббер встроенный уже 2 года висит на сайте. Штука приятная, но пока протестить как следует не получается, еще не рекламил сайтик. Джаббер используется и для суппорта и просто для общения между собой, учётка выдаётся при регистрации на сайте. Естественно реализована функция добавления в список друзей, удаление из списка, возможность отправления мессаги без добавления в списки, а также видно онлайн человек или офлайн. :)
0
mishinoleg #
ну вот видите, оказывается всё уже придумано до нас,
если бы в поисковик не пришлось вписывать фразы из слов, а задавать сразу мысле-формы — может быть решения находились бы гораздо быстрее.
0
NAZGULhabr #
ага придумано… прогеры тыкались не один день прежде чем зделали. :) Штука очень удобная.
0
mpro #
Вопрос. Может для решения этой задачи будут проще воспользоваться ajaxim.com/?
0
delaf #
я на сайте поставил https://siteheart.com/
В целом готовый продукт, замечаний серьездных нет.
0
Arsenichev #
Когда то так же «заморочились» jabber чатом для сайта — итог появился стартап Cloudim. Для кого то будет полезно, так как пока мы полностью бесплатны, а потом free аккаунт лимитом на число операторов.
0
vario #
джабер — это хорошо, но пока не популярно

делал аналогичную систему но для icq — очень удобно для поддержки юзеров (особенно если точки входа еще 2 — мыло и форма в личном кабинете)

но постоянная смена протоколов icq убила идею

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.