Статьи

Создание анонимного слабого бота с использованием Ruby и Sinatra

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

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

Сегодня мы рассмотрим, как создать одного из этих забавных слабаков в Ruby. Этот бот «может быть» полезен для вас, но основная цель этой статьи — познакомить вас с входящими API Slack для webhook и slash. Без дальнейших церемоний, давайте начнем.

Наш бот, назовем его anonbot, позволяет людям публиковать анонимные сообщения в Slack. Мы реализуем это с помощью API команды слэша Slack и входящего API webhook. Мы используем команды косой черты, потому что эти сообщения являются частными и показываются только получателю даже внутри канала. Затем, используя входящий веб-крючок, мы опубликуем контент, который был отправлен нам с помощью команды косой черты, на соответствующий канал, с которого он был отправлен.

Как уже отмечалось, мы собираемся построить это в Ruby и Sinatra. Это простое приложение, которое может быть построено на простом Ruby, но мы используем Sinatra, чтобы еще больше упростить его. Sinatra — это облегченный веб-фреймворк для Ruby, который очень полезен для создания простых веб-приложений, подобных нашему.

Начнем с создания необходимых файлов для нашего приложения, которых всего два. Начните с создания папки для нашего проекта и создайте в ней два упомянутых ниже файла:

app.rb используется логика, а в Gemfile указываются реквизиты для Gemfile . config.ru требуется для хостинга в Heroku , но это не обязательно для функциональности приложения.

Добавьте строки ниже в наш Gemfile, и мы готовы внести проект в git.

1
2
3
4
source «https://rubygems.org»
 
   gem «sinatra»
   gem «httparty»

Драгоценный камень sinatra предназначен для фреймворка, и нам нужно, чтобы httparty отправил анонимное сообщение на входящий веб-крючок Slack. После добавления гемов запустите bundle install из каталога проекта.

Новый файл Gemfile.lock будет создан сейчас. Хорошо — давайте инициализируем наш проект в git и зафиксируем изменения.

Давай перейдем к делу. У нас будет только одна конечная точка API, которую Slack вызывает при вызове нашей команды slash. Откройте app.rb и добавьте к нему строки ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
require ‘sinatra’
   require ‘httparty’
   require ‘json’
 
   get ‘/anonymize’ do
     postback params[:text], params[:channel_id]
     status 200
   end
 
   def postback message, channel
       slack_webhook = ENV[‘SLACK_WEBHOOK_URL’]
       HTTParty.post slack_webhook, body: {«text» => message.to_s, «username» => «John Doe», «channel» => params[:channel_id]}.to_json, headers: {‘content-type’ => ‘application/json’}
   end

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

Вместе с сообщением мы получим список параметров, но нас интересуют только два параметра:

  • text : сообщение, которое было введено после команды косой черты
  • channel_id : канал, с которого пользователь вызвал команду; нам нужно, чтобы опубликовать его обратно на этот канал

Метод postback отправку сообщения с использованием URL-адреса webhook в Slack. Мы указываем текст и переписываем имя пользователя и канал, которые будут установлены при настройке webhook. В команде slash появилась новая опция, которая представляет собой быстрый и простой способ сделать это всего за две строки — мы увидим это позже.

Делая это, мы все сделали с функциональностью приложения. Добавьте следующие строки на config.ru перед тем, как вносить изменения и развертывать наше приложение.

1
2
require ‘./app’
   run Sinatra::Application

Этот файл необходим Heroku для распознавания типа приложения и начала обслуживания запросов. Давайте передадим изменения:

Если у вас нет инструмента Heroku, самое время его установить. Если он уже установлен, создайте приложение Heroku и разверните наш новый блестящий бот.

Итак, мы успешно создали нашего бота и развернули его. Ура! Пришло время закончить Slack сторону вещей.

Здесь мы используем два типа расширений — команда косой черты и входящий веб-крючок — поэтому нам нужно настроить их по отдельности. Перейдите в « Настроить приложения» и нажмите на слэш-команды и « Добавить конфигурацию» на следующей странице.

Дайте команду слеша по вашему выбору — вы можете быть настолько вредным, насколько это возможно. Я выбрал очевидное /anonbot . После того, как вы ввели команду slash, на следующей странице заполните поле URL вновь развернутым URL Heroku.

Обратите внимание, что мы указали конечную точку https . Важно, чтобы вы проверили это, поскольку Slack рекомендует, чтобы конечными точками связи были https . Также установите метод как GET , и затем вы можете сохранить интеграцию.

Затем перейдите к той же конечной точке Configure Apps и на этот раз выберите Incoming WebHooks , а на странице конфигурации выберите любой канал, который вы хотите, так как в любом случае мы собираемся переопределить его в нашем сообщении. На появившейся странице Webhook URL .

Теперь, когда у нас есть URL-адрес webhook, установите его в качестве переменной среды Heroku, чтобы мы могли начать показ. Из командной строки в каталоге проекта запустите:

И для радостных новостей мы закончили! Давайте проверим наш вредный новый бот. Введите команду слеш, а затем сообщение, чтобы напугать членов вашей команды.

Вот как ответ будет в канале.

Скриншот

Ну, никто не мог угадать это правильно!

Как я уже говорил, есть простой альтернативный способ сделать это. Мы должны полностью избавиться от входящей части webhook и вместо этого ответить на первоначальный вызов, который Slack делает с текстом и response_type как in_channel . Вот как будет выглядеть app.rb при использовании этого метода:

1
2
3
4
get ‘/anonymize’ do
     content_type :json
     {:text => params[:text], :response_type => «in_channel»}.to_json
   end

Эта функция была недавно представлена ​​Slack. Указывая response_type как in_channel , мы отображаем ответ публично, в противном случае он является приватным. Я не стал использовать этот метод, потому что мы хотим показать, насколько просты эти два расширения.

Так просто, правда? Цель этого урока — дать вам представление о нескольких расширениях, которые предлагает Slack, и я думаю, что он удовлетворен. Весь пример кода, используемый в этом руководстве, размещен на GitHub .

Я благодарю вас за чтение этой статьи, и я надеюсь, что она послужила вашим целям. До скорого!