Frage

Ich versuche, einen einfachen Perl-Skript zu schreiben, einen Instant-Messenger zu senden. Jabber schien wie es das Protokoll förderlich sein könnte. Aber das folgende Skript fehlschlägt:

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

Dort heißt es:

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.

Als Cartmans Antwort weist darauf hin, sollte der Code tatsächlich sein

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

Aber das schlägt mit dem folgenden Fehler:

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

ich die SASL cpan Modul installiert :: Authen tun haben.

War es hilfreich?

Lösung

Jabber :: Simple ist der einfachere Weg mit einem Standard-Jabber-Server zu interagieren, aber lassen Sie sich nicht die Modulnamen täuschen Sie: gtalk ist in der Tat ein bisschen anders, erfordert TLS-Verschlüsselung (das Jabber :: Simple nicht tun) und einen Hostnamen ändern. Sie werden bessere Ergebnisse mit Net :: XMPP erhalten und direkt mit seiner API zu tun.

Siehe http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification für eine gut kommentiert, voll funktionsfähige Implementierung in 75 Zeilen perl Net :: XMPP verwenden. Es ist die bestimmungsgemäßen nagios-Benachrichtigungen zu senden, aber es tut genau das, was Sie brauchen.

Andere Tipps

Ich bin nicht vertraut mit dem Code, aber diese Linie in XML :: Stream, wo das Modul einen select () Schleife beginnt. Linie 523-524 ist, wo IO geht :: eine Buchse Wählen Sie auf dem Zielserver, und IO :: Wählen Sie selbst übergibt eine gesegnete Referenz, die nie undef dem Weg XML sein sollte :: Strom verwendet es.

Etwas wahrscheinlich Modifizieren das „SELECT“ Element des XML :: Stream-Objekts in der Jabber-Module, möglicherweise in einem fehlgeleiteten Versuch, einen Server-Verbindungsfehler zu korrigieren. Es tut mir leid, ich könnte nicht mehr spezifisch sein.


Als Reaktion auf das Update:

Dies sind seltsame Fehler, und ich habe ohnehin in den Jabber-Modulen suchen die Bedeutung gewesen, so nahm ich an Blick auf die Quelle. Im Folgenden wird anhand von Blick auf den neuesten Versionen der Module von CPAN verwendet. Dies ist wahrscheinlich nicht sehr nützlich, wenn Sie diese Module starten wollen Subklassen und das Hinzufügen von Code zu sehen, wo etwas Unerwartetes passiert. (Sie können den nächsten Absatz überspringen, wenn Sie in der Jabber-Module Interna nicht interessiert sind.)

Von den aktualisierten Informationen habe ich es auf den Punkt zurückgeführt, wo Authen :: SASL :: Perl krächzt auf der Leitung 41. ein Ergebnis von Eltern- $ benötigt> Mechanismus, und es gibt zwei mögliche Ursachen, unter der Annahme, Authen: : SASL ist nicht gebrochen. Entweder es wird falsch ohne Argumente von Net :: XMPP :: Protocol (Linie 2968) genannt, bei denen es unwahrscheinlich scheint, oder die „Mechanismen“ es im Konstruktor gesetzt für Authen :: SASL nicht existieren. Net :: XMPP :: Protokoll definiert die „Mechanismen“ (GetStreamFeature genannt, Linie 2958, das Verfahren um die Linie 3340 definiert sind) mit return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, wobei $ Feature von dem Angerufenen übergeben nur eine Zeichenfolge ist und die ID-Teil des XML :: Strom Gegenstand der Sitzung.

Auf der Grundlage der ursprünglichen XML-Fehlern und die Möglichkeit, die Session-ID geht schlecht, scheint es, dass der Server entweder schlechte Daten zu einem bestimmten Zeitpunkt unerwartet zu XML sendet :: Strom und nachgewiesenes von den Modulen mit ihm. Ich bin nicht davon überzeugt, dass foo%40gmail.com@talk.google.com ist das richtige Benutzername Format, aber ich weiß nicht, wie das könnte diese Fehler ohne den Jabber-Server verursacht etwas falsch zu machen.

Ich würde mit verschiedenen Benutzername auf einem anderen Server neu beginnen und sehen, ob Jabber :: Simpleüberhaupt funktioniert, dann versuche die Server-Ausgabe irgendwie zu erfassen, um zu sehen, was XML :: Stream ist erstickt an.


Update: Für das, was es wert ist, habe ich installiert das Modul und ich bin genau die gleichen Fehler zu bekommen. Authen :: SASL :: Perl :: EBENE und alle anderen Voraussetzungen existieren. Und wenn ich den Benutzernamen gmailaccountname@talk.google.com gesetzt und freigegeben globale Warnungen (zB #! / Usr / bin / perl -w oder perl -w filename.pl), XML :: Strom offenbart eine Reihe von undefined Wertprobleme und Simple spuckt tatsächlich die Warnung aus „konnte keine Verbindung zum Jabber-Server“! (Nein, ich weiß nicht, was das wirklich bedeutet. ()


Update: Ich habe versucht, Net :: Jabber :: Bot zu installieren (habe ich nach einigen ssl Modulfehler nach oben), um zu sehen, ob es etwas lösen würde, und ich bemerkte, dessen Konstruktor diese Option hat und beachten Sie:

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

, die die Idee verstärkt, dass der Server tut etwas Ungewöhnliches, das XML :: Strom stört nicht für eine Ausnahme zu werfen.

sollte Ihr Benutzername sein me@gmail.com aber der Servername ist talk.google.com. So sollte der erste Parameter sein me @ gmail.com @ talk.google.com, aber ich bin nicht sicher, ob Perl, dass doppelte @ Zeichen grok kann. Sie können versuchen, erste @ mit% 40 entweichen, so dass der erste Parameter me%40gmail.com@talk.google.com ist.

Update I: Über den zweiten Fehler, sieht aus wie Sie SASL Authentifizierungsmodule fehlen. GMail verwendet SASL Plain Authentifizierung. So haben Sie /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm Datei haben?

Sieht aus wie Sie Authen benötigen :: SASL :: Cyrus (die C-Implementierung) oder Authen :: SASL :: Perl (die Perl-Implementierung) als auch installiert werden, wie Authen :: SASL (die einfach versucht, das Beste zu finden Option auf Ihrem Computer installiert, und für Sie findet weder).

Überprüfen Sie, ob Sie einen von ihnen installiert haben.

Das ist meine Lektüre der Quelle und das Handbuch -. Ich nicht getestet habe, ymmv

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top