禁用adblock

Adblock正在阻止网站上的一些内容

ADBlock errore

我怎样才能得到Perl的的Jabber :: SimpleSend与Gmail聊天的工作?

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

问题

我想编写一个简单的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

我有安装了认证介绍:: SASL CPAN模块。

解决方案

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

请参阅 http://www.gridpp.ac.uk/wiki/Nagios_jabber_notification对于良好评价,在75线使用的Net :: XMPP的Perl的完全工作落实。它inteded发送Nagios的通知,但它正是你需要的。

其他提示

我不熟悉的代码,但在XML该行::流是其中模块开始一个select()循环。 523-524线是其中通过IO ::选择一个插座到目标服务器,以及IO ::选择本身经过一个幸福的参考,这决不应是undef方式XML ::流使用它。

东西可能是修改的XML的“SELECT”元素::在Jabber模块流对象,可能在一个误导试图纠正一个服务器连接错误。我很抱歉,我不能更具体。


响应于该更新:

这是奇怪的错误,我一直看在Jabber模块内,无论如何,所以我把在看看源。以下是基于寻找使用可从CP​​AN模块的最新版本。除非你想开始继承这些模块和添加代码看到意想不到的事情发生这可能不是非常有用的。 (如果你不感兴趣的Jabber模块的内部可以跳过下一段。)

从更新的信息,我就跟踪到哪里认证介绍:: SASL :: Perl的嘎嘎叫着点上线41它需要从父 - $>机制,有两个可能的原因,假设认证介绍一个结果: :SASL不破。无论它是没有与从网:: XMPP ::协议(线2968),这似乎不太可能,或“机制”它的构造认证介绍设置:: SASL参数不存在误称为。网:: XMPP ::协议定义了“机制”(GetStreamFeature叫,线2958;围绕行3340定义的方法)与return $self->{STREAM}->GetStreamFeature($self->GetStreamID(),$feature);,其中$特点是距离被叫和XML的id部分传递一个字符串::流对象的会话。

根据原始XML错误和会话ID变质的可能性,看来该服务器或者通过使用它的模块在一些点意外到XML ::流和下落不明发送坏数据。我不相信foo%40gmail.com@talk.google.com是正确的用户名格式,但我不知道该怎么可能会造成这些错误不Jabber服务器做错事。

我将开始与不同的用户名新鲜不同的服务器上,看看的Jabber :: SimpleSend在所有工作,然后尝试以某种方式获取服务器的输出看什么XML ::流哽咽。


更新:的对于它的价值,我安装了模块和我得到完全相同的错误。认证介绍:: SASL :: Perl的::平原和所有其他先决条件确实存在。当我设置的用户名和gmailaccountname@talk.google.com启用全球警告(例如,#!的/ usr / bin中/ perl的-w或perl的-w filename.pl),XML ::流揭示了一堆的不确定值的问题,实际上SimpleSend吐出警告“无法连接到Jabber服务器”! (不,我不知道这是什么真正含义是:()


更新:的我想安装的Net :: Jabber的::博特(我放弃了一些SSL模块错误后),看它是否会解决任何问题,我注意到它的构造有这个选项并注意:

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

这加强了想法,服务器做一些不寻常的,这是XML ::流不刻意去抛出异常。

您的用户名应该是me@gmail.com但服务器名称是talk.google.com。因此,第一个参数应该是我的@ gmail.com @ talk.google.com,但我不知道是否Perl可以神交的是双@符号。你可能试图逃跑第一@与40%,使得第一参数是me%40gmail.com@talk.google.com。

更新I: 关于第二个错误,看起来像你缺少SASL身份验证模块。 Gmail使用SASL平原认证。所以,你有/usr/local/lib/perl5/site_perl/5.10.0/Authen/SASL/Perl/PLAIN.pm文件?

看起来你需要认证介绍:: SASL ::赛勒斯(C实现)或认证介绍:: SASL :: Perl的(Perl的实现)被安装以及认证介绍:: SASL(它只是试图找到最好的安装选项您的机器上,而对你来说,既没有发现)。

检查,看看是否有他们安装的一个。

这是我的源和手册的阅读 - 我没有测试这一点,情况因人而异

许可以下: CC-BY-SA归因
不隶属于 StackOverflow