我已经启动了 Ejabberd 并与测试用户一起运行,并且运行良好。我想写一个可以拦截消息并修改消息的模块,如下:

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

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 服务器.

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

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

有界面:

ejabberd_router:register_route(MyHost)

我过去用过并且效果很好。一旦 MyHost 已向 ejabberd 注册,该模块将接收旨在 MyHost 通过 info 消息(假设 gen_server).

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top