XMPPHP作为实时支持聊天

时间:2013-01-11 15:15:19

标签: php xmpp pidgin xmpphp

我的想法是在网站上集成实时支持聊天。使用jabberbot发送者ID将用户文本与xmpphp一起发送到我的jabber客户端,如果我回答,jabber bot会接收我的答案并将文本传输给用户。

只有一个问题。如何分隔不同的用户或不同的聊天?我不希望所有用户都看到答案,但要求的用户。是否有一种独特的聊天ID或其他可能性,我可能只是错过了?

用户=>网站=> Chatbot =>我

我想回答并将其发回给用户,但如何从我的回答中找到正确的用户?

4 个答案:

答案 0 :(得分:4)

上次我必须解决这个问题时,我使用了这种架构:

enter image description here

Entlarge image

Webserver提供JavaScript / jQuery或flash聊天。

聊天开始后,客户端向服务器询问所有1秒钟的新消息。

1秒轮询的替代方案

如果这对您来说很慢,请查看websockets

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

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

但是Websockets无法通过php提供。因为你需要改变php + apchache agaist node.jsjava

普通HTTP PHP Methode

在PHP中,您将连接到PsyBnc,并为您查询来自支持者的消息。

PsyBncIRC机器人。

不直接连接到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

我们已经完成了与PsyBnc的IRC连接,现在我们需要从IRC发送消息到ICQ,XMPP,GOOGLE TALK,MSN,YAHOO,AOI ......

这是一个名为BitlBee的好方案。 BitlBee提供的IRC服务器可以从几乎所有即时消息传递协议传输消息。通过别名这些帐户。例如,您只需要系统中的1个服务器帐户google talk,icq ...以及所有支持这些帐户的好友列表的人。现在,BitleBee将提供您的boddylist作为irc聊天。

答案 1 :(得分:2)

您的要求相当混乱。正如约书亚所说,你不需要一个Jabber机器人。您只需要一台Jabber服务器 - 您应该拥有它。你做的是,每当使用聊天功能时你创建一个易变的用户帐户 sessionid @ * yourdomain.com *然后你可以回复任何传入的消息,就像你的网站客户端可以获取每当消息都意味着它。

或者,您可以创建一个用户帐户 - qa @ yourdomain.com - 并为路由部分使用XMPP资源标识符。 XMPP允许像qa @ yourdomain.com / * sessionid *这样的东西,你应该能够告诉你的XMPP库只查询特定的资源。大多数XMPP客户端软件也会默认回复特定资源,并在适用时打开新对话。这种方法不像第一种方法那么“干净”,但如果由于某种原因不能随意创建用户帐户,它会更好一些。

答案 2 :(得分:0)

据我所知,您希望在您的网站上设置实时聊天解决方案,以便访问者与您的特定代理商进行一对一聊天。

我建议在您的网站上应用某种Javascript XMPP库。当用户表明他们想要与代理交谈时,建立与面向公众的XMPP服务器的连接。

从那里,您有两种选择:直接聊天或会议室。

通过直接聊天,您的用户可以直接与已登录系统的座席通话。从那里,您的代理人可以照常与访客交谈。这种方法简单明了,但它是一对一的。 (您可能需要在多个代理之间进行负载均衡以获得大量流量。)

通过会议室,您的访客可以加入专用于该主题的特定会议室,您的座席可以在会议室中担任主持人。访问者可以提出问题并与您的代理商协作,或者他们可以与会议室中的代理人直接聊天。

XMPP是一种非常灵活的协议;这真的只是弄清楚你想要实现的目标。

答案 3 :(得分:0)

我不知道您使用的XMPP服务器,但您也可以尝试使用Fastpath plugin and webchat for Openfire。这意味着通过XMPP提供支持团队服务。

话虽这么说,你的问题本身似乎只意味着XMPP的标准聊天功能,它在两个用户之间。这只意味着支持人员与每个用户进行独特的聊天并提出问题。没有其他用户会看到该对话。