Как я могу заставить Perl Jabber :: SimpleSend работать с чатом Gmail?

Я пытаюсь написать простой сценарий Perl для отправки мгновенного сообщения. Jabber показался мне наиболее подходящим протоколом. Но следующий сценарий не работает:

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('[email protected]',
                    'CENSORED',
                    '[email protected]',
                    'subject test',
                    "body test");

Он говорит:

Can't call method "can_read" on an undefined value at 
/opt/local/lib/perl5/site_perl/5.8.9/XML/Stream.pm line 1421.

Как указывает ответ Картмана, код на самом деле должен быть

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me%[email protected]',
                    'CENSORED',
                    'you%[email protected]',
                    'subject test',
                    "body test");

Но это не удается со следующей ошибкой:

No SASL mechanism found
 at /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL.pm line 74

У меня установлен модуль Authen :: SASL cpan.


person dreeves    schedule 28.04.2009    source источник


Ответы (4)


Jabber :: SimpleSend - это более простой способ взаимодействия со стандартным сервером Jabber, но не позволяйте имени модуля вводить вас в заблуждение: gtalk действительно немного отличается, требуя шифрования TLS (которое Jabber :: SimpleSend не подходит) и имени хоста изменение. Вы получите лучшие результаты, используя Net :: XMPP и работая напрямую с его API.

См. http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification для хорошо прокомментированная, полностью рабочая реализация на 75 строках Perl с использованием Net :: XMPP. Он предназначен для отправки уведомлений nagios, но делает именно то, что вам нужно.

person codehead    schedule 07.05.2009

Я не знаком с кодом, но с этой строки в XML :: Stream модуль начинает цикл select (). Строка 523-524 - это место, где IO :: Select передает сокет на целевой сервер, а IO :: Select сам передает благословенную ссылку, которая никогда не должна быть неопределенной так, как ее использует XML :: Stream.

Что-то, вероятно, изменяет элемент «SELECT» объекта XML :: Stream в модулях Jabber, возможно, в результате ошибочной попытки исправить ошибку соединения с сервером. Мне жаль, что я не могу быть более конкретным.


В ответ на обновление:

Это странные ошибки, и я все равно хотел заглянуть внутрь модулей Jabber, поэтому я взглянул на источник. Следующее основано на просмотре последних версий используемых модулей, доступных из CPAN. Это, вероятно, не очень полезно, если вы не хотите создавать подклассы этих модулей и добавлять код, чтобы увидеть, где происходит что-то неожиданное. (Вы можете пропустить следующий абзац, если вас не интересует внутреннее устройство модулей Jabber.)

По обновленной информации я проследил его до точки, где Authen :: SASL :: Perl хрипит в строке 41. Ему нужен результат от механизма $ parent->, и есть две возможные причины, если предположить, что Authen :: SASL не не сломано. Либо он вызывается неправильно без аргументов из Net :: XMPP :: Protocol (строка 2968), что кажется маловероятным, либо не существует «механизмов», установленных в конструкторе для Authen :: SASL. Net :: XMPP :: Protocol определяет «механизмы» (вызывается GetStreamFeature, строка 2958; этот метод определен в строке 3340) с помощью return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, где $ feature - это просто строка, переданная от вызываемого объекта и часть идентификатора XML :: Stream. сеанс объекта.

Исходя из исходной ошибки XML и вероятности сбоя идентификатора сеанса, кажется, что сервер либо отправляет неверные данные в какой-то момент неожиданно для XML :: Stream и не учитывается модулями, использующими его. Я не уверен, что foo%[email protected] - правильный формат имени пользователя, но я не знаю, как это могло вызвать эти ошибки, если сервер Jabber не делает что-то неправильно.

Я бы начал все сначала с другими именами пользователей на другом сервере и посмотрел, работает ли Jabber :: SimpleSend вообще, а затем попытался бы каким-то образом захватить вывод сервера, чтобы увидеть, что XML :: Stream задыхается.


Обновление. Как бы то ни было, я установил модуль и получаю точно такие же ошибки. Authen :: SASL :: Perl :: PLAIN и все другие предварительные условия существуют. И когда я установил имя пользователя на [email protected] и включил глобальные предупреждения (например, #! / Usr / bin / perl -w или perl -w filename.pl), XML :: Stream выдает кучу неопределенных значения, и SimpleSend фактически выплевывает предупреждение «Не удалось подключиться к серверу Jabber»! (Нет, я не знаю, что это на самом деле означает :().


Обновление: Я пытался установить Net :: Jabber :: Bot (я отказался от некоторых ошибок модуля ssl), чтобы посмотреть, решит ли он что-нибудь, и я заметил, что его конструктор имеет эту опцию и примечание:

gtalk => 0 # Default to off, 1 for on. needed now due to gtalk differences from std jabber server.

что подтверждает идею о том, что сервер делает что-то необычное, для чего XML :: Stream не создает исключения.

person Anonymous    schedule 29.04.2009
comment
Вау, спасибо за всю эту детективную работу! У вас бы случайно не было тестового имени пользователя / пароля на каком-то другом jabber-сервере, чтобы я мог его под рукой протестировать, не так ли? - person dreeves; 03.05.2009
comment
Нет, не знаю; извиняюсь. Но я помню, как нашел несколько серверов, которые я когда-то использовал с Pidgin, которые автоматически создавали бы имя пользователя для вас, если бы его не существовало. Я понятия не имею, могут ли Net :: Jabber и Net :: XMPP справиться с этим, но вы всегда можете создать учетные записи вручную, а затем поиграть с ними в модуле. - person Anonymous; 03.05.2009

Ваше имя пользователя должно быть [email protected], но имя сервера - talk.google.com. Итак, первым параметром должен быть me @ gmail.com @ talk.google.com, но я не уверен, сможет ли Perl найти эти двойные знаки @. Вы можете попытаться экранировать first @ с помощью% 40, чтобы первый параметр был me%[email protected].

Обновление I: о второй ошибке, похоже, вам не хватает модулей аутентификации SASL. GMail использует обычную аутентификацию SASL. Итак, у вас есть файл /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm?

person ismail    schedule 02.05.2009
comment
Спасибо, Картман! Это прогресс. Теперь он жалуется, что механизм SASL не найден (и у меня установлен модуль cpan Authen :: SASL). Я просто обновил вопрос, чтобы задать вопрос о новой ошибке. - person dreeves; 03.05.2009
comment
Попробуйте установить модуль Authen :: Cyrus :: SASL. - person ismail; 04.05.2009
comment
Я установил Authen :: SASL :: Perl, а затем получил исходную ошибку («Невозможно вызвать метод can_read»). Ошибка установки Authen :: SASL :: Cyrus: Ошибка при выполнении этой команды: ADAMSON / Authen-SASL-Cyrus-0.12.tar.gz: make_test NO - person dreeves; 05.05.2009
comment
Было бы лучше разместить полный журнал сборки. - person ismail; 06.05.2009

Похоже, вам требуется установить Authen :: SASL :: Cyrus (реализация C) или Authen :: SASL :: Perl (реализация Perl), а также Authen :: SASL (который просто пытается найти лучший вариант, установленный на ваша машина, и, для вас, не находит ни того, ни другого).

Проверьте, установлен ли у вас один из них.

Это мое чтение источника и руководства - я не тестировал это, ymmv.

person ijw    schedule 04.05.2009
comment
Неа; Я установил и убедился, что модуль существует, но это не так. - person Anonymous; 04.05.2009
comment
Какой из них, Authen :: SASL :: Cyrus или Authen :: SASL :: Perl? - person ijw; 04.05.2009
comment
У меня есть чистые Perl Authen :: SASL :: Perl и Authen :: SASL :: Perl :: PLAIN, которые, как мне кажется, являются его подклассами, а не частью Cyrus. Это стандартная установка без компилятора, настроенного в CPAN. - person Anonymous; 04.05.2009
comment
nntp.perl.org/group/perl.ldap/ 2006/08 / msg2280.html (старый, но причина все еще возможна) - попробовать :: Cyrus? - person ijw; 04.05.2009
comment
Я установил Authen :: SASL :: Perl, а затем получил исходную ошибку («Не могу вызвать метод can_read»). Ошибка установки Authen :: SASL :: Cyrus: Ошибка при выполнении этой команды: ADAMSON / Authen-SASL-Cyrus-0.12.tar.gz: make_test NO - person dreeves; 05.05.2009
comment
nolan.eakins.net/node/300 - Google SASL особенный. pervasive-network.org/SPIP/Google-Talk-with- perl-bis - но может быть альтернативный способ, если вы можете использовать эти настройки с Jabber :: SimpleClient. - person ijw; 05.05.2009