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

StackOverflow https://stackoverflow.com/questions/799648

  •  18-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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


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

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

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

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

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


Обновить: Как бы то ни было, я установил модуль и получаю точно такие же ошибки.Аутентификация::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 не утруждает себя выдачей исключения.

Ваше имя пользователя должно быть 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 ?

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

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

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

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