2009-12-21 20 views
13

Ho installato Ejabberd con utenti di test e funziona correttamente. Voglio scrivere un modulo in grado di intercettare i messaggi e modificarli, come segue:Come filtrare i messaggi in Ejabberd

  1. intercettare "messaggi"
  2. li invia ad un file php
  3. ottenere il risultato dallo stesso file php (immediato)
  4. modificare il messaggio strofa e inviarlo giù il filo al destinatario

la documentazione ejabberd è debole e tutorial sono inesistenti. Puoi darmi qualche esempio di codice che faccia questo. Posso quindi capire come configurarlo per le mie esigenze.

Grazie un pacchetto!

Adil

risposta

14

Ecco l'esempio di base di tale modulo:

-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. 

e assicurarsi di inserire questo modulo nella configurazione di ejabberd in module sezione:

{modules, 
[... 
    ... 
    ... 
    {packet_interceptor, []} 
]}. 

Basta estendere on_filter_packet/1 la strada vuoi e restituisci pacchetti opportunamente modificati.

+0

Grazie gleber. Sono già andato così lontano e posso vedere dal? INFO_MSG che viene chiamato il mio packet_interceptor. Come inviare questi dati XML a php (tramite? Xml = ) e recuperare l'XML risultante e quindi passarlo al destinatario? – Adil

+2

Probabilmente dovresti usare un http: request/1,2,3 per chiamare lo script PHP. IIRC on_filter_packet verrà chiamato nello stesso processo del processo del router di ejabberd, quindi non dovresti fare troppo tempo. Quindi una soluzione è generare un nuovo processo per questo, restituire un atomo 'drop' (per rilasciare il pacchetto) e quando la stanza modificata viene restituita da PHP, inviarla usando' ejabberd_router: route (From, To, Packet) '. Probabilmente on_filter_packet verrà chiamato di nuovo sul nuovo pacchetto che hai inviato, quindi assicurati di rilevarlo e non elaborarlo due volte. – gleber

+0

Per rilevare il pacchetto è possibile aggiungere il tag '' in un pacchetto con il proprio 'xmlns'. – gleber

0

Sembra che quello che vuoi fare è creare un componente server XMPP. Un sacco di cose è già stato detto su quel post Which XMPP server to experiment developing a server component.

posso collegare alcuni link utili:

soluzione Gleber è davvero "ejabberd" orientato (certamente la più semplice nel tuo caso), mentre questo può scalare con altri server XMPP.

+0

Thx per i collegamenti. – Adil

+0

È orientato a ejabberd come la domanda è;) – gleber

0

V'è l'interfaccia:

ejabberd_router:register_route(MyHost)

che ho usato in passato e funziona bene. Una volta che lo MyHost viene registrato con ejabberd, il modulo riceverà le comunicazioni destinate a MyHost tramite i messaggi info (supponendo che sia gen_server).

Come indicato da @gleber, non dimenticare di aggiungere il modulo al file di configurazione.

+1

Ciao jldupont. Non ho capito bene cosa fa register_route e cosa è MyHost. Puoi indicarmi dove dovrei leggere più lontano? – Adil

+0

ejabberd_router: register_route/1 viene utilizzato per creare il proprio dominio (secondario) e per acquisire tutti i pacchetti inviati a JID in questo dominio (secondario). Puoi leggere di più qui - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

L'esempio di gleber è eccellente. Ho anche scritto un esempio più complesso di manipolazione dei pacchetti che ho creato per Chesspark chiamato mod_sunshine.

Come inviare questi dati XML a php (tramite? Xml =) e recuperare l'XML risultante e quindi passarlo al destinatario?

Se si dispone di una versione recente di ejabberd che utilizza exmpp, è possibile utilizzare exmpp_xml: node_to_binary/1 o exmpp_xml: node_to_list/1 per accendere la rappresentazione interna del XML ad un binario o una stringa, rispettivamente.

C'erano funzioni con nomi simili nel vecchio ejabberd, ma all'interno del modulo xml.

+0

Grazie a metajack. Ho letto il tuo articolo prima. Mi ha aiutato a ottenere un inizio – Adil

Problemi correlati