2009-12-21 3 views
13

테스트 사용자와 함께 Ejabberd를 설치하여 작동합니다.Ejabberd에서 메시지를 필터링하는 방법

  1. 차단 "메시지"
  2. 가 같은 PHP 파일에서 결과를 얻을 PHP 파일
  3. 로 보내 (즉시) : 다음과 같이 내가 그들에게 메시지를 가로 채고 수정할 수있는 모듈을 작성하려면
  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

감사합니다. 나는 이미 이것까지 갔고 INFO_MSG에서 packet_interceptor가 호출되고 있음을 알 수있다. 어떻게이 XML 데이터를 PHP (? xml = 을 통해) 으로 보내고 결과 XML을 검색 한 다음 수령인에게 전달할 수 있습니까? – Adil

+2

PHP 스크립트를 호출하려면 http : request/1,2,3을 사용해야합니다. IIRC on_filter_packet은 ejabberd의 라우터 프로세스와 동일한 프로세스에서 호출되므로 너무 많은 시간을 소비하지 않아야합니다. 그래서 해결책은 이것을위한 새로운 프로세스를 생성하고,'drop' atom을 리턴하고 (패킷을 버리기 위해), 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.

내가 당신에게 몇 가지 유용한 링크를 연결할 수 있습니다 metajack.im에서

  • Jabber Component Protocol

  • An Echo-Bot in Python, 아주 좋은 블로그를 XMPP 전문가에서. 이 봇은 모든 메시지 스탠자를 수신하고 그 중 일부에 응답합니다. 이 하나가 다른 XMPP 서버로 확장 할 수있는 반면

Gleber의 솔루션은 정말 지향 "ejabberd"(귀하의 경우 확실히 쉬운 일)입니다. 내가 과거에 사용하고있다

ejabberd_router:register_route(MyHost)

잘 작동 :

+0

링크의 Thx입니다. – Adil

+0

질문은 ejabberd 지향적입니다.) – gleber

0

인터페이스가있다. MyHost이 ejabberd에 등록되면 모듈은 MyHost에서 info 메시지까지의 통신을 수신합니다 (gen_server라고 가정).

@gleber에서 언급했듯이 모듈을 구성 파일에 추가하는 것을 잊지 마십시오.

+1

안녕하세요. register_route가 수행하는 작업과 MyHost가 무엇인지 이해하지 못했습니다. 내가 더 이상 읽어야 할 곳을 가르쳐 주시겠습니까? – Adil

+0

ejabberd_router : register_route/1은 사용자 자신의 (하위) 도메인을 만들고이 (하위) 도메인의 JID로 전송되는 모든 패킷을 캡처하는 데 사용됩니다. 당신은 더 많은 것을 읽을 수 있습니다 - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

딱지 좋은 예입니다. 또한 Chesspark를 위해 만든 패킷 조작의 더 복잡한 예를 mod_sunshine이라고 썼습니다.

어떻게이 XML 데이터를 php (? xml =)를 통해 전송하고 결과 XML을 검색 한 다음 수신자에게 전달할 수 있습니까? 각각 바이너리 또는 문자열로 XML의 내부 표현을 설정하는 node_to_list/1/1 node_to_binary 또는 exmpp_xml : 당신이 exmpp를 사용 ejabberd의 최신 버전이있는 경우

, 당신은 exmpp_xml 사용할 수 있습니다.

이전 ejabberd에서도 xml 모듈 내에서 비슷한 이름의 함수가있었습니다.

+0

감사합니다 metajack. 이전에 기사를 읽었습니다. 그것은 내가 시작하는 것을 도왔다. – Adil

관련 문제