首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMPPHP作为实时支持聊天

XMPPHP作为实时支持聊天
EN

Stack Overflow用户
提问于 2013-01-11 23:15:19
回答 4查看 1.9K关注 0票数 0

我的想法是在网站上集成一个实时支持聊天。用户的文本通过xmpphp发送到我的jabber客户端,如果我回答,jabber bot就会接受我的回答,并将文本传输给用户。

只有一个问题。如何分隔不同用户或不同聊天?我不想让所有用户都看到答案,而是让提出问题的用户看到答案。有没有一种唯一的聊天id或其他可能,我可能刚刚错过了?

User =>网站=>聊天机器人=> me

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-17 16:41:38

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

Entlarge image

The服务器提供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。在那里,你需要把node.jsjava改成php + apchache。

纯HTTP PHP方法

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

PsyBnc是一个IRC机器人。

不直接连接到XMPP或BitlBee的原因是这些协议不喜欢摆动连接,断开与PHP的连接。因为您不能保持会话处于活动状态,所以您需要一些针对频繁和短连接的东西。这是PsyBnc。

我会使用类似这样的东西:

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

代码语言:javascript
复制
<?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,现在我们需要从互联网资源中心发送消息到ICQ,XMPP,GOOGLE TALK,MSN,YAHOO,AOI…

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

票数 4
EN

Stack Overflow用户

发布于 2013-01-14 22:20:54

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-01-14 09:16:40

据我所知,你想在你的网站上有一个实时聊天解决方案,将允许你的访问者与你的一对一的特定代理聊天。

我建议将某种Javascript XMPP库应用到您的网站上。当用户指示他们想要与代理对话时,建立到面向公众的XMPP服务器的连接。

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

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

有了会议室,您的访问者可以加入一个专门讨论该主题的特定房间,您的代理可以成为该房间的主持人。访客可以提出问题并与您的座席协作,或者他们可以与房间中的座席直接交谈。

XMPP是一种非常灵活的协议;它实际上只是弄清楚您想要实现什么的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14281047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档