2009-12-21 70 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