Pregunta

Estoy tratando de escribir un simple script en Perl para enviar un Mensaje Instantáneo.Jabber parecía que podría ser el más propicio protocolo.Pero la secuencia de comandos siguiente falla:

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

Dice:

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 cartman respuesta señala que el código debe ser en realidad

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

Pero que falla con el siguiente error:

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

Tengo la Authen::SASL módulo cpan instalado.

¿Fue útil?

Solución

Jabber :: SimpleSend es la forma más fácil de interactuar con un servidor estándar Jabber, pero no deje que el nombre del módulo engañe: gtalk es de hecho un poco diferente de encriptación, lo que requiere TLS (que Jabber :: SimpleSend no lo hará) y un cambio de nombre de host. Obtendrá mejores resultados usando Net :: XMPP y tratar directamente con su API.

http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification para una implementación completamente de trabajo bien comentado en 75 líneas de perl usando Net :: XMPP. Se inteded para enviar notificaciones de Nagios pero hace exactamente lo que necesita.

Otros consejos

Yo no estoy familiarizado con el código, pero esa línea en XML::Arroyo es donde el módulo comienza un select() loop.Línea 523-524 es donde se pasa de IO::Seleccione un punto de anclaje para el servidor de destino, y IO::Seleccione sí pasa un bendito de referencia, que nunca debe ser undef la forma de XML::Arroyo de los usa.

Algo es, probablemente, la modificación de la "SELECCIONE" elemento de XML::objeto Stream en el Jabber módulos, posiblemente en un intento equivocado para corregir un servidor de error de conexión.Lo siento, no podía ser más específicos.


En respuesta a la actualización:

Estos son los errores intermitentes, y he tenido la intención de ver el interior de los Jabber módulos de todos modos, así que me llevó a buscar en la fuente.La siguiente se basa en la observación de las últimas versiones de los módulos utilizados disponible en CPAN.Esto probablemente no es muy útil si quieres empezar a crear subclases de estos módulos y agregar código para ver donde sucede algo inesperado.(Puede omitir el párrafo siguiente si usted no está interesado en el Jabber de los módulos de la parte interna.)

A partir de la información actualizada, yo he trazado hasta el punto donde Authen::SASL::Perl grazna en la línea 41.Se necesita un resultado de $parent->mecanismo, y hay dos causas posibles, suponiendo que Authen::SASL no está roto.Ya sea que se llama incorrectamente sin argumentos de Net::XMPP:: (Protocolo de línea 2968), lo que parece poco probable, o los "mecanismos" se establece en el constructor de Authen::SASL no existen.Net::XMPP::Protocolo define los "mecanismos" (GetStreamFeature llamada, línea 2958;que método definido alrededor de la línea 3340) con return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, donde $característica es simplemente una cadena que se pasa desde el destinatario y el número de identificación de la parte del XML::Arroyo del objeto de la sesión.

Basado en el XML original de error y la posibilidad de que el id de sesión va mal, parece que el servidor envía datos mal en algún momento inesperado para XML::Arroyo y el paradero de los módulos por medio de él.No estoy convencido de que foo%40gmail.com@talk.google.com es el derecho formato del nombre de usuario, pero no sé cómo eso podría ser la causa de estos errores sin el servidor Jabber haciendo algo mal.

Me gustaría empezar de nuevo con diferentes nombres de usuario en un servidor diferente y ver si Jabber::SimpleSend funciona, entonces intenta capturar la salida del servidor de alguna manera para ver qué XML::Arroyo que se está ahogando en.


Actualización: Para lo que vale, he instalado el módulo y estoy obteniendo exactamente los mismos errores.Authen::SASL::Perl::simple y todos los otros requisitos previos no existen.Y cuando me puse el nombre de usuario para gmailaccountname@talk.google.com y habilitado global advertencias (por ejemplo, #!/usr/bin/perl -w o perl -w filename.pl), XML::Arroyo revela un montón de valor indefinido problemas, y SimpleSend en realidad escupe el aviso de "no se Pudo conectar al servidor Jabber"!(No, no sé lo que realmente significa :().


Actualización: Estaba tratando de instalar Net::Jabber::Bot (me dio hasta después de algunos ssl módulo de errores) para ver si iba a resolver nada, y me di cuenta de su constructor tiene esta opción y se nota:

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

lo que refuerza la idea de que el servidor está haciendo algo inusual, que XML::Arroyo que no se molesta para lanzar una excepción.

Su nombre de usuario debe ser me@gmail.com pero el nombre del servidor es talk.google.com. Así que el primer parámetro debería ser yo @ gmail.com @ talk.google.com, pero no estoy seguro de si Perl puede asimilar que los signos dobles @. Es posible que intenta escapar de primera @% con 40 de forma que el primer parámetro es me%40gmail.com@talk.google.com.

Actualizar I: Sobre el segundo error, parece que se echa en falta módulos de autenticación SASL. Gmail utiliza la autenticación SASL llano. ¿Así que tenemos /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm archivo?

Parece que usted requiere Authen :: :: SASL de Cyrus (la implementación C) o Authen :: SASL :: Perl (la implementación de Perl) que se instalarán, así como Authen :: SASL (que simplemente trata de encontrar la mejor opción ha sido instalada en su máquina, y, para ti, ni se encuentra).

Compruebe para ver si tiene instalado uno de ellos.

Esa es mi lectura de la fuente y el manual -. No he probado esto, ymmv

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top