Domanda

Sto cercando di scrivere un semplice script in Perl per inviare un messaggio istantaneo. Jabber sembrava che potrebbe essere il protocollo più favorevole. Ma il seguente script non riesce:

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

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

Per quanto la risposta di Cartman fa notare, il codice dovrebbe essere effettivamente

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

Ma che non riesce con il seguente errore:

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

ho l'Authen :: modulo CPAN SASL installato.

È stato utile?

Soluzione

Jabber :: SimpleSend è il modo più semplice per interagire con un server standard Jabber, ma non lasciare che il nome del modulo vi seduca: gtalk è infatti un diverso, che richiede la codifica TLS bit (che Jabber :: SimpleSend non lo farà) e un cambiamento hostname. Otterrete risultati migliori usando Net :: XMPP e trattare direttamente con le sue API.

http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification per un ben commentato, implementazione completamente funzionante in 75 righe di perl usando Net :: XMPP. E 'in questione, destinate per inviare notifiche di Nagios, ma fa esattamente quello che ti serve.

Altri suggerimenti

Non ho dimestichezza con il codice, ma quella linea in XML :: Stream è dove il modulo inizia un ciclo select (). Linea 523-524 è dove si passa IO :: Scegliete un socket al server di destinazione, e IO :: Selezionare sé passa un riferimento benedetta, che non dovrebbe mai essere undef il modo XML :: Streaming lo utilizza.

Qualcosa sta probabilmente modificando l'elemento "SELECT" del XML :: oggetto Stream nei moduli Jabber, possibilmente in un maldestro tentativo di correggere un errore di connessione al server. Mi dispiace non ho potuto essere più specifico.


In risposta alla aggiornamento:

Questi sono errori strani, e ho intenzione di guardare dentro i moduli Jabber in ogni caso, così ho preso a guardare alla fonte. Di seguito si basa su guardando le ultime versioni dei moduli utilizzati disponibile su CPAN. Questo probabilmente non è molto utile se non si desidera avviare sottoclassi questi moduli e l'aggiunta di codice per vedere dove succede qualcosa di inaspettato. (È possibile saltare il paragrafo successivo se non sei interessato alle fondamenta dei moduli Jabber.)

In base alle informazioni aggiornate, ho risalire al punto in cui Authen :: :: SASL Perl gracchia on line 41. Ha bisogno di un risultato da $ genitore> meccanismo, e ci sono due possibili cause, ipotizzando Authen: : SASL non è rotto. O è stato chiamato in modo non corretto senza argomenti da Net :: :: XMPP Protocol (linea 2968), che sembra improbabile, o "meccanismi" IT Situato nel costruttore per Authen :: SASL non esistono. Net :: :: XMPP protocollo definisce i "meccanismi" (GetStreamFeature chiamata, la linea 2958; che il metodo definito attorno alla riga 3340) con return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);, dove caratteristica $ è solo una stringa passata dal callee e la parte ID del flusso XML :: La sessione di oggetto.

In base l'errore XML originale e la possibilità di l'id di sessione in corso male, sembra che il server sia invia i dati cattivi ad un certo punto inaspettato per XML :: Stream e dispersi dai moduli che lo utilizzano. Io non sono convinto che foo%40gmail.com@talk.google.com è il formato del nome utente ragione, ma io non so come che potrebbero causare questi errori senza il server Jabber fare qualcosa di sbagliato.

Vorrei iniziare fresco con diversi nomi utente su un server diverso e vedere se Jabber :: SimpleSend funziona affatto, quindi provare a catturare l'output del server in qualche modo per vedere quali XML :: flusso sta soffocando via.


Aggiornamento: Per quello che vale, ho installato il modulo e sto ottenendo gli stessi errori esatti. Authen :: :: SASL Perl :: pianura e tutti gli altri prerequisiti esistono. E quando ho impostato il nome utente per gmailaccountname@talk.google.com e abilitato globale avvertenze (ad esempio, #! / Usr / bin / perl -w o perl -w filename.pl), XML :: flusso rivela un gruppo di non definito problemi ai valori, e in realtà SimpleSend sputa fuori l'avviso "Impossibile connettersi al server Jabber"! (No, non so che cosa significa veramente:. ()


Aggiornamento: Ho cercato di installare Net :: :: Jabber Bot (ho rinunciato dopo alcuni errori del modulo SSL) per vedere se avrebbe risolto nulla, e ho notato il suo costruttore ha questa opzione e nota:

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

, che rafforza l'idea che del server fare qualcosa di insolito, che XML :: flusso non si preoccupa di un'eccezione per.

Il nome utente dovrebbe essere me@gmail.com ma il nome del server è talk.google.com. Così il primo parametro dovrebbe essere me @ gmail.com @ talk.google.com, ma non sono sicuro se Perl può Grok che doppio segno @. Puoi provare a scappare prima @ con il% 40 in modo che il primo parametro è me%40gmail.com@talk.google.com.

Aggiornamento I: Circa il secondo errore, sembra che vi manca moduli di autenticazione SASL. Gmail utilizza l'autenticazione SASL Plain. Così avete il file /usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm?

Sembra che si richiede Authen :: :: SASL Cyrus (l'implementazione C) o Authen :: :: SASL Perl (l'implementazione Perl) da installare così come Authen :: SASL (che cerca semplicemente di trovare la migliore opzione installato sul computer, e, per voi, trova nessuno).

Controlla per vedere se si dispone di uno di loro installato.

Questa è la mia lettura della sorgente e del manuale -. Non ho provato questo, YMMV

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top