Question

Je suis en train d'écrire un simple script Perl pour envoyer un message instantané. Jabber semblait que cela pourrait être le protocole le plus favorable. Mais le script suivant échoue:

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

Il dit:

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.

Comme la réponse de Cartman souligne, le code devrait en fait être

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

Mais cela échoue avec l'erreur suivante:

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

J'ai le module CPAN SASL Authen installé.

Était-ce utile?

La solution

Jabber :: SimpleSend est le moyen plus facile d'interagir avec un serveur standard Jabber, mais ne laissez pas le nom du module vous induire en erreur: Gtalk est en effet un peu différent, ce qui nécessite le cryptage TLS (que Jabber :: SimpleSend ne le fera pas) et un changement de nom d'hôte. Vous obtiendrez de meilleurs résultats en utilisant Net :: XMPP et de traiter directement avec son API.

Voir http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification pour une mise en œuvre, le travail pleinement bien commenté dans 75 lignes de Perl utilisant net :: XMPP. Il est d'envoyer des notifications BUT nagios, mais il fait exactement ce dont vous avez besoin.

Autres conseils

Je ne suis pas familier avec le code, mais cette ligne en XML :: Stream est où le module commence une boucle select (). Ligne 523-524 est l'endroit où est passe IO :: Sélectionnez un socket pour le serveur de destination, et IO :: Select se passe une référence bénie, qui ne doit jamais être indéfinies XML de façon :: flux utilise.

Quelque chose est en train de modifier probablement l'élément « SELECT » du XML :: objet flux dans les modules Jabber, peut-être dans une tentative malavisée de corriger une erreur de connexion au serveur. Je suis désolé, je ne pouvais pas être plus précis.


En réponse à la mise à jour:

Ce sont des erreurs bizarres, et j'ai eu l'intention de regarder à l'intérieur des modules Jabber de toute façon, donc je pris à regarder à la source. Ce qui suit est basé sur la recherche les dernières versions des modules utilisés disponibles à partir de CPAN. Ceci est sans doute pas très utile, sauf si vous voulez commencer ces modules et sous-classement ajouter du code pour voir où quelque chose d'inattendu se produit. (Vous pouvez sauter le paragraphe suivant si vous n'êtes pas intéressé par les internes des modules Jabber.)

D'après les informations mises à jour, je l'ai retracée au point où Authen :: SASL :: Perl croasse en ligne 41. Il a besoin d'un résultat de $ parent-> mécanisme, et il y a deux causes possibles, dans l'hypothèse Authen: : SASL est pas cassé. Soit il est appelé à tort sans arguments de Net :: XMPP :: Protocole (ligne 2968), ce qui semble peu probable, ou les « mécanismes » il mis dans le constructeur de Authen :: SASL n'existent pas. Net :: XMPP :: Protocole définit les « mécanismes » (GetStreamFeature appelé, la ligne 2958, cette méthode définie autour de la ligne 3340) avec return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, où fonction $ est juste une chaîne passée de la et la partie callee identifiant du XML :: flux session de l'objet.

Sur la base de l'erreur XML d'origine et la possibilité de l'identifiant de session va mal, il semble que le serveur soit envoie des données incorrectes à un moment inattendu pour XML :: Stream et portés disparus par les modules qui l'utilisent. Je ne suis pas convaincu que foo%40gmail.com@talk.google.com est le format de nom d'utilisateur, mais je ne sais pas comment cela pourrait être à l'origine de ces erreurs sans que le serveur Jabber faire quelque chose de mal.

Je commencerais frais avec différents noms d'utilisateur sur un serveur différent et voir si Jabber :: SimpleSend fonctionne du tout, essayez de capturer la sortie du serveur en quelque sorte de voir ce que XML :: flux est étouffait.


Mise à jour: Pour ce que ça vaut, j'ai installé le module et j'obtenir les mêmes erreurs exactes. Authen :: SASL :: Perl :: PLAIN et toutes les autres conditions préalables existent. Et quand je mets le nom d'utilisateur à gmailaccountname@talk.google.com et avertissements ENABLED global (par exemple, #! / Usr / bin / perl -w ou perl -w filename.pl), XML :: flux révèle un groupe de non définie problèmes de valeur et SimpleSend crache en fait la mise en garde « Impossible de se connecter au serveur Jabber »! (Non, je ne sais pas ce que cela signifie vraiment. ()


Mise à jour: J'ai essayé d'installer Net :: Jabber :: Bot (j'ai donné après quelques erreurs de module ssl) pour voir si elle résoudrait rien, et je remarqué son constructeur a cette option et noter:

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

qui renforce l'idée que faire quelque chose d'inhabituel du serveur, qui XML :: flux ne prend pas la peine de jeter une exception pour.

Votre nom d'utilisateur doit être me@gmail.com mais le nom du serveur est talk.google.com. Donc, le premier paramètre devrait être moi @ gmail.com @ talk.google.com, mais je ne suis pas sûr que Perl peut grok que le double signe @. Vous pouvez essayer de sortir d'abord avec @% 40, de sorte que le premier paramètre est me%40gmail.com@talk.google.com.

Mise à jour I: A propos de la deuxième erreur, on dirait que vous manque des modules d'authentification SASL. GMail utilise l'authentification SASL Plain. Donc, avez-vous le fichier /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm?

On dirait que vous avez besoin Authen :: SASL :: Cyrus (la mise en œuvre C) ou Authen :: SASL :: Perl (la mise en œuvre Perl) à installer ainsi que Authen :: SASL (qui essaie simplement de trouver le meilleur l'option installée sur votre machine, et, pour vous, ne trouve ni).

Vérifiez si vous avez l'un d'eux est installé.

C'est ma lecture de la source et le manuel -. Je ne l'ai pas testé, YMMV

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top