この記事では、XMPPプロトコル(Jabber)を使用してRailsアプリケーションからメッセージを受信する方法、およびその逆、XMPPを介してコマンドを送信してアプリケーションを管理する方法について説明します。
理論のビット
以前はJabberとして知られていたXMPP (Extensible Messaging and Presence Protocol)は、ほぼリアルタイムモードでインスタントメッセージングを行うためのXMLベースのオープンで無料のプロトコルです。 もともと簡単に拡張できるように設計されたプロトコルは、テキストメッセージの送信に加えて、ネットワークを介した音声、ビデオ、およびファイルの転送をサポートします。
AIM、ICQ、WLM、Yahooなどの商用インスタントメッセージングシステムとは異なり、XMPPは分散型で拡張可能なオープンシステムです。 誰でもインスタントメッセージングサーバーを開き、ユーザーを登録して、他のXMPPサーバーと対話できます。 XMPPプロトコルに基づいて、多くのプライベートおよび企業のXMPPサーバーがすでに開いています。 その中には、Facebook、Google Talk、Yandex、VKontakte、LiveJournalなどの非常に大きなプロジェクトがあります。
ジャバーアカウントをまだお持ちでない場合(以前の方法でXMPPをジャバーと呼びます)、 Jabber.ruですばやく取得するか、 Googleトークを使用できます 。 ジャバーのクライアントには問題はありません 。たとえば、 ミランダやQIPなど、ほとんどすべての「古い」ものは問題ありません 。
これは何のためですか?
私はメッセージ送信を使用しています:
-壊れたリンクを検索します。 私のサイトのユーザーが404ページにアクセスすると、このページのアドレスとこの遷移元のページのアドレスを含むメッセージが表示されます。
-商品の注文、支払いなどに関する即時情報
-応答を必要としないユーザーからメッセージを受信するため。 たとえば、「ウィッシュフォーム」に入力する場合。
Railsアプリケーションにコマンドを渡します。
-アプリケーションを再起動します。 これは、sshを介してサーバーを登り、長いコマンドでレールをリロードするよりもはるかに高速です。
-データベースの行を追加/削除します。 データベースを操作するための本格的なインターフェースを書くのが面倒でした。いくつかのレコードを追加/削除する必要はほとんどありません。
さて、これらのタスクや大胆なタスクにはRails + XMPPバンドルを使用できます。 たとえば、ファイルやその他のコンテンツをサーバーにアップロードしたり、ユーザーとチャットしたりなど。
何が必要ですか?
XMPP4R gemが必要です 。 インストール:
gemインストールxmpp4r
gemがウィンドウの下で非常に不安定に動作することがすぐにわかるので、Linuxで操作する方が良いでしょう。
次に、Railsアプリケーションのjabberアカウント、つまり メッセージを送信し、コマンドを受信するアドレス。 アカウントを登録します。
メッセージを送信する
ロボットの接続と認証(通信を担当するRailsアプリケーションの一部を呼び出します)。
require "xmpp4r" robot = Jabber::Client::new(Jabber::JID::new("robot@xmpp.ru")) robot.connect robot.auth("password")
robot@xmpp.ruはアプリケーションに登録したjabberアカウントのアドレスであり、 passwordはそのパスワードです。 メッセージを送信します。
message = Jabber::Message::new("you@xmpp.ru", ", !") message.set_type(:chat) robot.send message
you@xmpp.ruはジャバーアドレスです。 以上です。 トレイから既にメッセージが表示されています。
フィードバック
ここで最も興味深い部分は、ロボットにコマンドを送信することです(jabberクライアントを介して)。 これを行うには、まずロボットを接続し、ロボットの存在と通信意思を宣言させます。 つまり ロボットはオンラインになり、jabberクライアントの緑色のライトが点灯します。
robot = Jabber::Client::new(Jabber::JID::new("robot@xmpp.ru")) robot.connect robot.auth("password") robot.send(Jabber::Presence.new.set_show(nil))
次に、受信メッセージの待機サイクルを有効にします。 同時に、メッセージが正しいアドレスから送信されていることを確認します。 一部の侵入者はロボットを指揮しようとしていません。
robot.add_message_callback do |message| # if message.from.to_s.scan("you@xmpp.ru").count > 0 # case message.body # when "hello" message = Jabber::Message::new("you@xmpp.ru", " !") message.set_type(:chat) robot.send message when "restart" File.open(Rails.root.to_s + "/tmp/restart.txt", "a+") end else # message = Jabber::Message::new("you@xmpp.ru", " !") message.set_type(:chat) robot.send message end end
「hello」というメッセージを受け取った後、ロボットは挨拶をし 、 「restart」を受け取ると、Railsアプリケーションを再起動します(Passengerを介して動作する場合)。
最終クラス
前の例では、ロボットがアプリケーションを再起動するコマンドを受け取って...死にました。 適切なスクリプトを実行して、再び復活させる必要があります。 もちろん、アプリケーションを再起動した後に毎回これを実行するのは望ましくありません。 したがって、アプリケーションでロボットを起動することをお勧めします。 XMPPでの作業を簡素化するクラスを含むデーモンを作成しました。また、再起動に関係なくロボットを動作させることができます。
このクラスを別のrubyファイル(たとえば、 「xmpp_daemon.rb」 )に配置し、 「config / initializers」フォルダーに配置して、レールとともに実行できるようにします。
#coding: utf-8 require "xmpp4r" class Xmpp # @@my_xmpp_address = "you@xmpp.ru" # - @@robot_xmpp_address = "robot@xmpp.ru" #- @@robot_xmpp_password = "password" # - @@site_name = "sitename.ru" # , # xmpp- def self.connect @@robot = Jabber::Client::new(Jabber::JID::new(@@robot_xmpp_address)) @@robot.connect @@robot.auth(@@robot_xmpp_password) end # def self.message(text) self.connect message = Jabber::Message::new(@@my_xmpp_address, "[#{@@site_name}]\n#{text}") message.set_type(:chat) @@robot.send message end # def self.listen self.connect @@robot.send(Jabber::Presence.new.set_show(nil)) @@robot.add_message_callback do |message| # if message.from.to_s.scan(@@my_xmpp_address).count > 0 # case message.body # when "hello" Xmpp.message " !" when "restart" Xmpp.message "..." File.open(Rails.root.to_s + "/tmp/restart.txt", "a+") end else # Xmpp.message " !" end end end end Xmpp.listen
これで、どのRailsアプリケーションコントローラーからでも、簡単にメッセージを送信できます。
Xmpp.message ", !"
ご静聴ありがとうございました。これが誰かに役立つことを願っています。
マネージャー -Zakgo - Enspe