Как мне заставить Perl's Jabber :: SimpleSend работать с чатом Gmail? - PullRequest
2 голосов
/ 29 апреля 2009

Я пытаюсь написать простой Perl-скрипт для отправки мгновенного сообщения. Казалось, что Джаббер - самый благоприятный протокол. Но следующий скрипт завершается ошибкой:

#!/usr/bin/env perl
use Jabber::SimpleSend qw(send_jabber_message);
send_jabber_message('me@gmail.com',
                    'CENSORED',
                    'you@gmail.com',
                    '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%40gmail.com@talk.google.com',
                    'CENSORED',
                    'you%40gmail.com@talk.google.com',
                    '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.

Ответы [ 4 ]

3 голосов
/ 07 мая 2009

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

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

2 голосов
/ 29 апреля 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 - это просто строка, передаваемая из вызываемого и id-части XML: : Потоковая сессия объекта.

Исходя из исходной ошибки XML и вероятности сбоя идентификатора сеанса, создается впечатление, что сервер либо отправляет неверные данные в какой-то момент, неожиданный для XML :: Stream, и не учитывается модулями, которые его используют. Я не уверен, что foo%40gmail.com@talk.google.com является правильным форматом имени пользователя, но я не знаю, как это могло вызвать эти ошибки, если сервер Jabber не сделал что-то не так.

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


Обновление: Для чего это стоит, я установил модуль, и я получаю точно такие же ошибки. Authen :: SASL :: Perl :: PLAIN и все другие предпосылки существуют. И когда я устанавливаю имя пользователя gmailaccountname@talk.google.com и включаю глобальные предупреждения (например, #! / 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 не бросает исключение.

1 голос
/ 04 мая 2009

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

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

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

1 голос
/ 03 мая 2009

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

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

...