如何在Ejabberd中过滤消息

时间:2009-12-21 12:38:40

标签: erlang hook ejabberd

我让Ejabberd与测试用户一起运行,并且工作正常。我想编写一个可以拦截消息并修改它们的模块,如下所示:

  1. 拦截“消息”
  2. 将它们发送到php文件
  3. 从同一个php文件(立即)
  4. 获取结果
  5. 修改邮件节并将其发送给收件人
  6. ejabberd文档很薄弱,教程不存在。你能给我一些这样做的示例代码吗?然后我可以想出如何根据我的需要配置它。

    感谢捆绑!

    阿迪尔

4 个答案:

答案 0 :(得分: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并返回适当修改的数据包。

答案 1 :(得分: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模块中。

答案 2 :(得分:0)

您希望在那里创建一个XMPP服务器组件。这篇文章Which XMPP server to experiment developing a server component已经说了很多话。

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

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

答案 3 :(得分:0)

有界面:

ejabberd_router:register_route(MyHost)

我过去使用过的,效果很好。在MyHost向ejabberd注册后,该模块将收到旨在MyHostinfo条消息的通信(假设为gen_server)。

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