Deshabilitar Adblock

AdBlock está bloqueando algo de contenido en el sitio

ADBlock errore

¿Cómo puedo obtener Jabber de Perl :: SimpleSend trabajar con chat de Gmail?

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

Pregunta

Estoy tratando de escribir un simple script en Perl para enviar un mensaje instantáneo. Jabber parecía que podría ser el protocolo más propicio. Pero el siguiente script 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");

Se 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.

A medida que la respuesta de carretero señala, 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 eso falla con el siguiente error:

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

Me tiene instalada la Authen :: SASL módulo CPAN.

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

No estoy familiarizado con el código, pero esa línea en XML :: Stream es donde el módulo comienza un bucle de selección (). Línea 523-524 es donde se pasa IO :: Seleccionar un socket para el servidor de destino, e IO :: Seleccione sí pasa una referencia bendita, que nunca debe ser undef la forma XML :: Corriente utiliza.

Algo es, probablemente, modificando el elemento "SELECT" del XML :: objeto Stream en los módulos de Jabber, posiblemente en un intento equivocado para corregir un error de conexión al servidor. Lo siento, no podía ser más específico.


En respuesta a la actualización:

Estos son errores impares, y he tenido la intención de mirar dentro de los módulos Jabber de todos modos, así que tomaron al vistazo a la fuente. Lo siguiente se basa en mirar las últimas versiones de los módulos usados ​​disponibles desde CPAN. Esto probablemente no es muy útil a menos que desee iniciar la subclasificación de estos módulos y la adición de código para ver donde sucede algo inesperado. (Puede saltarse el siguiente párrafo si usted no está interesado en el funcionamiento interno de los módulos de Jabber.)

A partir de la información actualizada, he rastreado hasta el punto donde Authen :: SASL :: Perl estira la pata en la línea 41. Se necesita un resultado de $ padre-> mecanismo, y hay dos causas posibles, asumiendo Authen: : SASL no está roto. O bien se está incorrectamente llamado sin argumentos de Net :: :: Protocolo XMPP (línea 2968), lo que parece poco probable, o los "mecanismos" se establecen en el constructor de Authen :: SASL no existen. Net :: :: XMPP Protocolo define los "mecanismos" (GetStreamFeature llamada, línea 2958; ese método definido alrededor de la línea 3340) con return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, en función $ es sólo una cadena que se pasa desde el destinatario de la llamada y la parte de identificación de la secuencia XML :: la sesión del objeto.

Con base en el error XML original y la posibilidad de que el identificador de sesión va mal, parece que el servidor o bien envía datos erróneos en algún momento inesperado a XML :: Stream y desaparecidos por los módulos que lo usan. No estoy convencido de que foo%40gmail.com@talk.google.com es el formato de nombre de usuario correcto, pero no sé cómo podría ser la causa de estos errores sin que 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 en absoluto, a continuación, tratar de capturar la salida del servidor de alguna manera para ver lo XML :: corriente está asfixiando sucesivamente.


Actualización: Para lo que vale, he instalado el módulo y lo estoy consiguiendo exactamente los mismos errores. Authen :: SASL :: Perl :: Simple y todos los otros requisitos previos hacen existir. Y cuando me puse el nombre de usuario a gmailaccountname@talk.google.com y habilitado mundial advertencias (por ejemplo, #! / Usr / bin / perl -w o perl -w filename.pl), XML :: Corriente revela un montón de indefinido problemas de valor, y de hecho SimpleSend escupe la advertencia "no se pudo conectar con el servidor Jabber"! (No, no sé lo que realmente significa:. ()


Actualización: Yo estaba tratando de instalar Net :: :: Jabber Bot (me di por vencido después de algunos errores del módulo SSL) para ver si se resuelve nada, y me di cuenta de su constructor tiene esta opción y tenga en cuenta:

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 de hacer algo inusual, que XML :: corriente no se molesta en lanzar una excepción para.

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