我已經與測試用戶一起運行了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