2009-12-21 5 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, что вызывается мой пакет_перехватчик. Как отправить эти XML-данные в php (через? Xml = ) и получить полученный XML-файл, а затем передать его получателю? – Adil

+2

Вероятно, вы должны использовать http: request/1,2,3 для вызова своего PHP-скрипта. IIRC on_filter_packet будет вызываться в том же процессе, что и процесс маршрутизатора ejabberd, поэтому вы не должны делать там слишком много времени. Таким образом, решение состоит в том, чтобы создать новый процесс для этого, вернуть атом «drop» (удалить пакет), а когда измененная строфа возвращается с PHP, отправьте ее с использованием 'ejabberd_router: route (From, To, Packet)'. Вероятно, on_filter_packet будет вызываться снова в новом пакете, который вы отправили, поэтому обязательно его обнаружите и не обработайте дважды. – gleber

+0

Чтобы обнаружить пакет, вы можете добавить тег '' в пакет с вашим собственным 'xmlns'. – gleber

0

Похоже, что вы хотите создать серверный компонент XMPP. На этом посту уже было сказано много вещей Which XMPP server to experiment developing a server component.

Я могу связать вам некоторые полезные ссылки:

  • Jabber Component Protocol

  • An Echo-Bot in Python от metajack.im, очень хороший блог из XMPP гуру. Этот бот слушает любые строфы сообщений и отвечает на некоторые из них.

решение Gleber является действительно «ejabberd» ориентированный (конечно, самый простой один в вашем случае), в то время как это можно масштабировать с другими серверами XMPP.

+0

Thx для ссылок. – Adil

+0

Это вопрос, связанный с ejabberd, поскольку вопрос: – gleber

0

Существует интерфейс:

ejabberd_router:register_route(MyHost)

, которые я использовал в прошлом, и работает хорошо. Как только MyHost зарегистрирован в ejabberd, модуль получит сообщения, предназначенные для сообщений MyHost через info (при условии, что gen_server).

Как отмечено @gleber, не забудьте добавить свой модуль в файл конфигурации.

+1

Hi jldupont. Я не совсем понял, что делает register_route, и что exatly MyHost. Можете ли вы указать мне, где я должен читать дальше? – Adil

+0

ejabberd_router: register_route/1 используется для создания собственного (дополнительного) домена и для захвата всех пакетов, отправленных в JID в этом (под) домене. Вы можете прочитать больше здесь - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

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

Смежные вопросы