2009-12-21 28 views
13

Tôi đã bật Ejabberd và chạy với người dùng thử nghiệm và hoạt động tốt. Tôi muốn viết một module có thể đánh chặn các thông điệp và thay đổi chúng, như sau:Cách lọc thư trong Ejabberd

  1. đánh chặn "thông điệp"
  2. gửi chúng vào một tập tin php
  3. nhận được kết quả từ các tập tin php cùng (ngay lập tức)
  4. Sửa đổi các đoạn thơ tin nhắn và gửi nó xuống dây cho người nhận

các tài liệu ejabberd là yếu và hướng dẫn là không tồn tại. Bạn có thể cho tôi một số mã mẫu thực hiện điều này không. Sau đó tôi có thể tìm cách cấu hình nó cho các nhu cầu của mình.

Cảm ơn một gói!

Adil

Trả lời

14

Dưới đây là ví dụ cơ bản của mô-đun như vậy:

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

Và chắc chắn rằng để thêm module này vào cấu hình ejabberd của thành module phần:

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

Chỉ cần mở rộng on_filter_packet/1 đường bạn muốn và trả lại gói đã sửa đổi thích hợp.

+0

Cảm ơn gleber. Tôi đã đi xa này và tôi có thể nhìn thấy từ? INFO_MSG mà packet_interceptor của tôi đang được gọi. Làm cách nào để gửi dữ liệu XML này tới php (thông qua? Xml = ) và truy xuất XML kết quả và sau đó chuyển nó tới người nhận? – Adil

+2

Có lẽ bạn nên sử dụng http: request/1,2,3 để gọi tập lệnh PHP của mình. IIRC on_filter_packet sẽ được gọi trong cùng một quá trình như quá trình định tuyến ejabberd, vì vậy bạn không nên làm bất cứ điều gì quá tốn thời gian ở đó. Vì vậy, một giải pháp là để sinh ra một quy trình mới cho điều này, trả về một nguyên tử 'drop' (để thả gói tin) và khi stanza đã sửa đổi được trả về từ PHP, hãy gửi nó cùng với' ejabberd_router: route (From, To, Packet) '. Có lẽ on_filter_packet sẽ được gọi lại trên gói mới bạn đã gửi, vì vậy hãy đảm bảo phát hiện và không xử lý nó hai lần. – gleber

+0

Để phát hiện gói, bạn có thể thêm thẻ '' vào một gói với 'xmlns' của riêng bạn. – gleber

0

Có vẻ như những gì bạn muốn làm ở đó là tạo thành phần máy chủ XMPP. Rất nhiều điều đã được nói trên bài viết đó Which XMPP server to experiment developing a server component.

tôi có thể liên kết cho bạn một số liên kết hữu ích:

Giải pháp của Gleber thực sự là định hướng "ejabberd" (chắc chắn là giải pháp dễ nhất trong trường hợp của bạn), trong khi giải pháp này có thể mở rộng với các máy chủ XMPP khác.

+0

Thx cho các liên kết. – Adil

+0

Đó là định hướng ejabberd là câu hỏi;) – gleber

0

Có giao diện:

ejabberd_router:register_route(MyHost)

mà tôi đã sử dụng trong quá khứ và hoạt động tốt. Khi số MyHost được đăng ký với ejabberd, mô-đun sẽ nhận được thông báo liên lạc đến số MyHost thông qua info tin nhắn (giả sử gen_server).

Như đã lưu ý bởi @gleber, đừng quên thêm mô-đun của bạn vào tệp cấu hình.

+1

Xin chào jldupont. Tôi không hiểu những gì register_route làm và những gì exatly là MyHost. Bạn có thể chỉ cho tôi nơi tôi nên đọc thêm? – Adil

+0

ejabberd_router: register_route/1 được sử dụng để tạo tên miền (phụ) của riêng bạn và để nắm bắt tất cả các gói được gửi đến JID trong miền (phụ) này. Bạn có thể đọc thêm tại đây - http://www.process-one.net/en/wiki/ejabberd_route_table/ – gleber

1

Ví dụ của gleber là tuyệt vời. Tôi cũng đã viết một ví dụ phức tạp hơn về thao tác gói mà tôi đã xây dựng cho Chesspark được gọi là mod_sunshine.

Làm cách nào để gửi dữ liệu XML này tới php (thông qua? Xml =) và truy xuất XML kết quả rồi chuyển nó cho người nhận?

Nếu bạn có một phiên bản gần đây của ejabberd sử dụng exmpp, bạn có thể sử dụng exmpp_xml: node_to_binary/1 hoặc exmpp_xml: node_to_list/1 để biến các đại diện nội bộ của XML để một nhị phân hoặc một chuỗi tương ứng.

Có các hàm được đặt tên tương tự trong phiên bản cũ hơn, nhưng trong mô-đun xml.

+0

Cảm ơn metajack. Tôi đã đọc bài viết của bạn trước đó. Nó giúp tôi bắt đầu – Adil

Các vấn đề liên quan