Отправка сообщений в 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: Perl, Web-dev, XMPP
Category:
Perl, Web-dev |
No comments »