Статьи

Создание Slackbot с Рубином и Синатрой

slackbot

Эта статья была рецензирована Томом Паркином . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Вялость, кажется, повсюду в эти дни. Он наслаждается тем успехом и принятием, о которых другие службы могут только мечтать. Одной из причин его успеха является то, как легко интегрировать Slack с другими сервисами. Существует множество встроенных функций интеграции, веб-хуков и других методов интеграции, которые делают использование Slack с вашим любимым сервисом легким.

Еще один способ, которым Slack предлагает расширяемость — это Slackbots. Slackbots — это элементы, которые можно настроить для запуска на основе ключевого слова, введенного в Slack.

Сегодня мы увидим, как создать собственный Slackbot, который запускает ключевое слово, выполняет какое-то действие и отвечает на Slack. Мы собираемся построить его, используя Ruby и веб-фреймворк Sinatra . В этом руководстве нет базы данных, но вы можете расширить ее и добавить, если хотите. Это базовое руководство, которое дает вам представление о создании расширения Slack. Здесь мы делаем кирпич, из которого вы можете строить другие вещи.

Давайте начнем.

Наш бот, назовем его giubot , предоставит набор команд для получения информации от GitHub. Мы сделаем триггерное слово как giubot: так будет пример,

 Message:- giubot: issues _ twbs/bootstrap Response:- There are currently 433 open issues on twbs/bootstrap. 

Мы собираемся использовать официальный API GitHub. Документация по API доступна здесь .

Давайте сначала настроим файлы проекта.

Настройка проекта

Создайте папку для проекта и создайте следующие файлы примерно так:

 giubot | |---- app.rb |---- Gemfile 

Вот и все. Это простое приложение, в котором весь функционал находится внутри app.rb. Gemfile — это место, где мы будем указывать зависимости для нашего проекта. Давайте также добавим зависимости gem перед инициализацией и фиксацией изменений в git. Добавьте следующее в Gemfile :

 source 'https://rubygems.org' gem 'sinatra' gem 'httparty' 

и беги

 bundle install 

Новый файл Gemfile.lock создается внутри каталога проекта. Что касается наших зависимостей, все, что нам нужно, это два драгоценных камня: Синатра и httparty . httpparty — это гем, который позволяет легко обрабатывать HTTP-запросы.

Как только вы создали файлы, пришло время зафиксировать изменения в git. Все шаги в этом уроке относительно git не обязательны, но приветствуются. Git также требуется, если вы хотите разместить приложение на Heroku. Давайте инициализируем наш репозиторий и зафиксируем все изменения. Введите следующие команды из каталога проекта:

 git init git add -A git commit -m "Add project files and gem dependencies" 

Пока мы занимаемся этим, давайте также перенесем наш репозиторий в GitHub. Это бесплатно для публичных репозиториев, но платное для частных. Давайте быстро создадим наш репозиторий по этой ссылке . После создания хранилища Github предоставит URL-адрес, который можно найти на странице хранилища. Скопируйте этот URL и добавьте его как удаленный:

 git add remote origin https://github.com/avinoth/giubot.git 

Мы добавляем удаленный URL и называем его как origin. Как только это будет сделано, внесите изменения в GitHub:

 git push origin master 

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

Создать конечную точку API

Вот как будет работать связь между Slack и нашим веб-приложением: всякий раз, когда в giubot: упоминается слово giubot: Slack отправит сведения о сообщении вместе с парой деталей об учетной записи Slack на URL, указанный при расширение настроено (Подробнее об этом позже). Метод запроса — это POST с данными в теле.

Мы получим полное сообщение, получив имя репозитория и команду, запрошенную в сообщении, а затем ответим необходимыми данными. Для целей этого приложения все, что нам нужно, — это одна конечная точка API, которую Slack будет вызывать, если упомянуто слово триггера, генерируя ответ, который мы хотим отправить обратно в Slack. Давайте добавим следующие строки в наш файл app.rb :

 require 'sinatra' require 'httparty'` require 'json' post '/gateway' do message = params[:text].gsub(params[:trigger_word], '').strip action, repo = message.split('_').map {|c| c.strip.downcase } repo_url = "https://api.github.com/repos/#{repo}" case action when 'issues' resp = HTTParty.get(repo_url) resp = JSON.parse resp.body respond_message "There are #{resp['open_issues_count']} open issues on #{repo}" end end def respond_message message content_type :json {:text => message}.to_json end 

Посмотрим, что здесь происходит. Нам нужны только три модуля, которые нам нужны для приложения. Существует средство обработки запросов POST /gateway , которое будет обслуживать все запросы от Slack. Затем получите сообщение, убрав слово триггера. Как вы можете видеть, мы делаем слово триггера независимым от приложения и используем слово, которое идет вместе с запросом, поэтому будут работать не только giubot но и любые ключевые слова.

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

Есть оператор case который выполняет необходимые действия на основе входящей команды. В настоящее время он поддерживает только команду issues , которая выбирает текущий счетчик открытых проблем в репозитории. Написание другой команды — это всего лишь инструкция case , так что это хорошо. Внутри оператора case сделайте API-вызов GitHub, который возвращает количество открытых проблем, и мы можем построить ответ для отправки обратно в Slack.

Также, если вы заметили, что мы не проверяем токен из Slack и просто полностью игнорируем параметр. Это не рекомендуется, но поскольку это зависит от аккаунта, мы оставляем его открытым. Если вы хотите, вы можете проверить токен, указав это в первой строке действия обработчика:

 return if params[:token] != ENV['SLACK_TOKEN'] 

Вот и все. Функциональность нашего приложения завершена, пришло время зафиксировать и внести изменения:

 git add -A git commit -m "Add app logic" git push origin master 

Развертывание приложения

Нам нужно будет развернуть приложение, чтобы настроить его в Slack и начать его использовать. Давайте развернем его в Heroku [https://heroku.com], который является поставщиком PaaS для размещения веб-приложений. Создайте файл config.ru внутри директории проекта и добавьте в него следующие строки:

 require './app' run Sinatra::Application 

Heroku требует этот файл для распознавания и запуска приложения. Добавьте файл в git и передайте его:

 git add config.ru git commit -m "Add config.ru" 

Установите гем Heroku в вашей локальной системе, если вы еще этого не сделали:

 gem install heroku 

и введите следующие команды из каталога проекта:

 heroku create <APP-NAME> heroku deploy 

<APP_NAME> может быть любым, или вы можете оставить его, и Heroku назначит имя приложению. Войдите с учетными данными Heroku, когда он их попросит. Heroku распознает, что это приложение Rack, из файла конфигурации, который мы создали, и создаст код. Теперь мы развернули наше приложение в Heroku.

Настройка Slack

Мы все настроены со стороны приложения, давайте настроим Slack с помощью URL только что созданного приложения. Перейдите по URL-адресу Outgoing Webhook на веб-сайте Slack и нажмите « Add Outgoing Webhooks Integration . На странице «Добавить новую страницу» укажите всю необходимую информацию, включая имя приложения и слово триггера. В поле URL добавьте следующий URL:

 http://<APP-NAME>.herokuapp.com/gateway 

где <APP-NAME> — это имя Heroku для вашего развернутого приложения. Сохраните интеграцию.

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

slackbot

Обратите внимание, что сообщение является обычным сообщением, поэтому оно видно всем на канале, как и ответ.

Вывод

Таким образом, теперь у вас есть вкус написать Slackbot на Ruby. Я надеюсь, что это заставит вас задуматься о других Slackbots и extensiosn. Код, используемый в этом руководстве, размещен на GitHub . Не стесняйтесь, чтобы раскошелиться. Если вы создали собственное расширение Slack, сообщите мне об этом в комментариях ниже.