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

StackOverflow https://stackoverflow.com/questions/799648
  •  
  •  | 
  •   ( words)
 Проверял

Вопрос

<Р> Я пытаюсь написать простой скрипт на 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.

Решение

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

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

Другие советы

<Р> Я не знаком с кодом, но строка в XML :: Поток где модуль начинает отборный () цикл. Линия 523-524 находится где проходит IO :: Выбрать сокет на сервер назначения, и IO :: Выбрать сам проходит благословенной ссылку, которая никогда не должна быть UNDEF пути XML :: поток использует его.

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

<Ч>

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

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

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

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

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

<Ч>

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

<Ч>

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

gtalk => 0 # Default to off, 1 for on. needed now due to gtalk differences from std jabber server.
<Р>, который подтверждает идею о том, что сервер делает что-то необычное, что XML :: поток не потрудился бросить исключение для.

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

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

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

<Р> Проверьте, чтобы увидеть, если у вас есть один из них установлен.

<Р> Это мое чтение источника и инструкции. - Я не проверял это, YMMV

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow