Perl の Jabber::SimpleSend を Gmail チャットで動作させるにはどうすればよいですか?

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

  •  18-09-2019
  •  | 
  •  

質問

インスタント メッセージを送信するための簡単な 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 モジュールはインストールされています。

役に立ちましたか?

解決

のJabber :: SimpleSendは、標準のJabberサーバと対話するための簡単な方法ですが、モジュール名はあなたを誤解させてはいけない:Gtalkなどは、確かに少し異なっている、TLS暗号化を要求する(Jabberの:: SimpleSendはしないだろうということ)そして、ホスト名の変更。あなたは、ネット:: XMPPを使用して、そのAPIを直接扱うより良い結果を取得します。

http://www.gridpp.ac.uk/wiki/Nagios_jabber_notificationネット:: XMPPを使用してのperlの75行ではよくコメントし、完全に作業実施のため。 Nagiosの通知を送信するintededが、それはあなたが必要な正確に何をしています。

他のヒント

コードには詳しくありませんが、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 はわざわざ例外をスローしないという考えを強化します。

あなたのユーザー名はme@gmail.comする必要がありますが、サーバー名がtalk.google.comです。だから、最初のパラメータは、私@ gmail.com @ talk.google.comをする必要がありますが、私はPerlがその二重の@記号を完全に理解できるかどうかわかりません。あなたは、最初のパラメータがme%40gmail.com@talk.google.comになるように40%で最初の@を脱出しようとする場合があります。

更新I: あなたはSASL認証モジュールが欠けているように、2番目のエラーについて、見えます。 GmailはSASL平野認証を使用しています。だから、/usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pmファイルを持っているのですか?

あなたはのAuthenを必要と似:: SASL ::サイラス(C実装)またはのAuthen :: SASL :: Perlの(Perlの実装は)単に最良を見つけるためにしようとするのAuthen :: SASL(だけでなく、インストールされるように見えますお使いのマシンにインストールされているオプション、そして、あなたのために、)どちらも見つかっていない。

あなたがそれらのいずれかをインストールしているかどうかを確認します。

これは、ソースとマニュアルの私の読書だ - 。私はこれをテストしていませんでした、メーリングリストへ

scroll top