Статьи

Создайте Slack Bot для взаимодействия с вашей вики

Slackbots

Платформы Wiki были инструментом «go to» для многих команд. Они также используются многими проектами с открытым исходным кодом в качестве средства коммуникации и организации.

В последние несколько лет Slack вышел на сцену инструментов, используемых многими компаниями. Ключевой целью является эффективное общение между членами команды. Помимо чата, Slack также предлагает приложения, которые позволяют легко подключаться к другим сервисам, таким как Trello, MailChimp, Blue Jeans и т. Д. Но интеграция приложений — не единственная функция, которую предлагает Slack. Сегодня мы рассмотрим что-то другое. Боты в приложениях чата — не новость, они берут свое начало с дней IRC, когда у нас были бы боты, которые заботились о разных вещах, таких как неправильное поведение в чате, прогноз погоды, игры и т. Д. В Slack действуют те же понятия.

В этой статье мы будем работать над ботом вики. Ваша команда может иногда использовать помощь от бота, верно?

Платформа вики, которую мы будем использовать, — MediaWiki. Mediawiki — это вики-пакет с открытым исходным кодом, который изначально появился в Википедии. Это одна из наиболее часто используемых вики-систем.

Настроить

В этом уроке мы будем использовать два основных гема Ruby: media-wiki-api и slack-ruby-bot . Мы также хотим, чтобы наш бот где-то жил, поэтому давайте воспользуемся фреймворком Sinatra и разместим нашего бота на Heroku.

Начните с создания каталога с именем slack-wikibot , а внутри него создайте два файла Ruby, которые называются slack-wikibot.rb и Gemfile . В Gemfile добавьте:

Gemfile:

source 'http://rubygems.org' gem 'slack-ruby-bot' gem 'celluloid-io' gem 'puma' gem 'sinatra' gem 'dotenv' gem 'mediawiki_api' 

Давайте запустим пакетную установку, чтобы установить эти гемы:

bundle install

Создайте другой каталог с тем же именем ( slack-wikibot ) и внутри этого каталога создайте файл Ruby с именем bot.rb. Файл bot.rb выглядит так:

bot.rb:

 module SlackWikibot class Bot < SlackRubyBot::Bot end end 

Создайте файл web.rb, который будет содержать наше веб-приложение и облегчит размещение бота. Такие платформы, как Heroku и OpenShift, упрощают развертывание приложений Sinatra.

web.rb:

 require 'sinatra/base' module SlackWikibot class Web < Sinatra::Base get '/' do 'Bot is running...' end end end 

Обсуждение MediaWiki

Чтобы создать статью через API, сначала нужно указать URL-адрес нашего MediaWiki API:

 wiki_connection = MediawikiApi::Client.new "http://MEDIAWIKI-ADDRESS/api.php" 

Мы используем метод create_page для создания статьи, которая требует двух параметров: заголовок и содержание статьи.

 wiki_connection.create_page "SitePoint", "Some basic info about SitePoint" 

Wiki статья создана

Это создало страницу, но когда этот код запускается непосредственно из скрипта, мы ничего не получаем обратно. Есть объект, который мы можем использовать для доступа к проанализированному ответу MediaWiki API.

Входные данные:

 response = wiki_connection.create_page "SitePoint", "Some basic info about SitePoint" 

Если мы сейчас вызываем метод data в response , мы получаем хороший хеш.

 {"result"=>"Success", "pageid"=>26, "title"=>"SitePoint", "contentmodel"=>"wikitext", "nochange"=>""} 

Теперь у нас есть доступ к pageid новой статьи вики. Мы можем сделать простой запрос http://MediaWiki-Address/?curid=26 и это вернет статью.

Давайте посмотрим на другой метод, который используется для удаления нашей статьи. Метод delete требует двух аргументов: заголовок страницы и причина удаления статьи. Поскольку MediaWiki предлагает ревизии и позволяет вам вернуться в прошлое, наличие причины для удаления очень полезно.

 wiki_connection.delete_page "SitePoint", "Reason for deletion" 

Чтобы использовать этот метод, вам необходимо иметь учетную запись и войти в систему. Это очень просто:

 wiki_connection.log_in "username", "password" 

Теперь везде, где мы используем объект wiki_connection , мы аутентифицируемся. Если у вас все еще нет прав на удаление статей, это означает, что вы не в группах, которые разрешают подобные действия. У меня была эта проблема, хотя я был первым пользователем установки MediaWiki. В этом случае вам нужно перейти на страницу Special: UserRights и добавить себя в группы бюрократов и сисопов .

Теперь создайте каталог с именем команды, куда мы добавим команды, которые будет использовать SlackWikiBot. Внутри каталога команд создайте новый файл с именем wiki.rb. Путь этого нового файла — slack-wikibot / slack-wikibot / commands / wiki.rb.

Это место, где живут наши команды, его можно структурировать по-разному. Я предлагаю вам взглянуть на документацию по драгоценному камню slack-ruby-bot. Я использую оператор match , но есть и другие способы, такие как command и scan . В этом случае наш бот наблюдает за нашим чатом, и всякий раз, когда он видит, что мы использовали ключевые слова ! Wiki create или ! Wiki delete , он выполняет некоторые действия.

wiki.rb:

 require 'mediawiki_api' module SlackWikibot module Commands class Wiki < SlackRubyBot::Commands::Base wiki_connection = MediawikiApi::Client.new "http://MediaWiki-URL/api.php" wiki_connection.log_in "username", "password" match(/^!wiki create (?<titlewiki>\w*)\s(?<contentwiki>.*)$/) do |client, data, match | response = wiki_connection.create_page match[:titlewiki], match[:contentwiki] pageid = response.data["pageid"] client.say(channel: data.channel, text: "Your wiki is created http://MediaWiki-URL?curid=#{pageid}") end match(/^!wiki delete (?<titlewiki>\w*)\s(?<reason>.*)$/) do |client, data, match | wiki_connection.delete_page match[:titlewiki], match[:reason] client.say(channel: data.channel, text: "Article #{match[:titlewiki]} page is deleted. Reason: #{match[:reason]}") end end end end 

Давайте посмотрим на структуру нашего проекта:

 └── slack-wikibot ├── Gemfile ├── Gemfile.lock ├── slack-wikibot.rb └── slack-wikibot ├── bot.rb └── commands └── wiki.rb 

Теперь отредактируйте файл slack-wikibot.rb , который мы создали в корневом каталоге, и потребуйте гем slack -ruby-bot. С этим, наши команды бота и вики созданы.

травить-wikibot.rb:

 require 'slack-ruby-bot' require 'slack-wikibot/bot' require 'slack-wikibot/commands/wiki' 

Создайте файл config.ru для нашего приложения Rack. Мы создадим тему для нашего бота и запустим веб-сервер:

config.ru

 $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'dotenv' Dotenv.load require 'slack-wikibot' require 'web' Thread.abort_on_exception = true Thread.new do begin SlackWikibot::Bot.run rescue Exception => e STDERR.puts "ERROR: #{e}" STDERR.puts e.backtrace raise e end end run SlackWikibot::Web 

Давайте использовать Foreman, так как он позволяет нам легко управлять зависимостями времени выполнения. Форман также полезен, когда у нас есть переменные окружения, как в файле .env . Кроме того, Heroku также использует Foreman.

Нам нужен ключ API от Slack, чтобы мы могли взаимодействовать с ботом в чате. Посетите страницу обслуживания бота, пока вы вошли в свою слабую команду. Первый шаг — установить имя пользователя для нашего бота:

slackbot_username

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

Slack API Key

Создайте файл .env в корневом каталоге нашего проекта и добавьте ключ API:

 SLACK_API_TOKEN=xoxb-68226463922-ceoVi1mZgGIQJxuVD6Gpu2CV 

Создайте Procfile в корневом каталоге, который мастер будет использовать при запуске команды ниже:

PROCFILE:

 web: bundle exec puma -p $PORT 

Теперь давайте запустим нашего бота:

 foreman start 

Развернуть в Heroku

Вам нужно будет установить инструменты Heroku:

 gem install heroku 

Используйте команду Heroku для создания приложения:

 heroku create 

Он назначит случайное имя и добавит удаленный репозиторий git. Теперь отправьте ваш код в репозиторий Heroku.

Примечание : вам придется использовать git для этой части, поэтому, если вы этого не сделали, убедитесь, что git add и git commit ваш код перед нажатием.

 git push heroku master 

Теперь, если вы посетите URL своего приложения Heroku (ваш будет другим):

 https://agile-retreat-96798.herokuapp.com/ 

Вы должны получить страницу, которая говорит, что бот работает …

Вернитесь в Slack и используйте /invite @YourBotsName чтобы пригласить вашего бота на канал. Затем попробуйте одну из команд, которые мы создали:

Wiki-bot_in_action

Вывод

Боты — очень удобный инструмент для автоматизации некоторых наших работ. Вы можете найти больше информации о создании Slack-ботов в этом посте на SitePoint .

Каждый раз, когда вы выполняете повторяющуюся работу, подумайте, может ли это сделать бот. Если ответ «да», то тратить время не стоит, начните его создавать. Есть много преимуществ в том, что боты выполняют нашу работу: они быстры и делают меньше ошибок, просто чтобы назвать пару. Пришло время принять наших новых повелителей на основе Slack-бота ?