聊天系统在Django
我需要在Django中实现基于XMPP的实时聊天系统。 经过很多同事的鞭挞和想法之后,我们提出了这个问题。
使用bot的方法:
<visitor_id>@conference.demo.com
的房间。 目前房间里没有其他人。 ActiveUsers
的表中。 该表格包含一个新的字段以及称为status
。 它将status
设置为INACTIVE
。 save
方法上发送一个信号。 <visitor_id>@conference.demo.com
。 现在我们在房间里有用户和机器人。 ActiveUsers
。 它从表中提取行并显示它。 (我想过使用django-pubsub做这个) ActiveUsers
表中记录的状态更新为ACTIVE
。 <visitor_id>@conference.demo.com
。 ActiveUsers
记录显示CHATTING
。 这确保不超过支持人员可以在房间内,即占用空间。 ejabberd或openfire将是XMPP服务器。 Apache是运行用于提供Django的mod_wsgi的web服务器,以及用于代理到XMPP服务器的XMPP-over-BOSh请求的mod_proxy。
这听起来像是这样做的好处吗? 有什么建议么? 我担心Django系统的负载。
(很长,抱歉')。
使用Presence标准的方法:
在客户端,我使用支持存在的Strophe JS库,并添加了回调方法。 我很灵活地使用ejabberd或openfire作为我的XMPP服务器。 XMPP服务器上有许多访问者 - 一些来自站点A,另一些来自站点B,但它们都连接到同一个XMPP服务器。 当访问者访问该网站时,他们作为<visitor_id>_<site_id>@demo.com
连接到XMPP服务器,并且每个<visitor_id>_<site_id>@demo.com
都登录到名为<visitor_id>@conference.demo.com
的房间。 销售/支持人员也可以通过<supportsale_id>_<site_id>@demo.com
连接到XMPP服务器。 虽然他们没有连接到任何聊天室。 他们的名单上没有任何参观者。
显示用户已连接到网站的一种好方法是将销售经理传递给销售/支持人员。 只有来自同一网站的访问者和销售/支持人员彼此沟通,这就是为什么我在用户名中包含<site_id>
以显示该用户属于哪个网站。
如果你的名单上没有他,你似乎无法订阅用户的存在节。 (很合逻辑)。 是否可以自动将连接到系统的网站的每个新用户添加到该网站的销售/支持人员名单中? 那么这是否会自动向销售/支持人员发出信号? 我如何实现这一点 - 任何帮助?
我写了这个。 它被称为Seshat,并使用网站和Jabber服务器(我使用ejabberd)之间的“经纪人”机器人。 目前它正处于测试阶段,主要是因为它尚未在我公司外进行广泛的测试。
注意:尽管README特别提到了Pyramid web框架,但核心系统对于Django,TurboGears或命令行系统也同样适用。 这只是我只打包示例代码,展示如何将它与Pyramid集成。
Seshat正在积极开发。 如果您有任何功能请求,请告诉我。 :-)
我不确定你需要使用MUC来实现这一点。 你的机器人可以维护自己订阅的pubsub节点。 当一个新用户开始输入时,它可以发送一个通知给pubsub节点,然后bot会看到这个节点。 从那里,机器人可以通过XMPP通知支持人员,因此不需要长时间轮询数据库表。 然后,支持人员可以与最终用户开始标准的一对一聊天会话。 另外,他们的存在可以设置为'na',以表明他们正在与用户进行会话。
我认为最好使用存在段来“发出”任何(进入)活动的信号。 您需要在数据库中存储的仅仅是您需要进行进一步分析的持久性数据。 否则,我认为你将有很棒的时间编码应用程序:)。
编辑:
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);
});
notifyUser是另一个功能(只是连接onConnect),它将处理收到的消息节。
链接地址: http://www.djcxy.com/p/94051.html