2009-12-21 71 views
13

我已经与测试用户一起运行了Ejabberd,并且其工作正常。我想写可以截取邮件并修改它们的模块如下:如何过滤Ejabberd中的消息

  1. 拦截“的消息”
  2. 将它们发送到PHP文件
  3. 得到相同的PHP文件中的结果(即时)
  4. 修改消息节和电线发送到收件人

的ejabberd文档是薄弱和教程是不存在的。你能给我一些这样做的示例代码。然后,我可以根据自己的需要来设计它。

谢谢你的包!

阿迪尔

回答

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方式你想要并返回适当修改的数据包。

+0

谢谢gleber。我已经走了这么远,我可以从INFO_MSG看到我的packet_interceptor正在被调用。 如何发送这个XML数据到php(通过?xml = ) 并检索得到的XML,然后将它传递给收件人? – Adil 2009-12-22 06:36:40

+2

你应该使用http:request/1,2,3来调用你的PHP脚本。 IIRC on_filter_packet将在与ejabberd的路由器进程相同的进程中调用,所以您不应该在这里耗费太多时间。所以一个解决方案是为此产生一个新的进程,返回一个“drop”原子(丢弃数据包),并且当从PHP返回修改节时,使用'ejabberd_router:route(From,To,Packet)'发送它。可能on_filter_packet将在您发送的新数据包上再次被调用,所以一定要检测它并且不要处理它两次。 – gleber 2009-12-22 12:26:13

+0

要检测数据包,您可以使用自己的'xmlns'将''标签添加到数据包中。 – gleber 2009-12-22 12:27:09

0

看来你想要做的是创建一个XMPP服务器组件。在帖子Which XMPP server to experiment developing a server component上已经说了很多东西。

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

Gleber的解决方案是真正面向“ejabberd”(当然是最容易的,你的情况),而这一个可以与其他XMPP服务器扩展。

+0

Thx为链接。 – Adil 2009-12-22 06:44:29

+0

这是ejabberd为导向的问题是;) – gleber 2009-12-22 12:34:50

0

有接口:

ejabberd_router:register_route(MyHost)

这是我在过去使用和行之有效的。一旦MyHost向ejabberd注册,模块将接收旨在MyHostinfo消息(假设gen_server)的通信。

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

+1

嗨jldupont。 我不明白什么register_route做什么,什么是MyHost。你能指出我应该在哪里读更多? – Adil 2009-12-22 06:45:46

+0

ejabberd_router:register_route/1用于创建您自己的(子)域,并捕获在此(子)域中发送给JID的所有数据包。你可以在这里阅读更多 - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber 2009-12-22 12:34:04

1

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

如何将这个XML数据发送到php(通过?xml =)并检索得到的XML,然后将其传递给收件人?

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

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

+0

谢谢metajack。我已经阅读过你的文章。它帮助我获得了开始 – Adil 2009-12-23 11:29:23