【问题标题】:XMPPHP as live support chatXMPPHP 作为实时支持聊天
【发布时间】:2012-12-26 04:55:48
【问题描述】:

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

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

用户 => 网站 => 聊天机器人 => 我

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

【问题讨论】:

  • 我看不出你在这里缺少什么!!这取决于,您是将聊天保存在文件(包括 xml)还是数据库中,如果是,您构建的结构是什么?
  • 问题是将我的答案从聊天机器人发送给正确的用户。
  • 好的,我告诉过你这取决于用户和聊天之间的关系。那你考虑了什么?
  • 你得到了问题。 :-) 我可以生成某种会话 id,但是如何在聊天协议中保持它的一致性?
  • 如果你的意思是我得到了问题。其实没那么多。我仍然不清楚你的需求是什么。

标签: php xmpp pidgin xmpphp


【解决方案1】:

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

Entlarge image

网络服务器提供 JavaScript / jQuery 或 flash 聊天。

聊天开始后,客户端在 1 秒内向服务器询问新消息。

1 秒轮询的替代方案

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

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

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

但是 php 无法提供 Websockets。那里你需要改变 php + apchache agaist node.jsjava

普通 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

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

这是一个很好的解决方案,名为BitlBee。 BitlBee 提供了一个 IRC 服务器,可以在几乎所有即时消息协议之间传输消息。通过给这些帐户起别名。例如,您的系统只需要 1 个在 google talk、icq 的服务器帐户……以及您的支持者到这些帐户的好友列表。现在 BitleBee 将提供您的 boddylist 作为 irc 聊天。

【讨论】:

    【解决方案2】:

    我不知道您使用的是什么 XMPP 服务器,但您也可以试试Fastpath plugin and webchat for Openfire。这旨在通过 XMPP 提供支持团队服务。

    话虽如此,您的问题本身似乎仅暗示了 XMPP 的标准聊天功能,即两个用户之间的聊天功能。这只是意味着支持人员与每个提出问题的用户进行独特的聊天。其他用户不会看到该对话。

    【讨论】:

      【解决方案3】:

      您的要求相当混乱。正如 Joshua 所说,您不需要 Jabber 机器人。您所需要的只是一个 Jabber 服务器——您应该已经拥有了。您所做的是,每当使用聊天功能时,您都会创建一个不稳定的用户帐户 sessionid@*yourdomain.com*,然后您可以像往常一样回复任何传入的消息,而您的网站客户端可以获取随时发送给它的消息。

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

      【讨论】:

        【解决方案4】:

        据我了解,您希望在您的网站上有一个实时聊天解决方案,让您的访问者可以与您的特定代理进行一对一的聊天。

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

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

        通过直接聊天,您的用户将直接与已登录系统的代理交谈。从那里,您的代理可以正常与访客交谈。这种方法简单明了,但它是一对一的。 (对于大量流量,您可能必须在多个代理之间进行负载平衡。)

        通过会议室,您的访客可以加入专门讨论该主题的特定房间,您的代理可以在该房间中担任主持人。访客可以提出问题并与您的代理合作,或者他们可以与房间中的代理直接聊天。

        XMPP 是一个非常灵活的协议;这实际上只是弄清楚您想要实现的目标的问题。

        【讨论】:

        • 我想你已经设法提到了除了 OP 需要知道的所有内容,即如何使用有效的路由方案对消息进行排队和出列。这是中间部分,当消息到达服务器时,Oliver 无法在脑海中建模要做什么以及如何正确处理它。
        • 我应该更清楚地表明他不需要排队系统,因为它违背了“实时”聊天的目的。 “作为代理的聊天机器人”是不必要的。 XMPP 已经支持离线消息传递(排队消息直到接收者可用)。
        • 那么你需要在你的答案中解释它在实践中是如何工作的。否则,您还没有回答他上面提出的问题。你只是在重复他已经解释过的内容。
        • 尤其是这并不能解决我的问题。我将不得不注册十几个帐户并保持所有这些帐户的登录状态。 javascript 客户端如何在不将登录数据写入页面的情况下与代理交谈?如果我想和用户的jabber账号通话,我会在页面上写下jabber地址。
        • 使用会话 ID 自动注册和验证用户很简单。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 2014-03-24
        相关资源
        最近更新 更多