我已经与测试用户一起运行了Ejabberd,并且其工作正常。我想写可以截取邮件并修改它们的模块如下:如何过滤Ejabberd中的消息
- 拦截“的消息”
- 将它们发送到PHP文件
- 得到相同的PHP文件中的结果(即时)
- 修改消息节和电线发送到收件人
的ejabberd文档是薄弱和教程是不存在的。你能给我一些这样做的示例代码。然后,我可以根据自己的需要来设计它。
谢谢你的包!
阿迪尔
我已经与测试用户一起运行了Ejabberd,并且其工作正常。我想写可以截取邮件并修改它们的模块如下:如何过滤Ejabberd中的消息
的ejabberd文档是薄弱和教程是不存在的。你能给我一些这样做的示例代码。然后,我可以根据自己的需要来设计它。
谢谢你的包!
阿迪尔
这里有这样的模块的基本的例子:
-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
方式你想要并返回适当修改的数据包。
看来你想要做的是创建一个XMPP服务器组件。在帖子Which XMPP server to experiment developing a server component上已经说了很多东西。
我可以联系你一些有用的链接:
An Echo-Bot in Python从metajack.im,一个非常漂亮的博客从XMPP大师。这个机器人监听任何消息节并回复其中一些消息节。
Gleber的解决方案是真正面向“ejabberd”(当然是最容易的,你的情况),而这一个可以与其他XMPP服务器扩展。
有接口:
ejabberd_router:register_route(MyHost)
这是我在过去使用和行之有效的。一旦MyHost
向ejabberd注册,模块将接收旨在MyHost
到info
消息(假设gen_server
)的通信。
正如@gleber所述,不要忘记将模块添加到配置文件中。
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模块中。
谢谢metajack。我已经阅读过你的文章。它帮助我获得了开始 – Adil 2009-12-23 11:29:23
谢谢gleber。我已经走了这么远,我可以从INFO_MSG看到我的packet_interceptor正在被调用。 如何发送这个XML数据到php(通过?xml =) 并检索得到的XML,然后将它传递给收件人? –
Adil
2009-12-22 06:36:40
你应该使用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
要检测数据包,您可以使用自己的'xmlns'将' '标签添加到数据包中。 –
gleber
2009-12-22 12:27:09