Статьи

Глядя на XMPP и драгоценный камень XMPP4R

XMPP

Официальный логотип XMPP

XMPP — это «открытый протокол на основе XML для расширяемой системы обмена мгновенными сообщениями и информации о присутствии в реальном времени» — Википедия

Расширяемый протокол обмена сообщениями и присутствия (XMPP) — это открытая технология для связи в режиме реального времени, которая поддерживает широкий спектр приложений, включая обмен мгновенными сообщениями, присутствие, многопользовательский чат, голосовые и видеозвонки, совместную работу, облегченное промежуточное ПО, синдикацию контента, и обобщенная маршрутизация данных XML. xmpp.org

Протокол e X tenible Mssaging и P resence P , также известный как Jabber (протокол первоначально назывался Jabber и был разработан сообществом открытого исходного кода Jabber), представляет собой протокол для обмена сообщениями между двумя объектами. Эти сообщения передаются по сети в формате XML. Он используется Jabber, Google Talk, Google Wave, Pidgin, Kopete и всеми видами приложений для обмена мгновенными сообщениями с открытым исходным кодом.

Преимущества XMPP

Децентрализованные

Сеть XMPP по своей природе децентрализована. Там нет главного или центрального сервера. Любой может владеть или запускать XMPP-сервер.

Открытые стандарты

Инженерная рабочая группа по Интернету официально оформила XMPP в качестве утвержденной технологии мгновенного обмена сообщениями и присутствия под названием XMPP (последние спецификации RFC 6120 и RFC 6121). Для реализации поддержки этих спецификаций лицензионные платежи не требуются, и их разработка не привязана к одному поставщику.

Стабильный и безопасный

XMPP действует с 1999 года, и с тех пор многие приложения используют этот протокол. Поскольку серверы XMPP могут быть изолированы или размещены в частной сети за защищенными брандмауэрами, это очень безопасно.

гибкий

Одним из главных преимуществ этого протокола является его гибкость. Пользовательский функционал может быть легко построен поверх XMPP. Гибкая природа протокола делает его идеальным выбором для написания IM-ботов, клиентов чата и т. Д., Поскольку он автоматически работает со всеми службами IM, которые предлагает XMPP.

XMPP4R — клиентская библиотека Ruby для XMPP

XMPP4R — это оболочка Ruby поверх стандартного XML, которую использует XMPP / Jabber / Ejabberd, что позволяет нам работать с Ruby, а не генерировать XML.

Установка

gem install xmpp4r or sudo gem install xmpp4r 

XMPP-сервер

Ejabberd — это сервер Jabber / XMPP, созданный с использованием Erlang и с открытым исходным кодом. Еще одна популярная альтернатива Ejabberd — Openfire. Инструкции по установке ejabbered можно найти здесь . В этом примере мы не будем использовать XMPP-сервер, такой как ejabbered или Openfire, вместо этого выберем учетную запись Google, что легко и удобно.

XMPP Bot

Создание бота — это идеальный способ представить протокол XMPP и Ruby Wrapper для XMPP — XMPP4R. Таким образом, я буду создавать бота, который будет отвечать на наши сообщения и отвечать пользовательскими сообщениями или результатами.

Установить Gems / библиотеки, необходимые

 gem install xmpp4r 

Подключение к серверу Jabber

 require 'xmpp4r' require 'xmpp4r/client' include Jabber class Bot attr_reader :client def initialize jabber_id @jabber_id = jabber_id @jabber_password = ENV['jabber_password'] end def connect jid = JID.new(@jabber_id) @client = Client.new jid @client.connect @client.auth @jabber_password @client.send(Presence.new.set_type(:available)) puts "Hurray...!! Connected..!!" end end Bot.new('[email protected]').connect 

Приведенный выше код иллюстрирует, как подключиться к нашему серверу Jabber или, в нашем случае, к серверам Google.
Идентификатор Jabber предоставляется при создании экземпляра нового Bot а пароль извлекается из переменной среды. Метод connect создает новый объект клиента Jabber, подключается к серверу и аутентифицируется с использованием указанного пароля. Также присутствие установлено на «доступно». Другие параметры, которые могут быть переданы :busy , :invisible .

Отправка и получение сообщений

Отправка сообщения так же проста:

 message = Message.new("[email protected]", "Hello... Manu?") message.type=:chat @client.send(message) 

Метод add_method_callback может использоваться для получения и обработки сообщений, которые получает наш бот.

 @client.add_message_callback do |message| unless message.body.nil? && message.type != :error puts "Received message: #{message.body}" #Echo the received message back to the sender. reply = Message.new(message.from, message.body) reply.type = message.type @client.send(reply) end end 

Принятие новых приглашений

 def roster @roster ||= Roster::Helper.new(@client) end def process_invite roster.add_subscription_request_callback do |_, presence| inviter = JID::new(presence.from) roster.accept_subscription(inviter) invite(JID::new(inviter)) end end 

Roster — это список контактов нашего бота. Всякий раз, когда новый пользователь добавляет нашего бота и отправляет приглашение, roster_add_subscription_request_callback , который автоматически принимает новое приглашение.

Научите нашего бота некоторым командам

Построив простой и базовый бот с использованием XMPP, мы теперь попытаемся обработать сообщения, полученные нашим ботом, и немного поиграться.

Как насчет того, чтобы задать нашему боту несколько вопросов или команд и посмотреть, отвечает ли он на наше сообщение пользовательскими или обработанными ответами? Сообщение, полученное внешним чат-ботом, может быть обработано так, что оно ответит на некоторые конкретные команды. Например, наш бот обработает «Help», чтобы вернуть все команды, которые знает наш бот, или «Time», чтобы ответить с текущим временем.

 @client.add_message_callback do |message| unless message.body.nil? && message.type != :error reply = case message.body when "Time" then reply(message, "Current time is #{Time.now}") when "Help" then reply(message, "Available commands are: 'Time', 'Help', 'Latest sitepoint articles.") when "Latest sitepoint articles" then latest_sitepoint_articles(message) else reply(message, "You said: #{message.body}") end end end def reply message, reply_content reply_message = Message.new(message.from, reply_content) reply_message.type = message.type @client.send reply_message end def latest_sitepoint_articles message feeds = SitepointFeedParser.get_feeds feeds.items.each do |item| reply(message, item.link) end end class SitepointFeedParser URL = 'http://www.sitepoint.com/feed/' class << self def get_feeds open(URL) do |rss| @feeds = RSS::Parser.parse(rss) end @feeds end end end 

Когда пользователь отправляет «Последние статьи о sitepoint», наш бот анализирует каналы с sitepoint.com и возвращает ссылки на последние статьи. Модуль RSS используется для анализа каналов, которые повторяются, и каждая ссылка отправляется обратно пользователю.

Демонизировать бот

 require 'rubygems' require 'daemons' Daemons.run('bot.rb', { app_name: 'myIMBot', monitor: true, log_output: false } ) 

Используя гем демонов , мы запускаем нашего бота как демона. Это также дает нам возможность запускать, перезапускать и останавливать демон с ruby im.rb start ruby im.rb restart ruby im.rb stop соответственно. Мы можем получить текущий статус демона, используя ruby im.rb status .

Кроме того, monit предоставляет нам возможности для мониторинга демона. Выходные данные демона могут быть зарегистрированы, если log_output установлен в true.

Собираем все вместе

 require 'xmpp4r' require 'xmpp4r/client' require 'xmpp4r/roster' require 'rss' require 'open-uri' include Jabber class Bot attr_reader :client def initialize jabber_id @jabber_id = jabber_id @jabber_password = ENV['jabber_password'] end def connect jid = JID.new(@jabber_id) @client = Client.new jid @client.connect @client.auth @jabber_password @client.send(Presence.new.set_type(:available)) puts "Hurray...!! Connected..!!" on_message end private def on_message mainthread = Thread.current @client.add_message_callback do |message| unless message.body.nil? && message.type != :error reply = case message.body when "Time" then reply(message, "Current time is #{Time.now}") when "Help" then reply(message, "Available commands are: 'Time', 'Help'.") when "Latest sitepoint articles" then latest_sitepoint_articles(message) else reply(message, "You said: #{message.body}") end end end Thread.stop @client.close end def reply message, reply_content reply_message = Message.new(message.from, reply_content) reply_message.type = message.type @client.send reply_message end def latest_sitepoint_articles message feeds = SitepointFeedParser.get_feeds feeds.items.each do |item| reply(message, item.link) end end end class SitepointFeedParser URL = 'http://www.sitepoint.com/feed/' class << self def get_feeds open(URL) do |rss| @feeds = RSS::Parser.parse(rss) end @feeds end end end @bot = Bot.new '[email protected]' @bot.connect 

Код можно найти здесь .

Вывод

Если вы еще не попробовали XMPP или XMPP4R, я бы порекомендовал вам попробовать. В XMPP4R есть много других опций, которые не описаны в этом руководстве. Пожалуйста, проверьте официальный сайт для более подробной информации.

PS: я один из текущих сопровождающих xmpp4r, если у вас есть какие-либо вопросы, просто напишите мне. Кроме того, если вы обнаружите какие-либо ошибки / проблемы, пожалуйста, сообщите о них . Заранее спасибо.