14

我让 Ejabberd 与测试用户一起运行,并且运行良好。我想写一个可以拦截消息并修改它们的模块,如下:

  1. 拦截“消息”
  2. 将它们发送到 php 文件
  3. 从同一个 php 文件中获取结果(立即)
  4. 修改消息节并将其通过线路发送给收件人

ejabberd 文档薄弱,教程不存在。你能给我一些执行此操作的示例代码吗?然后我可以弄清楚如何根据我的需要配置它。

感谢捆绑!

阿迪尔

4

4 回答 4

14

这是此类模块的基本示例:

-module(packet_interceptor).
-behaviour(gen_mod).

-export([start/2,
         stop/1]).

-export([on_filter_packet/1]).


start(Host, _Opts) ->
    ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0).

on_filter_packet({From, To, XML} = Packet) ->
    %% does something with a packet
    %% should return modified Packet or atom `drop` to drop the packet
    Packet.

并确保将此模块添加到 ejabberd 的配置中module

{modules,
 [...
  ...
  ...
  {packet_interceptor, []}
 ]}.

只需扩展on_filter_packet/1您想要的方式并返回适当修改的数据包。

于 2009-12-21T15:45:12.370 回答
1

gleber 的例子非常好。我还为 Chesspark 编写了一个更复杂的数据包操作示例,名为 mod_sunshine

如何将此 XML 数据发送到 php(通过?xml=)并检索生成的 XML,然后将其传递给接收者?

如果您有使用 exmpp 的最新版本的 ejabberd,则可以使用 exmpp_xml:node_to_binary/1 或 exmpp_xml:node_to_list/1 将 XML 的内部表示分别转换为二进制或字符串。

在旧的 ejabberd 中有类似命名的函数,但在 xml 模块中。

于 2009-12-22T15:59:17.020 回答
0

看来您想要做的是创建一个 XMPP 服务器组件。在那篇文章中已经说了很多事情,哪个 XMPP 服务器来试验开发服务器组件

我可以给你一些有用的链接:

Gleber 的解决方案确实是面向“ejabberd”的(在您的情况下肯定是最简单的),而这个解决方案可以与其他 XMPP 服务器一起扩展。

于 2009-12-21T16:06:05.503 回答
0

有界面:

ejabberd_router:register_route(MyHost)

我过去使用过并且效果很好。一旦在MyHostejabberd 中注册,模块将MyHost通过info消息(假设gen_server)接收预期的通信。

正如@gleber 所指出的,不要忘记将您的模块添加到配置文件中。

于 2009-12-21T16:35:58.173 回答