2009-12-21 8 views
13

Ich habe Ejabberd mit Testbenutzern und läuft, und es funktioniert gut. Ich möchte ein Modul schreiben, die Nachrichten abfangen und ändern Sie sie wie folgt:So filtern Sie Nachrichten in Ejabberd

  1. abfangen „Botschaften“
  2. sie in eine PHP-Datei senden
  3. bekommen das Ergebnis aus der gleichen PHP-Datei (sofort)
  4. die Nachricht Strophe ändern und es auf den Draht zu dem

die ejabberd Dokumentation ist schwach und Tutorials sind nicht existent Empfänger senden. Können Sie mir einen Beispielcode geben, der das tut? Ich kann dann herausfinden, wie ich es für meine Bedürfnisse konfigurieren kann.

Danke ein Bündel!

Adil

Antwort

14

Hier ist das Grund Beispiel für ein solches Modul:

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

Und stellen Sie sicher, dass dieses Modul in ejabberd Konfiguration in module Abschnitt hinzuzufügen:

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

Nur on_filter_packet/1 verlängern die Art und Weise Sie möchten und ändern entsprechend geändertes Paket.

+0

Danke gleber. Ich bin schon so weit gegangen und ich kann von der INFO_MSG sehen, dass mein packet_interceptor aufgerufen wird. Wie kann diese XML-Daten an PHP senden (über? Xml = ) und abrufen Sie die resultierende XML und dann an den Empfänger übergeben? – Adil

+2

Sie sollten wahrscheinlich ein http: request/1,2,3 verwenden, um Ihr PHP-Skript aufzurufen. IIRC on_filter_packet wird im selben Prozess wie der Routerprozess von ejabberd aufgerufen, also sollten Sie dort nichts zu zeitaufwendig machen. Eine Lösung besteht darin, einen neuen Prozess zu erzeugen, ein "Drop" -Atom zurückzugeben (um das Paket zu löschen), und wenn die modifizierte Zeilengruppe von PHP zurückgegeben wird, sendet sie es mit "ejabberd_router: route (From, To, Packet)". Wahrscheinlich wird on_filter_packet für das neue Paket, das Sie gesendet haben, erneut aufgerufen. Achten Sie also darauf, es zu erkennen und nicht zweimal zu verarbeiten. – gleber

+0

Um das Paket zu erkennen, können Sie '' in ein Paket mit Ihren eigenen' xmlns' einfügen. – gleber

0

Es scheint, dass Sie eine XMPP-Server-Komponente erstellen möchten. Viele Dinge wurden bereits auf diesem Post Which XMPP server to experiment developing a server component gesagt.

Ich kann Ihnen einige nützliche Links Verlinken:

Gleber Lösung ist wirklich „ejabberd“ orientiert (sicherlich das einfachste in Ihrem Fall), während diese mit anderen XMPP-Servern skaliert werden kann.

+0

Thx für die Links. – Adil

+0

Es ist ejabberd-orientiert wie die Frage ist;) – gleber

0

Es ist die Schnittstelle:

ejabberd_router:register_route(MyHost)

, die ich in der Vergangenheit verwendet haben und gut funktioniert. Sobald die MyHost bei ejabberd registriert ist, empfängt das Modul die Nachrichten, die für MyHost bis info Nachrichten bestimmt sind (unter der Annahme gen_server).

Wie von @gleber bemerkt, vergessen Sie nicht, Ihr Modul zur Konfigurationsdatei hinzuzufügen.

+1

Hi jldupont. Ich habe nicht ganz verstanden, was Register_route tut und was genau MyHost ist. Kannst du mich darauf hinweisen, wo ich weiterlesen soll? – Adil

+0

ejabberd_router: register_route/1 wird verwendet, um Ihre eigene (Sub-) Domain zu erstellen und alle Pakete zu erfassen, die an JID in dieser (Sub-) Domain gesendet werden. Sie können mehr hier lesen - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

glebers Beispiel ist ausgezeichnet. Ich schrieb auch ein komplexeres Beispiel für Paketmanipulation, das ich für Chesspark namens mod_sunshine erstellt habe.

Wie kann ich diese XML-Daten an php (via? Xml =) senden und das resultierende XML abrufen und es dann an den Empfänger übergeben? node_to_binary/1 oder exmpp_xml: node_to_list/1, um die interne Darstellung des XML in einem binären oder eine Zeichenfolge bzw.

Wenn Sie eine aktuelle Version von ejabberd haben, die exmpp verwendet, können Sie exmpp_xml verwenden.

Es gab ähnlich benannte Funktionen im älteren Ejabberd, aber innerhalb des XML-Moduls.

+0

Danke metajack. Ich habe Ihren Artikel früher gelesen. Es hat mir geholfen, einen Anfang zu machen – Adil

Verwandte Themen