【问题标题】:Send XMPP notification from Node.js script从 Node.js 脚本发送 XMPP 通知
【发布时间】:2018-05-25 12:19:51
【问题描述】:

Node 脚本如何通过 XMPP 向 Jabber 用户发送通知(例如通过 Google Hangouts)?我看过像xmpp/client 这样的库,但它们似乎有点矫枉过正。有没有更简单的解决方案?

【问题讨论】:

  • 你使用的是哪个 xmpp 服务器?
  • @divsingh: any XMPP server 可以向 Google Hangouts 用户发送消息。
  • 我建议选择一个 XMPP 服务器,它为您提供了一个休息 API 来将节发送给特定的收件人。请参阅 ejabberd 管理 API 文档docs.ejabberd.im/developer/ejabberd-api/admin-api
  • 据我所知,环聊不支持 xmpp,而 Google Talk 服务正在关闭。您还有其他信息吗?
  • 但是我尝试使用 node.js 脚本并且talk.google.com 仍然接受 XMPP 连接

标签: javascript node.js xmpp


【解决方案1】:

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

可能没有比node-simple-xmpp 更简单的Node 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 lib 依赖于 [node-xmpp-client] (https://github.com/xmppjs/xmpp.js/tree/node-xmpp/packages/node-xmpp-client)。

与 Google Talk/环聊一起使用

上面的脚本也可以与 Google Talk/Hangouts 一起使用(经过测试),您只需将 xmpp.jpserver 替换为 talk.google.com 并使用 Google 帐户。开启https://myaccount.google.com/lesssecureapps,让Node.js脚本使用谷歌账号登录。

其他 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 changelog),websocket 仅从 1.1.0 版本开始可用。

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

没有特定 XMPP 库的替代解决方案可以使用 Net module,但在这种情况下,您需要管理所有 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 库。

【讨论】:

  • 我尝试了两个不同的&lt;user&gt;@gmail.com 帐户,它们都可以正常使用环聊,并且每次都得到XMPP authentication failure。我启用了不太安全的应用程序并将服务器设置为talk.google.com。想法?
  • 我也尝试过使用不同的帐户,并且成功了;你使用了我建议的最小脚本吗?
  • 另外,如果两人从来没有一起说话,也需要'订阅'
  • 没关系,这是一个可疑的 IP 问题。在我以发件人身份登录后看到它 - 出现“警告:Google 阻止了使用您的密码登录您的帐户的可疑尝试。”。现在脚本连接,但挂在xmpp.send
  • 我正在使用简单的脚本,用户通过 hangouts.google.com 进行了交谈。事实证明,无论如何我都必须运行订阅(一次)。很高兴我们解决了它,感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2016-12-20
  • 2015-11-16
  • 1970-01-01
  • 2017-02-01
相关资源
最近更新 更多