Como posso obter do Perl Jabber :: SimpleSend para trabalhar com bate-papo do Gmail?

StackOverflow https://stackoverflow.com/questions/799648
  •  
  •  | 
  •   ( words)
 Verificado

Pergunta

Eu estou tentando escrever um simples script Perl para enviar uma mensagem instantânea. Jabber parecia que poderia ser o protocolo mais propício. Mas o seguinte script falha:

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

Ele diz:

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.

Como a resposta de cartman aponta, o código deve ser realmente

#!/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");

Mas isso falhar com o seguinte erro:

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

Eu tenho o módulo Authen :: SASL cpan instalado.

Solução

Jabber :: SimpleSend é a maneira mais fácil de interagir com um servidor Jabber padrão, mas não deixe que a enganar nome do módulo você: gtalk é realmente um pouco diferente, exigindo criptografia TLS (que Jabber :: SimpleSend não vai fazer) e uma mudança de nome de host. Você obterá melhores resultados usando Net :: XMPP e lidar diretamente com sua API.

http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification para uma bem comentado, implementação totalmente funcional em 75 linhas de perl usando Net :: XMPP. É inteded para enviar Nagios notificações, mas ele faz exatamente o que você precisa.

Outras dicas

Eu não estou familiarizado com o código, mas essa linha no XML :: Stream é onde o módulo começa um loop select (). Linha 523-524 é onde está passa IO :: Escolha um soquete para o servidor de destino, e IO :: Escolha si passa uma referência abençoada, que nunca deve ser undef o caminho XML :: Fluxo usa-lo.

Algo está provavelmente modificar o elemento "select" do XML :: objeto Stream nos módulos Jabber, possivelmente em uma tentativa equivocada de corrigir um erro de conexão do servidor. Me desculpe, eu não poderia ser mais específico.


Em resposta à actualização:

Estes são erros estranhos, e eu tenho sentido de olhar para dentro dos módulos Jabber de qualquer maneira, por isso, tomei a olhar para a fonte. O seguinte é baseado em olhar para as últimas versões dos módulos usados ??disponíveis do CPAN. Isto provavelmente não é muito útil a menos que você quiser começar a subclasse destes módulos e adicionar o código para ver onde algo inesperado acontece. (Você pode pular o próximo parágrafo, se você não está interessado nos internos dos módulos Jabber).

A partir das informações atualizadas, já traçou-lo para o ponto onde Authen :: SASL :: Perl croaks na linha 41. Ela precisa de um resultado de US $ pai-> mecanismo, e há duas causas possíveis, assumindo Authen: : SASL não está quebrado. Ou ele está sendo chamado incorretamente sem argumentos da Net :: XMPP :: Protocol (linha 2968), o que parece improvável, ou os "mecanismos" que estabeleceu no construtor para Authen :: SASL não existem. Net :: XMPP :: protocolo define os "mecanismos" (GetStreamFeature chamada, linha 2958; que o método definido em torno da linha 3340) com return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, onde $ recurso é apenas uma cadeia transmitida a partir do receptor e da parte ID do XML :: Fluxo sessão do objeto.

Com base no erro XML original e a possibilidade de o id de sessão ruim acontecendo, parece que o servidor quer enviar dados ruins em algum momento inesperado para XML :: Stream e desaparecidos pelos módulos de usá-lo. Eu não estou convencido de que foo%[email protected] é o formato de nome de usuário certo, mas eu não sei como isso poderia estar causando esses erros sem o servidor Jabber fazendo algo errado.

Gostaria de começar de novo, com diferentes nomes de usuário em um servidor diferente e ver se Jabber :: SimpleSend funciona em tudo, em seguida, tentar capturar a saída do servidor de alguma forma para ver o XML :: Stream é asfixia por diante.


Atualização: Por que vale a pena, eu instalado o módulo e eu estou recebendo exatamente o mesmo erros. Authen :: SASL :: Perl :: PLAIN e todos os outros pré-requisitos não existem. E quando eu definir o nome de usuário para [email protected] e permitiu global de avisos (por exemplo, #! / Usr / bin / perl -w ou perl -w filename.pl), XML :: Fluxo revela um monte de indefinido problemas de valor, e SimpleSend realmente cospe o aviso "não foi possível conectar ao servidor Jabber"! (Não, eu não sei o que isso realmente significa: ().


Atualização: Eu estava tentando instalar Net :: Jabber :: Bot (I deu-se após alguns erros módulo SSL) para ver se ele iria resolver nada, e eu observei seu construtor tem esta opção e nota:

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

o que reforça a ideia de que o servidor fazendo algo incomum, que XML :: Fluxo não se preocupa em lançar uma exceção para.

Seu nome de usuário deve ser [email protected] mas o nome do servidor é talk.google.com. Assim, o primeiro parâmetro deve ser me @ gmail.com @ talk.google.com, mas eu não tenho certeza se Perl pode grok que a dupla @ sinais. Pode tentar escapar primeiro @ com% 40 para que o primeiro parâmetro é me%[email protected]

Atualização I: Sobre o segundo erro, parece que você está faltando módulos de autenticação SASL. O Gmail usa a autenticação SASL Plain. Então você tem de arquivo /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm?

Parece que requerem Authen :: SASL :: Cyrus (a implementação C) ou Authen :: SASL :: Perl (a implementação Perl) a ser instalado, bem como Authen :: SASL (que simplesmente tenta encontrar a melhor opção instalada em sua máquina, e, para você, achados nem).

Verifique se você tem um deles instalado.

Essa é a minha leitura da fonte e manual -. Eu não testei isso, ymmv

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow