聊天系统在Django

我需要在Django中实现基于XMPP的实时聊天系统。 经过很多同事的鞭挞和想法之后,我们提出了这个问题。


使用bot的方法:

  • 当访问者访问该网站时。 访客的XMPP客户端(在本例中为Strophe.JS)开始与XMPP服务器建立XMPP-over-BOSH连接,并连接到名为<visitor_id>@conference.demo.com的房间。 目前房间里没有其他人。
  • 访问者通过自定义访问者ID向Django发出分析请求
  • Django视图将访问者ID存储在名为ActiveUsers的表中。 该表格包含一个新的字段以及称为status 。 它将status设置为INACTIVE
  • 该模型在save方法上发送一个信号。
  • 这个信号被连接到XMPP服务器并加入房间的bot连接到<visitor_id>@conference.demo.com 。 现在我们在房间里有用户和机器人。
  • 网站支持人员登录到他们的网络界面。
  • 他们有JS代码,可以长时间轮询Django站点以检查ActiveUsers 。 它从表中提取行并显示它。 (我想过使用django-pubsub做这个)
  • 当访问者输入消息时,它会通过XMPP-over-BOSH到达XMPP服务器,房间内的Jabber机器人会看到此消息,并将ActiveUsers表中记录的状态更新为ACTIVE
  • 如上所述:网站支持人员有JS持续对此表进行投票。 它开始闪烁以显示用户正在聊天。
  • 支持人员现在可以双击该行,然后开始与访客房间之间的XMPP-over-BOSH连接。 它知道房间是<visitor_id>@conference.demo.com
  • 看到支持人员已加入房间的机器人,更新ActiveUsers记录显示CHATTING 。 这确保不超过支持人员可以在房间内,即占用空间。
  • 机器人将消息记录到Django表中
  • 当两者都看到两个用户已经离开房间时,它将删除该记录。
  • 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

    上一篇: chat system in Django

    下一篇: Why does ICQ bot not send message?