2009-12-21 27 views
13

Tengo Ejabberd en funcionamiento con los usuarios de prueba, y está funcionando bien. Quiero escribir un módulo que puede interceptar mensajes y modificarlos, de la siguiente manera:Cómo filtrar mensajes en Ejabberd

  1. de intercepción "mensajes"
  2. los envían a un archivo PHP
  3. obtener el resultado del mismo archivo PHP (inmediata)
  4. Modificar la estrofa mensaje y enviarlo por el cable al receptor

la documentación ejabberd es débil y tutoriales son inexistentes. ¿Me puede dar algún código de muestra que hace esto? Entonces puedo averiguar cómo configurarlo para mis necesidades.

¡Gracias a un paquete!

Adil

Respuesta

14

Aquí está el ejemplo básico de estos módulos:

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

y asegúrese de agregar este módulo en la configuración del ejabberd en module sección:

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

Sólo se extienden on_filter_packet/1 el camino usted quiere y devuelve el paquete modificado apropiadamente.

+0

Gracias gleber. Ya he llegado tan lejos y puedo ver desde el INFO_MSG que mi paquete_interceptor está siendo llamado. ¿Cómo se pueden enviar estos datos XML a php (a través de? Xml = ) y recuperar el XML resultante y luego pasarlo al destinatario? – Adil

+2

Probablemente deberías usar http: request/1,2,3 para llamar a tu script PHP. IIRC on_filter_packet se llamará en el mismo proceso que el proceso de enrutador de ejabberd, por lo que no debe hacer nada demasiado lento. Entonces, una solución es engendrar un nuevo proceso para esto, devolver un átomo de 'caída' (para soltar el paquete) y cuando la estrofa modificada es devuelta por PHP, envíela usando 'ejabberd_router: route (From, To, Packet)'. Probablemente on_filter_packet sea llamado nuevamente en el nuevo paquete que envió, así que asegúrese de detectarlo y no procesarlo dos veces. – gleber

+0

Para detectar el paquete puede agregar la etiqueta '' en un paquete con su propia 'xmlns'. – gleber

0

Parece que lo que quiere hacer allí es crear un componente de servidor XMPP. Muchas cosas ya se han dicho en esa publicación Which XMPP server to experiment developing a server component.

Puedo enlazar algunos enlaces útiles:

solución de Gleber es realmente "ejabberd" orientado (sin duda la más fácil en su caso), mientras que éste se puede ampliar con otros servidores XMPP.

+0

Thx para los enlaces. – Adil

+0

Está orientado a ejabberd ya que la pregunta es;) – gleber

0

No es la interfaz:

ejabberd_router:register_route(MyHost)

que he utilizado en el pasado y funciona bien. Una vez que el MyHost se haya registrado con ejabberd, el módulo recibirá las comunicaciones destinadas al MyHost a través de los mensajes info (suponiendo gen_server).

Según lo observado por @gleber, no olvide agregar su módulo al archivo de configuración.

+1

Hola jldupont. No entendí lo que register_route hace y lo que exatly es MyHost. ¿Puede indicarme dónde debo leer más? – Adil

+0

ejabberd_router: register_route/1 se usa para crear su propio (sub) dominio y para capturar todos los paquetes que se envían a JID en este (sub) dominio. Puede leer más aquí - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

El ejemplo de gleber es excelente. También escribí un ejemplo más complejo de manipulación de paquetes que construí para Chesspark llamado mod_sunshine.

¿Cómo puede enviar esta información XML a php (via? Xml =) y recuperar el XML resultante y luego pasarlo al destinatario?

Si usted tiene una versión reciente de ejabberd que utiliza exmpp, puede utilizar exmpp_xml: node_to_binary/1 o exmpp_xml: node_to_list/1 para conectar la representación interna del XML a un binario o una cadena, respectivamente.

Hubo funciones con nombres similares en el ejabberd anterior, pero dentro del módulo xml.

+0

Gracias metajack. He leído tu artículo antes. Me ayudó a comenzar – Adil

Cuestiones relacionadas