XMPPHP в качестве живого чата поддержки

Моя идея состоит в том, чтобы интегрировать чат поддержки на веб-сайт. Текст пользователя отправляется с помощью xmpphp моему клиенту jabber с идентификатором отправителя jabberbot, и если я отвечаю, бот jabber принимает мой ответ и передает текст пользователю.

Есть всего лишь одна проблема. Как разделить разных пользователей или разные чаты? Я не хочу, чтобы все пользователи видели ответ, но пользователь, который спрашивает. Есть ли какой-то уникальный идентификатор чата или другая возможность, которую я мог просто пропустить?

Пользователь => Веб-сайт => Чат-бот => я

Я хочу ответить и отправить обратно пользователю, но как мне узнать правильного пользователя из моего ответа?


person Oliver    schedule 11.01.2013    source источник
comment
Я не вижу, чего вам здесь не хватает!! это зависит от того, сохраняете ли вы свой чат в файлах (включая xml) или в базе данных, и если да, то какую структуру вы построили?   -  person mamdouh alramadan    schedule 11.01.2013
comment
Проблема в том, чтобы отправить мой ответ от чат-бота нужному пользователю.   -  person Oliver    schedule 11.01.2013
comment
Хорошо, я же сказал, что это зависит от отношений между пользователями и чатами. так что вы рассмотрели?   -  person mamdouh alramadan    schedule 11.01.2013
comment
Вы понимаете проблему. :-) Я могу сгенерировать какой-то идентификатор сеанса, но как мне сохранить его согласованность внутри протокола чата?   -  person Oliver    schedule 11.01.2013
comment
если вы имели в виду, я понимаю проблему. на самом деле не так много. до сих пор не ясно для меня, что вам нужно.   -  person mamdouh alramadan    schedule 11.01.2013
comment
Допустим, пользователь заходит на мою страницу, нажимает кнопку чата, набирает текст. Текст отправлен в мой jabber мессенджер. Все идет нормально. Теперь я отвечаю, чат-бот получает ответ. Как чат-бот может узнать, какой пользователь ждет этого ответа?   -  person Oliver    schedule 11.01.2013
comment
учитывая, что с каждым процессом (отправка и получение сообщения чата) назначается уникальный идентификатор (или токен), который уже скопирован как ссылка на идентификацию пользователя, поэтому ваш jabber теперь будет знать, какой пользователь должен получить сообщение обратно.   -  person mamdouh alramadan    schedule 11.01.2013
comment
рассмотрите возможность использования библиотеки Javascript XMPP, такой как Strophe, вместо XMPPHP   -  person Alex    schedule 11.01.2013
comment
@mamdouhalramadan И тогда я должен писать это от руки перед каждым сообщением? @ alex И что это изменит, кроме того, что я должен писать данные для входа на главную страницу?   -  person Oliver    schedule 12.01.2013
comment
вы можете сделать функцию для выполнения вашей работы. функция, которая срабатывает всякий раз, когда кто-то делает сообщение в чате.   -  person mamdouh alramadan    schedule 12.01.2013
comment
Хорошо, с самого начала: 1. Пользователь XY начинает чат и отправляет текстовое сообщение 2. Я получаю сообщение 3. Я отвечаю 4. Бот получает мой ответ 5. Пользователь получает мой ответ от бота. Я могу, конечно, отправить идентификатор с моим сообщением от пользователя, но это не моя проблема. Моя проблема в том, как я могу быть уверен, что мой ответ будет отправлен пользователю с открытым окном чата, а не кому-либо еще с открытым окном чата. Я получаю идентификатор, но мне нужно поставить этот идентификатор перед своим ответом, чтобы бот знал - это для пользователя XY. Вот почему я спрашиваю, является ли сеанс каким-то уникальным, чтобы я мог его использовать.   -  person Oliver    schedule 12.01.2013
comment
@Oliver: ваше приложение будет масштабироваться намного лучше. Потому что библиотека Xmpp работает на клиенте (браузере), а не на вашем сервере.   -  person Alex    schedule 12.01.2013
comment
Оливер, вас беспокоит конкретная реализация с использованием именно двух продуктов, которые вы упомянули (Jabber и XMPPHP), или вы спрашиваете о маршрутизации контрактов между подключенными ресурсами и очередями сообщений/публикацией-подпиской? (например, многие системные администраторы используют чат-терминалы для управления удаленными ресурсами через чат-команды)? Последнее я мог бы сделать, но с первым у меня не было никакого опыта. Однако, если вы открыты для других подходов или установок...   -  person Jared Farrish    schedule 14.01.2013
comment
Некоторые быстрые исследования показали, что XMPP использует имя пользователя для адресации сообщений. Что вы, вероятно, захотите сделать, так это создать уникальное имя пользователя для каждого сеанса, и тогда сообщения не будут отображаться для всех пользователей, как если бы они использовали общее имя пользователя.   -  person Thom Wiggers    schedule 14.01.2013
comment
Вы также ознакомились с документами RFC, в которых указывается XMPP? Они доступны здесь xmpp.org/xsf/press/2004-10-04. shtml и, вероятно, главным образом ietf.org/rfc/rfc3920.txt актуально.   -  person Thom Wiggers    schedule 14.01.2013
comment
Решение будет таким: когда новый клиент делает запрос, создайте случайный идентификатор сеанса, запишите его в базу данных (mysql, memcached, что угодно). Таблица 1: ClientName, SessionId, SupporterName (бот должен сначала выбрать сторонника), LastMessageTime Таблица 2: SessionId, Messge, To (клиент/поддерживающий) Чат-бот работает 24/7 как приложение php cli. Бот будет всю секунду читать базу данных для новых сообщений стороннику и отправлять эти сообщения и сообщения от сторонника, которые необходимо записать в базу данных. Но с этим решением сторонник может иметь только одного клиента одновременно.   -  person GreenRover    schedule 17.01.2013
comment
Чтобы иметь несколько клиентов одновременно для одного сторонника, вам необходимо отправить только сообщение XMPP одному или нескольким сторонникам со ссылкой на веб-чат. Затем давайте пообщаемся с сторонником в веб-приложении.   -  person GreenRover    schedule 17.01.2013


Ответы (4)


В прошлый раз, когда мне приходилось решать эту проблему, я использовал эту архитектуру:

введите здесь описание изображения

Увеличить изображение

Веб-сервер предоставляет JavaScript/jQuery или флеш-чат.

После запуска чата клиент запрашивает у сервера все 1 секунду для новых сообщений.

Альтернатива опросу за 1 секунду

Если для вас это медленно, взгляните на websockets.

http://martinsikora.com/nodejs-and-websocket-simple-chat-tutorial

http://demo.cheyenne-server.org:8080/chat.html

Но веб-сокеты не могут быть предоставлены php. Там вам нужно заменить php + apchache на node.js или java.

Обычный метод HTTP PHP

В PHP вы подключитесь к PsyBnc, который будет опрашивать сообщения от сторонника для вас.

PsyBnc — это IRC бот.

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

Я бы использовал что-то вроде этого:

http://pear.php.net/package/Net_SmartIRC/download

<?php
session_start();

$message = $_GET['message'];
$client_name = $_GET['client_name'];

if (empty($_SESSION['chat_id'])) {
    $_SESSION['chat_id'] = md5(time(). mt_rand(0, 999999));
}

if (empty($_SESSION['supporter'])) {
    // how do you select the supporter? 
    // only choose a free?
    // We send first message to all supporter and the first who grapped got the chat (where only 3 gues)
}

$irc_host = "127.0.0.1";
$irc_port = 6667; // Port of PsyBnc
$irc_password = "password_from_psy_bnc";
$irc_user = "username_from_psy_bnc";

include_once('Net/SmartIRC.php');

class message_reader
{
    private $messages = array();

    public function receive_messages(&$irc, &$data)
    {
        // result is send to #smartirc-test (we don't want to spam #test)
        $this->messages[] = array(
            'from' => $data->nick, 
            'message' => $data->message,
        );  
    }

    public function get_messages() {
        return $this->messages;
    }
}

$bot = &new message_reader();
$irc = &new Net_SmartIRC();
$irc->setDebug(SMARTIRC_DEBUG_ALL);
$irc->setUseSockets(TRUE);
$irc->registerActionhandler(SMARTIRC_TYPE_QUERY|SMARTIRC_TYPE_NOTICE, '^' . $_SESSION['chat_id'], $bot, 'receive_messages');
$irc->connect($irc_host, $irc_port);
$irc->login($_SESSION['chat_id'], $client_name, 0, $irc_user, $irc_password);
$irc->join(array('#bitlbee'));
$irc->listen();
$irc->disconnect();

// Send new Message to supporter
if (!empty($message)) {
    $irc->message(SMARTIRC_TYPE_QUERY, $_SESSION['supporter'], $message);
}

echo json_encode(array('messages' => $bot->get_messages()));

Подключить мессенджер службы поддержки к PHP

У нас уже есть IRC-соединение с PsyBnc, теперь нам нужно отправлять сообщения из IRC в ICQ, XMPP, GOOGLE TALK, MSN, YAHOO, AOI...

Вот хорошее решение под названием BitlBee. BitlBee предлагает IRC-сервер, который может передавать сообщения почти со всеми протоколами мгновенных сообщений и на них. Псевдонимы этих учетных записей. Например вам для вашей системы нужен только 1 серверный аккаунт в google talk, icq... и вообще ваш саппорт в баддлист этих аккаунтов. Теперь BitleBee будет предоставлять ваш боддилист в виде IRC-чата.

person GreenRover    schedule 17.01.2013

Ваши требования довольно запутанны. Как сказал Джошуа, для этого вам не нужен бот Jabber. Все, что вам нужно, это сервер Jabber, который у вас уже должен быть. Что вы делаете, так это создаете временную учетную запись пользователя sessionid@*yourdomain.com* всякий раз, когда используется функция чата, а затем вы можете просто отвечать на любое входящее сообщение, как обычно, в то время как клиент вашего веб-сайта может получить сообщения, предназначенные для него всякий раз.

В качестве альтернативы вы можете создать одну учетную запись пользователя — qa@yourdomain.com — и использовать идентификаторы ресурсов XMPP для части маршрутизации. XMPP допускает что-то вроде qa@yourdomain.com/*sessionid*, и вы должны указать своей библиотеке XMPP запрашивать только определенный ресурс. Большинство клиентских программ XMPP также по умолчанию отвечают на определенный ресурс и, когда это применимо, открывают новый диалог. Этот метод менее «чистый», чем первый, но он будет работать несколько лучше, если по какой-то причине вы не можете произвольно создавать учетные записи пользователей.

person Magnus    schedule 14.01.2013

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

Я бы предложил применить на вашем веб-сайте какую-то библиотеку Javascript XMPP. Когда пользователь указывает, что он хотел бы поговорить с агентом, установите соединение с общедоступным сервером XMPP.

Оттуда у вас есть два варианта: прямой чат или конференц-залы.

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

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

XMPP — чрезвычайно гибкий протокол; на самом деле это просто вопрос выяснения того, чего вы хотите достичь.

person jmkeyes    schedule 14.01.2013
comment
Я думаю, вам удалось упомянуть все, кроме того, что нужно знать ОП, а именно, как ставить в очередь и удалять сообщения из очереди с помощью эффективной схемы маршрутизации. Это средняя часть, когда сообщение дошло до сервера, и Оливер не может смоделировать в уме, что делать и как правильно с этим справиться. - person Jared Farrish; 14.01.2013
comment
Я должен был более четко указать, что ему не нужна система очередей, поскольку она противоречит цели живого чата. Чат-бот как прокси не нужен. XMPP уже поддерживает автономный обмен сообщениями (постановка сообщения в очередь до тех пор, пока получатель не станет доступен). - person jmkeyes; 14.01.2013
comment
Затем вам нужно объяснить, как это работает на практике в вашем ответе. Вы не отвечаете на вопрос, который он задал выше, но иначе. Вы просто повторяете то, что он уже объяснил. - person Jared Farrish; 14.01.2013
comment
Особенно это не решает мою проблему. Мне пришлось бы зарегистрировать дюжину учетных записей и войти в систему со всеми из них. И как клиент javascript сможет общаться с агентом, не записывая данные для входа на страницу? Если я хочу поговорить с jabber-аккаунтом пользователя, я напишу jabber-адрес на странице. - person Oliver; 14.01.2013
comment
Автоматически зарегистрировать и аутентифицировать пользователя с помощью идентификатора сеанса несложно. - person jmkeyes; 14.01.2013

Я не знаю, какой сервер XMPP вы используете, но вы также можете попробовать плагин Fastpath и веб-чат для Openfire. Который предназначен для предоставления службы поддержки через XMPP.

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

person Robin    schedule 14.01.2013