Ejabberd でメッセージをフィルタリングする方法
質問
私は Ejabberd をテスト ユーザーで起動して実行していますが、正常に動作しています。次のように、メッセージをインターセプトして変更できるモジュールを作成したいと考えています。
- 「メッセージ」を傍受する
- それらをphpファイルに送信します
- 同じphpファイルから結果を取得します(即時)
- メッセージスタンザを変更して受信者に送信します。
ejabberd のドキュメントは弱く、チュートリアルも存在しません。これを行うサンプルコードを教えていただけますか。そうすれば、自分のニーズに合わせて構成する方法がわかります。
バンドルありがとう!
アディル
解決
ここでは、そのようなモジュールの基本的な例を以下に示します。
-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.
そしてmodule
セクションにejabberdの設定にこのモジュールを追加することを確認します:
{modules,
[...
...
...
{packet_interceptor, []}
]}.
ちょうどあなたが望むようにon_filter_packet/1
拡張し、適切に変更されたパケットを返します。
他のヒント
gleberの例は良好です。また、私は呼ばChessparkのために構築されたパケット操作の複雑な例を書きました mod_sunshineするます。
それぞれのバイナリまたは文字列にXMLの内部表現をオンにするnode_to_list / 1 :node_to_binary / 1またはexmpp_xml:あなたはexmppを使用していますejabberdの最近のバージョンをお持ちの場合は、どのように(=?XMLを介し)のphpに、このXMLデータを送信し、結果のXMLを取得し、受信者に渡すことができますか?
、あなたはexmpp_xmlを使用することができます。
同様にあり、古いejabberdの関数の名前が、XMLモジュール内であった。
そこでやりたいことは、XMPPサーバーコンポーネントを作成することのようです。その投稿ではすでに多くのことが述べられています サーバー コンポーネントの開発を実験する XMPP サーバー.
役立つリンクをいくつかリンクさせていただきます。
Python のエコーボット XMPP の第一人者による非常に素晴らしいブログ、metajack.im から。このボットはメッセージ スタンザをリッスンし、その一部に返信します。
Gleber のソリューションは実際には「ejabberd」指向です (確かに、あなたのケースでは最も簡単なソリューションです) が、このソリューションは他の XMPP サーバーに合わせて拡張できます。
インタフェースがあります:
ejabberd_router:register_route(MyHost)
私は過去に使用し、うまく機能しています。 MyHost
をejabberdに登録されると、モジュールはMyHost
メッセージ(info
を想定)を介しgen_server
することを意図した通信を受け取ることになります。
@gleberで述べたように、コンフィギュレーション・ファイルにあなたのモジュールを追加することを忘れないでください。