2009-12-21 15 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. 

और module अनुभाग में ejabberd के विन्यास में इस मॉड्यूल जोड़ना सुनिश्चित करें:

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

बस का विस्तार on_filter_packet/1 रास्ता आप उचित रूप से संशोधित पैकेट चाहते हैं और वापस कर सकते हैं।

+0

धन्यवाद gleber। मैं पहले से ही इसे चला चुका हूं और मैं देख सकता हूं? INFO_MSG कि मेरे पैकेट_इंटरसेप्टर को बुलाया जा रहा है। यह XML डेटा php (via? Xml = ) पर कैसे भेज सकता है और परिणामस्वरूप XML पुनर्प्राप्त कर सकता है और फिर उसे प्राप्तकर्ता को पास कर सकता है? – Adil

+2

आपको अपनी PHP स्क्रिप्ट को कॉल करने के लिए शायद http: request/1,2,3 का उपयोग करना चाहिए। आईआईआरसी on_filter_packet को उसी प्रक्रिया में बुलाया जाएगा जैसे कि इब्बर्बेड राउटर प्रक्रिया, इसलिए आपको वहां कुछ भी समय लेने वाला नहीं करना चाहिए। तो इसके लिए एक नई प्रक्रिया को हल करना एक समाधान है, 'ड्रॉप' परमाणु (पैकेट ड्रॉप करने के लिए) लौटाएं और जब संशोधित स्टांजा PHP से वापस आती है तो इसे 'ejabberd_router: मार्ग (से, टू, पैकेट)' के साथ भेज दें। शायद आपके द्वारा भेजे गए नए पैकेट पर on_filter_packet को फिर से बुलाया जाएगा, इसलिए इसे पहचानना सुनिश्चित करें और इसे दो बार संसाधित न करें। – gleber

+0

पैकेट का पता लगाने के लिए आप अपने 'xmlns' वाले पैकेट में' 'टैग जोड़ सकते हैं। – gleber

0

ऐसा लगता है कि आप जो करना चाहते हैं वह एक एक्सएमपीपी सर्वर घटक बनाना है। Which XMPP server to experiment developing a server component पर उस पोस्ट पर बहुत सी बातें पहले से ही कह दी गई हैं। एक XMPP गुरु से

  • Jabber Component Protocol

  • metajack.im से An Echo-Bot in Python, एक बहुत अच्छा ब्लॉग:

    मैं तुम्हें कुछ उपयोगी लिंक लिंक कर सकते हैं। यह बॉट किसी भी संदेश stanzas के लिए सुनो और उनमें से कुछ को जवाब।

Gleber के समाधान वास्तव में "ejabberd" उन्मुख (निश्चित रूप से अपने मामले में सबसे आसान एक), जबकि यह एक अन्य XMPP सर्वर के साथ पैमाने पर कर सकते हैं।

ejabberd_router:register_route(MyHost)

जो मैं अतीत में प्रयोग किया है और अच्छी तरह से काम करता है:

+0

Thx। – Adil

+0

यह प्रश्न के रूप में ejabberd- उन्मुख है;) – gleber

0

इंटरफेस है। एक बार MyHost ejabberd के साथ पंजीकृत हो जाने पर, मॉड्यूल MyHostinfo संदेशों (gen_server मानते हुए) के माध्यम से संचार प्राप्त करेगा।

जैसा कि @gleber द्वारा नोट किया गया है, कॉन्फ़िगरेशन फ़ाइल में अपना मॉड्यूल जोड़ने के लिए मत भूलना।

+1

हाय jldupont। मुझे समझ में नहीं आया कि register_route क्या करता है और MyHost क्या है। क्या आप मुझे बता सकते हैं कि मुझे और कहाँ पढ़ना चाहिए? – Adil

+0

ejabberd_router: register_route/1 का उपयोग अपने स्वयं के (उप) डोमेन बनाने और इस (उप) डोमेन में जेआईडी को भेजे गए सभी पैकेट को कैप्चर करने के लिए किया जाता है। आप यहां और अधिक पढ़ सकते हैं - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

गैलेबर का उदाहरण उत्कृष्ट है। मैंने पैकेट मैनिपुलेशन का एक और जटिल उदाहरण भी लिखा है जिसे मैंने चेसस्पर्क के लिए बनाया है जिसे mod_sunshine कहा जाता है।

यह XML डेटा php (via? Xml =) पर कैसे भेज सकता है और परिणामस्वरूप XML पुनर्प्राप्त कर सकता है और फिर उसे प्राप्तकर्ता को पास कर सकता है? क्रमश: एक द्विआधारी या एक स्ट्रिंग के लिए एक्सएमएल के आंतरिक प्रतिनिधित्व चालू करने के लिए node_to_list/1: node_to_binary/1 या exmpp_xml:

आप exmpp का उपयोग करता है ejabberd का नवीनतम संस्करण है, तो आप exmpp_xml उपयोग कर सकते हैं।

पुराने ejabberd में समान नामित फ़ंक्शंस थे, लेकिन एक्सएमएल मॉड्यूल के भीतर।

+0

धन्यवाद मेटाजैक। मैंने पहले आपके लेख को पढ़ा है। इससे मुझे शुरुआत करने में मदद मिली – Adil

संबंधित मुद्दे