Python 基于XMPP的Django实时聊天系统

Python 基于XMPP的Django实时聊天系统,python,django,xmpp,Python,Django,Xmpp,我需要在Django中实现一个基于XMPP的实时聊天系统。经过一位同事的反复研究和思考,我们得出了这个结论 使用bot的方法: 当访问者访问该站点时。访客的XMPP客户端(在本例中为Strophe.JS)开始与XMPP服务器的XMPP over BOSH连接,并连接到名为@conference.demo.com的房间。目前房间里没有其他人 访问者向Django发出带有自定义访问者id的分析请求 Django视图将访问者id存储在名为ActiveUsers的表中。此表包含一个名为status的

我需要在Django中实现一个基于XMPP的实时聊天系统。经过一位同事的反复研究和思考,我们得出了这个结论


使用bot的方法:

  • 当访问者访问该站点时。访客的XMPP客户端(在本例中为Strophe.JS)开始与XMPP服务器的XMPP over BOSH连接,并连接到名为
    @conference.demo.com
    的房间。目前房间里没有其他人
  • 访问者向Django发出带有自定义访问者id的分析请求
  • Django视图将访问者id存储在名为
    ActiveUsers
    的表中。此表包含一个名为
    status
    的新字段。它将
    状态设置为
    非活动状态
  • 此型号通过
    save
    方法发送信号
  • 这个信号被连接到XMPP服务器并加入房间
    @conference.demo.com
    的机器人接收。现在我们在房间里有了用户和机器人
  • 站点支持人员将登录到其web界面
  • 他们有JS代码,可以长时间轮询Django站点以检查
    ActiveUsers
    。它从表中获取行并显示。(我想用这个)
  • 当访问者键入消息时,它通过XMPP over BOSH到达XMPP服务器,房间中的jabber机器人会看到此消息并将
    ActiveUsers
    表中记录的状态更新为
    ACTIVE
  • 如前所述:站点支持人员有JS,JS一直在轮询这个表。它开始闪烁ow以显示用户正在聊天
  • 支持人员现在可以双击该行,这样就开始了到访客房间的XMPP over BOSH连接。它知道房间是
    @conference.demo.com
  • 机器人看到支持人员已加入房间,更新
    ActiveUsers
    记录以显示
    聊天
    。这确保房间内最多只能有支持人员,即房间被占用
  • bot将消息记录到Django表中
  • 当两个用户都看到两个用户都已离开房间时,它将删除该记录
ejabberd或openfire将是XMPP服务器。 Apache是一种web服务器,它运行mod_wsgi为Django提供服务,并运行mod_代理将XMPP over BOSh请求代理到XMPP服务器

这听起来像是一个很好的方法吗?有什么建议吗?我担心Django系统的负载

(太长了,对不起。)


使用状态节的方法:

在客户端,我使用支持状态的strophejs库,并且添加了回调方法。我可以灵活地使用ejabberd或openfire作为我的XMPP服务器。XMPP服务器上有许多访问者-一些来自站点A,一些来自站点B,但它们都连接到同一个XMPP服务器。当访问者访问站点时,他们会以
@demo.com
的身份连接到XMPP服务器,每个人都会登录到一个名为
@conference.demo.com
的房间。销售/支持人员还通过
\uu@demo.com
连接到XMPP服务器。但是他们没有连接到任何聊天室。他们的名册上没有访客

显示用户已连接到站点的一个好方法是将状态节传递给销售/支持人员。只有来自同一网站的访问者和销售/支持人员才能相互交流,这就是为什么我的用户名中有
,以显示此人所属的网站


如果你的花名册上没有一个用户,你似乎无法为他订阅状态节。(相当合乎逻辑)。是否可以将连接到系统的站点的每个新用户自动添加到该站点的销售/支持人员名册中?这难道不会自动向销售/支持人员发出到场信号吗?我如何实现这一点-有什么帮助吗

我认为最好用临场感节来“暗示”任何活动。您需要存储在数据库中的只是用于进一步分析的持久数据。否则,我认为您将有很好的时间编写应用程序:)

编辑:

连接功能(状态){
如果(状态==Strophe.status.CONNECTED){
var=false;
var参与者={};
$(“#events').html('XMPP连接已建立。准备好摇滚了!);
send($pres().c('priority').t('-1'));
addHandler(notifyUser,null,'message','groupchat',null,null);
发送($pres({to:'groupchatroom@conference.demo.com/'+昵称}).c('x',{xmlns:'http://jabber.org/protocol/muc'}));
}else if(status==Strophe.status.AUTHFAIL){
$(location.attr('href',AUTHFAIL\u URL);
}else if(状态==Strophe.status.CONNFAIL){
$(location.attr('href',AUTHFAIL\u URL);
}
}
$(文档).ready(函数(){
连接=新的选通连接(BOSH_服务);
connection.connect(jid、密码、onConnect);
});

notifyUser是另一个处理接收到的消息节的函数(只需link onConnect)。

我不确定您是否需要使用MUCs来实现此功能。您的bot可以维护自己订阅的pubsub节点。当新用户开始键入时,它可以向pubsub节点发送通知,然后bot将看到该通知。从那里,bot可以通过XMPP通知支持人员,从而消除了长时间轮询数据库表的需要。然后,支持人员可以与最终用户启动标准的一对一聊天会话。此外,可以将他们的状态设置为“na”,以显示他们正在与用户进行会话。

我就是这么写的。它被称为并在网站和Jabber服务器(我使用ejabberd)之间使用一个“代理”机器人。它现在处于测试阶段,主要是因为它还没有在我的公司之外进行过广泛的测试

注:当
function onConnect(status) {
  if (status == Strophe.Status.CONNECTED) {
    var joined = false;
    var participants = {};
    $('#events').html('<text class="textmainleft">XMPP connection established. Ready to rock n roll!</text>');
    connection.send($pres().c('priority').t('-1'));
    connection.addHandler(notifyUser, null, 'message', 'groupchat', null, null);
    connection.send($pres({to: 'groupchatroom@conference.demo.com/' + nickname}).c('x', {xmlns: 'http://jabber.org/protocol/muc'}));
  } else if (status == Strophe.Status.AUTHFAIL) {
    $(location).attr('href', AUTHFAIL_URL);
  } else if (status == Strophe.Status.CONNFAIL) {
    $(location).attr('href', AUTHFAIL_URL);
  }
}

$(document).ready(function () {
  connection = new Strophe.Connection(BOSH_SERVICE);
  connection.connect(jid, password, onConnect);
});