如何在Ejabberd中过滤消息

Adi*_*dil 13 erlang hook ejabberd

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

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

ejabberd文档很薄弱,教程也不存在.你能给我一些代码来做这个吗?然后我可以想出如何根据我的需要配置它.

谢谢捆绑!

阿迪尔

gle*_*ber 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.
Run Code Online (Sandbox Code Playgroud)

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

{modules,
 [...
  ...
  ...
  {packet_interceptor, []}
 ]}.
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该使用http:request/1,2,3来调用PHP脚本.IIRC on_filter_packet将在与ejabberd的路由器进程相同的进程中被调用,所以你不应该在那里做任何太费时间的事情.因此,解决方案是为此生成一个新进程,返回一个`drop`原子(删除数据包),当从PHP返回修改后的节时,使用`ejabberd_router:route(From,To,Packet)`发送它.可能会在您发送的新数据包上再次调用on_filter_packet,因此请务必检测它并且不要对其进行两次处理. (2认同)