从Node.js脚本发送XMPP通知

5
一个Node脚本如何通过XMPP向Jabber用户发送通知(例如通过Google Hangouts)?我看过类库,比如xmpp/client,但它们似乎有些臃肿。是否有更简单的解决方案?

你使用的是哪个XMPP服务器? - divsingh
@divsingh:任何XMPP服务器都可以向Google Hangouts用户发送消息。 - Dan Dascalescu
我建议选择一个提供REST API以向特定收件人发送数据包的XMPP服务器。请参阅ejabberd管理API文档https://docs.ejabberd.im/developer/ejabberd-api/admin-api/。 - divsingh
据我所知,Hangouts不支持XMPP,而Google Talk服务正在关闭。你有其他信息吗? - beaver
1
然而,我尝试使用一个Node.js脚本,而且“talk.google.com”仍然接受XMPP连接。 - beaver
@beaver:只要Pidgin列出Google Talk,我就没问题。 - Dan Dascalescu
1个回答

7

在Node中通过XMPP发送消息的最简单方法

在Node中,可能没有比node-simple-xmpp更简单的XMPP客户端库了。在这种情况下,向另一个Jabber用户发送消息的最小Node.js脚本如下:

var xmpp = require('simple-xmpp');

var jid = 'testjs@xmpp.jp';
var pwd = 'xyz';
var server = 'xmpp.jp';
var port = 5222;

xmpp.on('online', function(data) {
    console.log('Connected with JID: ' + data.jid.user);
    xmpp.send('testjs@007jabber.com', 'hello! time is '+new Date(), false);
});

xmpp.on('error', function(err) {
    console.error("error:", JSON.stringify(err));
});

xmpp.connect({
    jid: jid,
    password: pwd,
    host: server,
    port: port
});

如果这两个账号之前从未交流过,那么需要进行初步的“订阅”操作。
xmpp.subscribe('testjs@007jabber.com');

从package.json中可以看出,node-simple-xmpp库依赖于[node-xmpp-client] (https://github.com/xmppjs/xmpp.js/tree/node-xmpp/packages/node-xmpp-client)。

与Google Talk/Hangouts一起使用

上面的脚本在与Google Talk/Hangouts一起使用时也可以工作(已测试),您只需要将服务器xmpp.jp替换为talk.google.com并使用Google账户。打开https://myaccount.google.com/lesssecureapps以启用Node.js脚本使用Google账户登录。

其他XMPP库

截至https://npms.io/search?q=node-xmpp,还有一些针对Node的XMPP客户端库,但几乎所有这些库都依赖于node-xmpp-client或仅限于BOSH连接(通过HTTP轮询)。

对于那些习惯于在客户端使用Strophe.js的人来说,一个有趣的库是node-strophe。它基于Strophe.js 1.0.2版发布,这是一个适用于任何浏览器的库。不幸的是,该版本除了BOSH之外不支持其他协议(请参见Strophe.js变更日志),websocket仅在1.1.0版之后才可用。

探索没有特定XMPP库的替代方案

一种没有特定XMPP库的替代解决方案可以使用Net模块,但在这种情况下,您需要管理所有XMPP交互以建立与服务器的连接,请参见https://wiki.xmpp.org/web/Programming_XMPP_Clients

下面是一个非常简单的脚本示例,尝试使用Net模块启动与Jabber服务器的连接:

var net = require('net');

var jid = 'testjs@xmpp.jp';
var pwd = 'xyz';
var server = 'xmpp.jp';
var port = 5222;

var msg = '<stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="'+server+'">';

var client = new net.Socket();
client.connect(port, server, function() {
    console.log('Connected');
    client.write(msg);
});

client.on('data', function(data) {
    console.log('Received: ' + data);
});

您可以在控制台日志中看到Jabber服务器的正确答案,但从那时起就会变得混乱:您应该开始交换TLS消息(请参见https://xmpp.org/rfcs/rfc3920.html#tls)。

结论

我认为唯一可行的选择是使用node-simple-xmpp库的第一个选项。


我尝试了两个不同的<user>@gmail.com账户,它们都可以正常使用Hangouts,但每次都出现了“XMPP身份验证失败”的错误。我已经启用了不安全的应用程序,并将服务器设置为talk.google.com。有什么想法吗? - Dan Dascalescu
我也尝试了不同的账户,它可以工作;你使用了我建议的最小脚本吗? - beaver
此外,如果这两个人之前从未交谈过,则还需要进行“订阅”。 - beaver
没关系,这是一个可疑的IP问题。在我以发件人身份登录后看到了这个问题 - 出现了“警告:Google阻止了使用您的密码尝试登录您的帐户的可疑尝试。”。现在脚本已连接,但在xmpp.send处挂起。 - Dan Dascalescu
我正在使用简单的脚本,用户们通过hangouts.google.com进行交流。结果发现我仍然需要运行subscribe(一次)。很高兴我们解决了这个问题,感谢你的答案! - Dan Dascalescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接