题
我已经启动了 Ejabberd 并与测试用户一起运行,并且运行良好。我想写一个可以拦截消息并修改消息的模块,如下:
- 拦截“消息”
- 将它们发送到 php 文件
- 从同一个 php 文件获取结果(立即)
- 修改消息节并将其通过线路发送给收件人
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
您想要的方式并返回经过适当修改的数据包。
其他提示
格勒伯的例子非常好。我还编写了一个为 Chesspark 构建的更复杂的数据包操作示例,称为阳光模组.
如何将此 XML 数据发送到 php(通过 ?xml=)并检索结果 XML,然后将其传递给接收者?
如果您有使用 exmpp 的最新版本的 ejabberd,则可以使用 exmpp_xml:node_to_binary/1 或 exmpp_xml:node_to_list/1 分别将 XML 的内部表示形式转换为二进制或字符串。
旧版 ejabberd 中也有类似命名的函数,但位于 xml 模块中。
看来您想要做的是创建一个 XMPP 服务器组件。那个帖子里已经说了很多话了 实验开发服务器组件时使用哪种 XMPP 服务器.
我可以给你链接一些有用的链接:
Python 中的 Echo-Bot 来自metajack.im,一个来自 XMPP 专家的非常好的博客。该机器人监听任何消息节并回复其中的一些。
Gleber 的解决方案实际上是面向“ejabberd”的(对于您的情况来说当然是最简单的一种),而这个解决方案可以与其他 XMPP 服务器一起扩展。
有界面:
ejabberd_router:register_route(MyHost)
我过去用过并且效果很好。一旦 MyHost
已向 ejabberd 注册,该模块将接收旨在 MyHost
通过 info
消息(假设 gen_server
).
正如@gleber 所指出的,不要忘记将模块添加到配置文件中。