Как создать Jabber/XMPP прокси / сервис регистрации?

Я работаю в компании, которая использует Google Chatback (анонимный чат с сотрудником службы поддержки в случае моей компании) в качестве основного поставщика услуг чата. Эта служба использует протокол XMPP (ранее известный как Jabber) для отправки и получения сообщений.

В нашей компании есть десять учетных записей сотрудников службы поддержки, и они доступны через службу чата, которую мы использовали на нашем веб-сайте. Сотрудники используют как Mac OSX, так и Windows, а также разные клиенты в разных ОС. Чат также доступен через собственные приложения на Android и iOS.

Нам нужна служба для регистрации сеансов чата, и мы искали проприетарные решения, но они не поддерживаются на мобильных платформах, и это в основном нарушитель.

Решение, которое я решил, состоит в том, чтобы ввести еще одну ссылку в цепочке сообщений, которая регистрирует все сообщения. Идея состоит в том, что сервер отправляет через этот прокси-сервер, который регистрирует сообщения в соответствии с тем, какой сеанс чата, и затем сохраняет эти журналы соответствующим образом. В настоящее время они хранят все журналы в папке Dropbox, что подвержено ошибкам.

Теоретически это позволило бы нашим сторонникам использовать любую ОС / клиент, которого они выбрали, и журналы оказались бы в одном месте.

Проведя несколько тестов с использованием Smack API, я пришел к выводу, что мой XMPP-клиент (Trillian на Android и Windows) отвечает на ресурс, с которого он последний раз получал сообщение. Это фактически означает, что очень простой регистратор чата, который я реализовал, просто игнорируется.

Тест проводился с использованием приведенного ниже кода в сочетании с другим клиентом, который работает параллельно. Только один из клиентов получает сообщение.

ConnectionConfiguration config = new ConnectionConfiguration("talk.google.com", 5222, "googlemail.com");
config.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
config.setSASLAuthenticationEnabled(true);
XMPPConnection connection = new XMPPConnection(config);
connection.connect();

Presence presence = new Presence(Presence.Type.unavailable);
connection.login("android_client_username", "android_client_pass");
Message message = new Message("my_test_email@gmail.com");
message.setBody("Hello World!");
connection.sendPacket(message);
connection.sendPacket(presence);
connection.addPacketListener(new PacketListener() {
          public void processPacket(Packet packet) {
             if (packet instanceof Message) {
                Message message = (Message) packet;
                System.out.println(message.getBody()); 
             }
           }
        }, new MessageTypeFilter(Message.Type.chat));
  • Можно ли создать такой прокси-сервер с помощью службы Google Talk, т.е. без размещения собственного XMPP-сервера?
  • Можно ли вообще прослушивать все пакеты на сервере?
  • Если нет, то какие есть альтернативы для анонимных клиентов чата в сети, использующих открытый протокол, такой как XMPP?

Спасибо за ваше время.

4 ответа

Решение

Если вы НЕ ИСПОЛЬЗУЕТЕ службу Google Chatback, установить среду, в которой вы нуждаетесь, относительно просто. Для регистрации сообщений XMPP, чат должен быть сделан через MUC (многопользовательский чат). Вам нужны следующие компоненты:

  • Книга: http://professionalxmpp.com/
  • HTTP-сервер
  • Jabber/XMPP сервер (например, ejabberd)
  • Комната чата на рабочее место
  • Используйте perl и Net::Jabber (не Net::XMPP, поскольку он не поддерживает MUC) для создания сценария / процесса / демона, который будет входить на сервер XMPP и присоединяться к соответствующей комнате чата. Другими участниками чата будут ваши парни поддержки, и тот парень, который просит поддержки. Сценарий должен быть установлен таким образом, чтобы он делал все, что вы хотите, после получения сообщения MUC (например, хранить в базе данных). Не так много работы, так как при установке Net:: Jabber есть примеры сценариев, в которые вам нужно добавлять / изменять только часть кода.
  • Если вы хотите общаться в чате через веб-браузер, необходимо использовать Strophe.js, чтобы установить соединение BOSH с сервером XMPP через HTTP-сервер с помощью правильной конфигурации прокси.

Все это можно найти в книге, кроме сценария Perl, использующего Net:: Jabber.

Возможно, я не сильно помог, но если вы решите пойти по этому пути, я помогу. Если Google Chatback поддерживает MUC, то все, что вам нужно, это Perl/Net::Jabber part.

РЕДАКТИРОВАТЬ: Perl XMPP демон

#!/usr/bin/perl -w

use strict;
use Net::Jabber;
use threads;
use DBI;

my $server = shift @ARGV;
my $port = shift @ARGV;
my $username = shift @ARGV;
my $password = shift @ARGV;
my $resource = shift @ARGV;
my $chatroom = shift @ARGV;

my %img = ('URGENT' => 'urgent.png',
            'HIGH' => 'high.png',
            'MEDIUM' => 'medium.png',
            'LOW' => 'low.png');

my $dbname_status= 'db';
my $dbuser_status= 'user';
my $dbpass_status= 'pass';
my $dbhost_status = 'localhost';
my $dbport_status = 5432;

my $dbh_status = DBI->connect("dbi:Pg:dbname=$dbname_status;host=$dbhost_status;port=$dbport_status", $dbuser_status, $dbpass_status, {AutoCommit => 0, RaiseError => 1});
my $sth_status = $dbh_status->prepare(qq{SELECT * FROM sosrhs_ticketstatus});
$sth_status->execute;
my %status = ();
while (my $res = $sth_status->fetchrow_hashref)
{
    $status{$res->{status}} = $res->{id};
}
$sth_status->finish;
$dbh_status->disconnect;

print "\nSERVER: ", $server, "\n";
print 'PORT: ', $port, "\n";
print 'USERNAME: ', $username, "\n";
print 'RESOURCE: ', $resource, "\n";


$SIG{HUP} = \&Stop;
$SIG{KILL} = \&Stop;
$SIG{TERM} = \&Stop;
$SIG{INT} = \&Stop;

my $Connection = new Net::Jabber::Client();

$Connection->SetCallBacks(message => sub {threads->create('InMessage', (@_))->join()},
                          presence => sub {threads->create('InPresence', (@_))->join()},
                          iq => sub {threads->create('InIQ', (@_))->join()}
                          );

my $status = $Connection->Connect(hostname=>$server,
                                  port=>$port,
                                 );

if (!(defined($status)))
{
    print "ERROR:  Jabber server is down or connection was not allowed.\n";
    print "        ($!)\n";
    exit(0);
}

my @result = $Connection->AuthSend(username=>$username,
                                   password=>$password,
                                   resource=>$resource);

if ($result[0] ne "ok")
{
    print "ERROR: Authorization failed: $result[0] - $result[1]\n";
    exit(0);
}

print "Logged in to $server:$port...\n";

$Connection->RosterGet();

print "Getting Roster to tell server to send presence info...\n";

$Connection->PresenceSend();

print "Sending presence to tell world that we are logged in...\n";

$Connection->MUCJoin(room => $chatroom,
                    server => 'conference.' . $server,
                    nick => $username);

print 'Join ' . $chatroom . '@conference.sosrhs MUC room...';
print "\n";

while(defined($Connection->Process())) { }

print "ERROR: The connection was killed...\n";

exit(0);


sub Stop
{
    print "Exiting...\n";
    $Connection->Disconnect();
    exit(0);
}


sub InMessage
{
    my $sid = shift;
    my $message = shift;

    my $type = $message->GetType();
    my $fromJID = $message->GetFrom("jid");

    my $from = $fromJID->GetUserID();
    my $resource = $fromJID->GetResource();
    my $subject = $message->GetSubject();
    my $body = $message->GetBody();
    #print "===\n";
    #print "Message ($type)\n";
    #print "  From: $from ($resource)\n";
    #print "  Subject: $subject\n";
    #print "  Body: $body\n";
    #print "===\n";
    #print $message->GetXML(),"\n";
    #print "===\n";

    if ($from eq 'ticket_distributor')
    {
        if ($body =~ /^ticketrelay /)
        {
            &to_group($body);
        }
        elsif ($body =~ /^ackrelay /)
        {
            &to_group_ack($body);
        }
        elsif ($body =~ /^ticketupdaterelay /)
        {
            &to_group_update($body);
        }
        elsif ($body =~ /^ticketwithdrawrelay /)
        {
            &to_group_withdraw($body);
        }
        elsif ($body =~ /^ticketclearrelay /)
        {
            &to_group_clear($body);
        }
        elsif ($body =~ /^ticketcloserelay /)
        {
            &to_group_close($body);
        }
        elsif ($body =~ /^ticketfwdrelay /)
        {
            &to_group_fwd($body);
        }
    }
    else
    {
        if ($body =~ /^ticketnew /)
        {
            &to_group($body);
            &to_ticket_distributor($body);
        }
        elsif ($body =~ /^ack /)
        {
            &to_ticket_distributor_ack($body);
        }
        elsif ($body =~ /^ticketupdate /)
        {
            &to_ticket_distributor_update($body);
        }
        elsif ($body =~ /^ticketwithdraw /)
        {
            &to_ticket_distributor_withdraw($body);
        }
        elsif ($body =~ /^ticketclear /)
        {
            &to_ticket_distributor_clear($body);
        }
        elsif ($body =~ /^ticketclose /)
        {
            &to_ticket_distributor_close($body);
        }
        elsif ($body =~ /^ticketfwd /)
        {
            &to_ticket_distributor_fwd($body);
        }
    }
}


sub InIQ
{
    my $sid = shift;
    my $iq = shift;

    my $from = $iq->GetFrom();
    my $type = $iq->GetType();
    my $query = $iq->GetQuery();
    my $xmlns = $query->GetXMLNS();
    #print "===\n";
    #print "IQ\n";
    #print "  From $from\n";
    #print "  Type: $type\n";
    #print "  XMLNS: $xmlns";
    #print "===\n";
    #print $iq->GetXML(),"\n";
    #print "===\n";
}

sub InPresence
{
    my $sid = shift;
    my $presence = shift;

    my $from = $presence->GetFrom();
    my $type = $presence->GetType();
    my $status = $presence->GetStatus();
    #print "===\n";
    #print "Presence\n";
    #print "  From $from\n";
    #print "  Type: $type\n";
    #print "  Status: $status\n";
    #print "===\n";
    #print $presence->GetXML(),"\n";
    #print "===\n";

    if ($type eq 'subscribe')
    {
        my @usrreq = split('@', $from);
        my $usrreq = $usrreq[0] . '@' . $server;
        $Connection->Subscription(type => 'subscribed',
                                    to => $usrreq
                                    );
    }
}

# Functions for actions taken upon ticket
sub to_ticket_distributor
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($msg[1]);
    my $group_assigned_groupnamechat = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $group_assigned_groupnamechat = $res->{group_assigned_groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => $msg[1] . ' ' . $group_assigned_groupnamechat);
}

sub to_ticket_distributor_ack
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1] $msg[2]\n";
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'WORK IN PROGRESS'}, user_accepted = '$msg[2]', tmstmp_accepted = now() WHERE ticket_id = $msg[1]});
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($msg[1]);
    my $user_creator_groups_id = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groups_id = $res->{user_creator_groups_id};
    }
    $sth->finish;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
    $sth->execute($user_creator_groups_id);
    my $user_creator_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ackrelay ' . $msg[1] . ' ' . $user_creator_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ackfinish ' . $msg[1]);
}

sub to_ticket_distributor_update
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1] $msg[2]\n";
    my $ticket_action = shift @msg;
    my $ticket_id = shift @msg;
    my $user_id_update = shift @msg;
    my $ticket_comment = join(' ', @msg);
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->prepare(qq{INSERT INTO sosrhs_tickets_comments (ticket_id, users_id, comment) VALUES (?, ?, ?)});
    $sth->execute($ticket_id, $user_id_update, $ticket_comment);
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($ticket_id);
    my $user_creator_groups_id = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groups_id = $res->{user_creator_groups_id};
    }
    $sth->finish;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
    $sth->execute($user_creator_groups_id);
    my $user_creator_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketupdaterelay ' . $ticket_id . ' ' . $user_creator_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketupdatefinish ' . $ticket_id);
}

sub to_ticket_distributor_withdraw
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";
    my $ticket_action = shift @msg;
    my $ticket_id = shift @msg;
    my $user_id_withdraw = shift @msg;
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'WITHDRAWN'}, user_withdrawn = $user_id_withdraw, tmstmp_withdrawn = now() WHERE ticket_id = $ticket_id});
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($ticket_id);
    my $user_creator_groups_id = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groups_id = $res->{user_creator_groups_id};
    }
    $sth->finish;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
    $sth->execute($user_creator_groups_id);
    my $user_creator_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketwithdrawrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketwithdrawfinish ' . $ticket_id);
}

sub to_ticket_distributor_clear
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";
    my $ticket_action = shift @msg;
    my $ticket_id = shift @msg;
    my $user_id_clear = shift @msg;
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'CLEARED'}, user_cleared = $user_id_clear, tmstmp_cleared = now() WHERE ticket_id = $ticket_id});
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($ticket_id);
    my $user_creator_groups_id = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groups_id = $res->{user_creator_groups_id};
    }
    $sth->finish;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = ?});
    $sth->execute($user_creator_groups_id);
    my $user_creator_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketclearrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketclearfinish ' . $ticket_id);
}

sub to_ticket_distributor_close
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";
    my $ticket_action = shift @msg;
    my $ticket_id = shift @msg;
    my $user_id_close = shift @msg;
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'CLOSED'}, user_closed = $user_id_close, tmstmp_closed = now() WHERE ticket_id = $ticket_id});
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_users_v WHERE groups_id = (SELECT group_assigned_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
    $sth->execute($ticket_id);
    my $user_accepted_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_accepted_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketcloserelay ' . $ticket_id . ' ' . $user_accepted_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketclosefinish ' . $ticket_id);
}

sub to_ticket_distributor_fwd
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1] $msg[2]\n";
    my $ticket_action = shift @msg;
    my $ticket_id = shift @msg;
    my $user_id_fwd = shift @msg;
    my $group_id_fwd_to = shift @msg;
    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->do(qq{UPDATE sosrhs_tickets SET ticketstatus = $status{'ASSIGNED'}, user_accepted = NULL, tmstmp_accepted = NULL, group_assigned = $group_id_fwd_to WHERE ticket_id = $ticket_id});
    $dbh->commit;

    $sth = $dbh->prepare(qq{INSERT INTO sosrhs_tickets_comments (ticket_id, users_id, groups_id_fwd_to) VALUES (?, ?, ?)});
    $sth->execute($ticket_id, $user_id_fwd, $group_id_fwd_to);
    $dbh->commit;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = (SELECT group_assigned_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
    $sth->execute($ticket_id);
    my $user_fwd_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_fwd_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $sth = $dbh->prepare(qq{SELECT groupnamechat FROM sosrhs_groups WHERE id = (SELECT user_creator_groups_id FROM sosrhs_tickets_v WHERE ticket_id = ?)});
    $sth->execute($ticket_id);
    my $user_creator_groupchatname = '';
    while (my $res = $sth->fetchrow_hashref)
    {
        $user_creator_groupchatname = $res->{groupnamechat};
    }
    $sth->finish;

    $dbh->disconnect;

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketfwdrelay ' . $ticket_id . ' ' . $user_fwd_groupchatname);

    $Connection->MessageSend(to => 'ticket_distributor@' . $server,
                            type => 'chat',
                            body => 'ticketfwdrelay ' . $ticket_id . ' ' . $user_creator_groupchatname);

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketfwdfinish ' . $ticket_id);
}

# Functions for relayed actions from ticket_distributor
sub to_group
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => &build_new_ticket_message($msg[1]));
}

sub to_group_ack
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ackrelay ' . $msg[1]);
}

sub to_group_update
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketupdaterelay ' . $msg[1]);
}

sub to_group_withdraw
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketwithdrawrelay ' . $msg[1]);
}

sub to_group_clear
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketclearrelay ' . $msg[1]);
}

sub to_group_close
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketcloserelay ' . $msg[1]);
}

sub to_group_fwd
{
    my $msg = shift;
    my @msg = split(' ', $msg);
    print "\n$username : $msg[0] $msg[1]\n";

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => 'ticketfwdrelay ' . $msg[1]);

    sleep 2;

    $Connection->MessageSend(to => $chatroom . '@conference.' . $server,
                            type => 'groupchat',
                            body => &build_new_ticket_message($msg[1]));
}

sub build_new_ticket_message
{
    my $ticket_id = shift;

    my $dbname= 'db';
    my $dbuser= 'user';
    my $dbpass= 'pass';
    my $dbhost = 'localhost';
    my $dbport = 5432;

    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpass, {AutoCommit => 0, RaiseError => 1});
    my $sth = $dbh->prepare(qq{SELECT * FROM sosrhs_tickets_v where ticket_id = ?});
    $sth->execute($ticket_id);
    my %ticket = ();
    while (my $res = $sth->fetchrow_hashref)
    {
        $ticket{ticket_id} = $res->{ticket_id};
        $ticket{ticketcategory_category} = $res->{ticketcategory_category};
        $ticket{ticketstatus_status} = $res->{ticketstatus_status};
        $ticket{ticketpriority_severityname} = $res->{ticketpriority_severityname};
        $ticket{tmstmp_assigned} = $res->{tmstmp_assigned};
        $ticket{user_creator_firstname} = $res->{user_creator_firstname};
        $ticket{user_creator_secondname} = $res->{user_creator_secondname};
        $ticket{group_assigned_groupname} = $res->{group_assigned_groupname};
        $ticket{ticket_text} = $res->{ticket_text};
        $ticket{ticket_file} = $res->{ticket_file};
        $ticket{subject} = $res->{subject};
        $ticket{user_creator_groups_id} = $res->{user_creator_groups_id};
    }
    $sth->finish;

    $dbh->disconnect;

    my $html_msg = q!<p id="p! . $ticket{ticket_id} . q!">
                        <img src="/sosrhs/images/! . $img{$ticket{ticketpriority_severityname}} . q!"/>&nbsp;<text id="t! . $ticket{ticket_id} . q!" class="textmainleft">! . substr($ticket{tmstmp_assigned}, 0, 16) . '&nbsp;|&nbsp;' . $ticket{ticketstatus_status} . '&nbsp;|&nbsp;' . $ticket{ticketcategory_category} . '&nbsp;|&nbsp;' . $ticket{subject} . '<br>From:&nbsp;' . $ticket{user_creator_firstname} . '&nbsp;' . $ticket{user_creator_secondname} . '&nbsp;|&nbsp;To:&nbsp;' . $ticket{group_assigned_groupname} . q!</text>&nbsp;|&nbsp;<a href="#" onClick="$('#explanation').fadeOut('fast'); $('div.divmainleft > p').css('background-color', 'white'); $('#p! . $ticket{ticket_id} . q!').css('background-color', '#E0E0F8'); $('#tdexplanation').load('/cgi-bin/sosrhs/ticket_details.pl?ticket_id=! . $ticket{ticket_id} . q!&my_groupchatname=! . $chatroom . q!');">Details</a>
                    </p>!;

                    #<hr id="h! . $ticket{ticket_id} . q!" style="height: 1px; border-width: 0; color: gray; background-color: gray;"/>!;

    return $html_msg;
}

Почему бы не использовать XMPP через HTTP, а затем регистрировать сообщения, используя прокси-сервер HTTP (настроить все ваши клиенты XMPP для связи с прокси-сервером HTTP, а не с конечной точкой напрямую)?

Вы можете попробовать gozerbot, если вам удастся настроить его

Я не слишком уверен, повлияет ли это на вас и ваше обслуживание, но только для вашей информации в прошлом я испытал 407 Proxy Auth. код ответа при попытке сделать междоменные текстовые /xml-запросы ajax. В основном, если вы находитесь в среде типа firewall / http-proxy (squid). Решением этой проблемы является в основном резервный режим для jsonp, когда за прокси-сервером.

Проверка проверки: 1) настроить локальный squid 2) использовать базовые примеры strophejs 3) настроить кросс-домен ajax, т.е. домен BOSH_SERVICE_URL не совпадает с доменом запрашивающего 4) настроить браузер на использование локального squid 5) вы найдете все вызовы POST api, т.е. /http- Привязка вызовов text/xml завершится неудачно с кодом ответа аутентификации прокси-сервера 407 6) удалить использование прокси из браузера 7) попробуйте снова, все работает с включенным CORS

Другие вопросы по тегам