Отправка сообщений в Jabber через web

Date April 17th, 2012 Author Vitaly Agapov

— Мне сказали — умный человек.
— Ну мало ли что про человека болтают!

— «Тот самый Мюнхгаузен»


Эта краткая заметка посвящена отправке сообщений по протоколу XMPP с помощью Perl. В данном случае это будет не простой Perl-скрипт, а cgi-сценарий под веб-сервером, хотя суть и не меняется. Фактически и не заметка это будет, а просто набор рабочего кода, который может пригодиться в будущем. Если пригодится кому-то кроме меня самого, то вообще прекрасно.

HTML

Допустим, у нас есть в вёрстке страницы такой набор элементов:

1.<input type="text" id="jabberTo">
2.<textarea id="jabberText"></textarea>
3.<input type="submit" value="Send" onclick="sendJabber(this)">

JavaScript

В js у нас задана соответствующая функция (jQuery подключён, куда ж без него):

01.function sendjabber(el) {
02.        var text=$('#jabberText').val();
03.        var to=$('#jabberTo').val();
04.        $.ajax({
05.                type: 'POST',
06.                url: "/cgi-bin/sendjabber",
07.                data: { jabbertText: text, jabberTo: to },
08.                cache: false,
09.                beforeSend: function(){
10.                        $('.tmpdiv').remove();
11.                        $(el).after('<img class="tmpimg" src="ajax.gif">');
12.                },
13.                success: function(html) {
14.                        $('.tmpimg').remove();
15.                        $(el).after('<div class="tmpdiv">'+html+'</div>');
16.                }
17.        });
18.}

Тут заодно вставим рядом с кнопкой ajax-анимацию, а после получения ответа заменим её на то, что вернёт нам скрипт.

Perl

В /cgi-bin/sendjabber у нас находится Perl-скрипт:

01.#!/usr/bin/perl
02.use CGI;
03.use Net::XMPP;
04.use Encode;
05.my $cgi = new CGI;
06.foreach my $name ($cgi->param())
07.{
08.        my @values = $cgi->param($name);
09.        foreach my $value(@values){
10.                $input{$name} = $value;
11.        }
12.}
13.if ($input{jabberText}) {
14.        my $text=$input{jabberText};
15.        my $to=$input{jabberTo};
16.        print qq~
17.        ~;
18.        my $server="ourserver.addr";
19.        my $port=5223;
20.        my $user="username";
21.        my $password="password";
22.        my $resource="resource";
23.        my $connectiontype="tcpip";
24.        my $ssl=1;
25.        my $tls=0;
26.        my $debugLevel = 0;
27.        my $bot = new Net::XMPP::Client(debuglevel => $debugLevel);
28.        my $status = $bot->Connect(
29.                hostname        => $server,
30.                port            => $port,
31.                connectiontype  => $connectiontype,
32.                ssl             => $ssl,
33.                tls             => $tls);
34.        if (!(defined($status))) {
35.                print "ERROR:  XMPP connection failed.\n";
36.                print "($!)\n";
37.                exit(0);
38.        }
39.        my @result = $bot->AuthSend(
40.                username => $user, password => $password,
41.                resource => $resource);
42.        print $result[0];
43.        if ($result[0] ne "ok") {
44.                print "ERROR: Authorization failed: $result[0] - $result[1]\n";
45.                exit(0);
46.        }
47.        $text = decode('utf-8', $text);
48.        $bot->MessageSend(
49.                to       => $to,
50.                resource => $resource,
51.                subject  => "Subj",
52.                type     => "chat",
53.                body     => $text);
54.        exit(0);
55.}

В том случае, если аутентификация на Jabber-сервере проходит через SSL, как у меня, то она может не проходить, а скрипт может вываливать ошибку. Можно решить проблему лёгким костылём: надо закомментировать строки в /usr/lib/perl5/vendor_perl/5.8.8/Net/XMPP/Protocol.pm:

if($self->{STREAM}->GetStreamFeature($self->GetStreamID(),”xmpp-sasl”))
{
return $self->AuthSASL(%args);
}

Плюс потребуется модуль IO::Socket::SSL.

Ссылки
Net::XMPP на CPAN

Tags: , ,
Category: Perl, Web-dev | No comments »

Comments

Leave a comment

 Comment Form 

Rich Text Editor, comment