如何让Perl的Jabber :: SimpleSend与Gmail聊天一起使用?

时间:2009-04-28 20:19:29

标签: perl xmpp instant-messaging

我正在尝试编写一个简单的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.

正如cartman的回答所指出的那样,代码实际应该是

#!/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 个答案:

答案 0 :(得分:3)

Jabber :: SimpleSend是与标准Jabber服务器交互的更简单方法,但不要让模块名称误导你:gtalk确实有点不同,需要TLS加密(Jabber :: SimpleSend不会这样做)和主机名更改。使用Net :: XMPP并直接处理其API,您将获得更好的结果。

请参阅http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification,了解使用Net :: XMPP在75行Perl中完善的完整工作实现。它打算发送nagios通知,但它完全符合你的需要。

答案 1 :(得分:2)

我不熟悉代码,但XML :: Stream中的那一行是模块开始select()循环的地方。第523-524行是传递IO ::选择一个到目标服务器的套接字,IO :: Select本身传递一个受祝福的引用,它应该永远不会像XML :: Stream使用它那样。

某些东西可能正在修改Jabber模块中XML :: Stream对象的“SELECT”元素,可能是错误的尝试纠正服务器连接错误。对不起,我不能更具体。


响应更新:

这些是奇怪的错误,无论如何我一直想看看Jabber模块,所以我看了看源代码。以下内容基于查看CPAN中可用模块的最新版本。除非你想开始对这些模块进行子类化并添加代码以查看意外发生的事情,否则这可能不是很有用。 (如果您对Jabber模块的内部结构不感兴趣,可以跳过下一段。)

从更新的信息中,我已将其追溯到第41行的Authen :: SASL :: Perl呱呱叫它。它需要来自$ parent->机制的结果,并且有两个可能的原因,假设Authen :: SASL没有坏掉。它被错误地调用而没有来自Net :: XMPP :: Protocol(第2968行)的参数,这似乎不太可能,或者它在Authen :: SASL的构造函数中设置的“机制”不存在。 Net :: XMPP :: Protocol使用return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);定义“机制”(GetStreamFeature调用,行2958;该方法在第3340行定义),其中$ feature只是从被调用者传递的字符串和id的一部分。 XML :: Stream对象的会话。

基于原始的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不会为此抛出异常。

答案 2 :(得分:1)

您的用户名应为me@gmail.com,但服务器名称为talk.google.com。所以第一个参数应该是me @ gmail.com @ talk.google.com,但我不确定Perl是否可以理解双@符号。您可以尝试使用%40转义第一个@,以便第一个参数是me%40gmail.com@talk.google.com。

更新我: 关于第二个错误,看起来您缺少SASL身份验证模块。 GMail使用SASL Plain身份验证。你有/usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm文件吗?

答案 3 :(得分:1)

看起来你需要安装Authen :: SASL :: Cyrus(C实现)或Authen :: SASL :: Perl(Perl实现)以及Authen :: SASL(它只是试图找到最好的您的计算机上安装了选项,并且,对您而言,找不到。

检查是否安装了其中一个。

这是我对源代码和手册的阅读 - 我没有测试过这个,ymmv。