2

インスタント メッセージを送信するための簡単な Perl スクリプトを作成しようとしています。Jabber は、最も効果的なプロトコルのように思えました。しかし、次のスクリプトは失敗します。

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

それは言います:

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.

カートマンの答えが指摘しているように、コードは実際には

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

しかし、それは次のエラーで失敗します:

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

Authen::SASL cpan モジュールがインストールされています。

4

4 に答える 4

3

Jabber :: SimpleSendは、標準のJabberサーバーと対話するためのより簡単な方法ですが、モジュール名に誤解を与えないでください。gtalkは実際には少し異なり、TLS暗号化(Jabber :: SimpleSendでは実行されません)とホスト名が必要です。変化する。Net :: XMPPを使用し、そのAPIを直接処理すると、より良い結果が得られます。

Net :: XMPPを使用した75行のperlでの十分にコメントされた、完全に機能する実装については、http://www.gridpp.ac.uk/wiki/Nagios_jabber_notificationを参照してください。nagios通知を送信することを目的としていますが、必要なことを正確に実行します。

于 2009-05-07T14:27:41.707 に答える
2

私はコードに詳しくありませんが、XML::Stream のその行は、モジュールが select() ループを開始する場所です。行 523-524 は、宛先サーバーに IO::Select ソケットを渡す場所であり、IO::Select 自体は、XML::Stream が使用する方法で undef であってはならない、祝福された参照を渡します。

何かが Jabber モジュールの XML::Stream オブジェクトの「SELECT」要素を変更している可能性があります。これは、サーバー接続エラーを修正するための誤った試みである可能性があります。詳しく言えなくてすみません。


更新に応じて:

これらは奇妙なエラーであり、とにかく Jabber モジュールの内部を調べるつもりだったので、ソースを調べました。以下は、CPAN から入手できる、使用されているモジュールの最新バージョンを参照することに基づいています。これらのモジュールのサブクラス化を開始し、コードを追加して予期しないことがどこで発生するかを確認したい場合を除き、これはおそらくあまり役​​に立ちません。(Jabber モジュールの内部に興味がない場合は、次の段落をスキップできます。)

更新された情報から、41 行目で Authen::SASL::Perl が鳴っている箇所までたどりました。これには $parent->mechanism からの結果が必要であり、Authen::SASL が無効であると仮定すると、2 つの原因が考えられます。壊れていません。Net::XMPP::Protocol (行 2968) から引数なしで誤って呼び出されているか、Authen::SASL のコンストラクターで設定された「メカニズム」が存在しないかのいずれかです。Net::XMPP::Protocol は、"メカニズム" (GetStreamFeature が呼び出された、行 2958、行 3340 付近で定義されたメソッド) を で定義します。return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);$feature は、呼び出し先から渡された単なる文字列であり、XML::Stream オブジェクトの ID 部分です。セッション。

元の XML エラーと、セッション ID が悪くなる可能性に基づいて、サーバーが XML::Stream に予期せず、それを使用するモジュールによって説明されていないある時点で不良データを送信するようです。foo%40gmail.com@talk.google.com が正しいユーザー名形式であるとは確信していませんが、Jabber サーバーが何か問題を起こしていない限り、これらのエラーがどのように発生するのかわかりません。

別のサーバーで別のユーザー名を使用して新たに開始し、Jabber::SimpleSend がまったく機能するかどうかを確認してから、何らかの方法でサーバーの出力をキャプチャして、XML::Stream が何を詰まらせているかを確認します。


更新:価値があるので、モジュールをインストールしましたが、まったく同じエラーが発生しています。Authen::SASL::Perl::PLAIN および他のすべての前提条件が存在します。そして、ユーザー名を gmailaccountname@talk.google.com に設定し、グローバル警告 (例: #!/usr/bin/perl -w または perl -w filename.pl) を有効にすると、XML::Stream は一連の未定義のメッセージを明らかにします。値の問題で、SimpleSend は実際に「Jabber サーバーに接続できませんでした」という警告を吐き出します。(いいえ、それが実際に何を意味するのかわかりません:()。


更新: Net::Jabber::Bot をインストールしようとしていた (いくつかの ssl モジュール エラーの後で断念した) それが何かを解決するかどうかを確認するために、そのコンストラクターにこのオプションとメモがあることに気付きました:

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

これは、サーバーが異常なことをしているという考えを補強しますが、XML::Stream はわざわざ例外をスローしません。

于 2009-04-29T00:35:44.897 に答える
1

Authen :: SASL :: Cyrus(C実装)またはAuthen :: SASL :: Perl(Perl実装)とAuthen :: SASL(インストールされている最適なオプションを見つけようとする)が必要なようです。あなたのマシン、そしてあなたにとってはどちらも見つかりません)。

それらの1つがインストールされているかどうかを確認してください。

これが私のソースとマニュアルの読み方です-私はこれをテストしていません、ymmv。

于 2009-05-04T09:57:00.480 に答える
1

ユーザー名は me@gmail.com ですが、サーバー名は talk.google.com です。したがって、最初のパラメーターは me@gmail.com@talk.google.com にする必要がありますが、Perl がその二重の @ 記号を理解できるかどうかはわかりません。最初のパラメータが me%40gmail.com@talk.google.com になるように、最初に @ を %40 でエスケープしてみてください。

更新 I: 2 番目のエラーについては、SASL 認証モジュールが不足しているようです。GMail は SASL Plain 認証を使用します。/usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm ファイルはありますか?

于 2009-05-02T22:17:40.653 に答える