Слышали шутку-предисловие, которую рассказал парень перед тем, как показать, как создать SMS-бота для отцовских шуток в Slack на Python?
Телефон потерялся в джунглях и запутался в густых лианах. Он видит питона и говорит: «Эй, можешь дать мне немного Slack?»
*[Я подожду, пока вы мысленно подготовитесь к нашествию отцовских шуток]*
Наш Dadbot будет отправлять вам ужасно классные шутки, когда вы упомянете его в канале Slack. Dadbot также будет публиковать качественную отцовскую шутку в канале Slack, когда вы отправите SMS на номер Twilio. Это мощь Slack API в сочетании с Twilio SMS API — отцовские шутки повсюду.
Мой папа никуда не ходит без штанов с карманами, дополнительных салфеток в кармане и карты. Нам тоже понадобится несколько важных вещей, прежде чем мы отправимся создавать Dadbot.
— Python 2 или 3
— pip и virtualenv для управления зависимостями Python-приложений.
— Микрофреймворк Flask. Ознакомьтесь с несколькими ресурсами, если вам нужна вводная информация по Flask.
Евангелист Twilio и любитель всего, что связано с Python, Мэтт Макай написал пошаговое руководство по настройке виртуальной среды прямо здесь, в своем блоге.
Для работы со Slack вам понадобятся следующие вещи:
— Бесплатный аккаунт Slack, а также команда, в которой вы состоите и имеете доступ к API. Если нет, зарегистрируйтесь в команде Slack Developer Hangout
— Официальная библиотека Python slackclient
— Документация Slack API
— Тестовый токен Slack API
Для работы с Twilio вам понадобятся две вещи:
— Бесплатный аккаунт Twilio
— Один номер телефона Twilio с возможностью отправки SMS
С помощью Терминала создайте символический карман в штанах, в котором вы будете хранить проект Dadbot. После создания этой директории создайте новую виртуальную среду, чтобы отделить зависимости нашего приложения от других проектов, над которыми вы работаете.
virtualenv dadbot
Активируйте эту среду с помощью следующей команды.
source dadbot/bin/activate
Отлично. Вы должны увидеть что-то подобное.
Пришло время установить библиотеку-обёртку slackclient API, чтобы мы могли отправлять и получать сообщения из нашего канала #dadbot в Slack. Вот команда pip, которую нужно выполнить для установки slackclient, библиотек Twilio и Flask.
pip install slackclient twilio flask
Далее нам нужно получить токен доступа для нашей команды Slack, а также учётные данные API Twilio. Приготовьтесь экспортировать несколько токенов.
Какой смысл рассказывать отличную отцовскую шутку, если вокруг никого нет, чтобы её услышать? Чат-приложение Slack послужит нам сосудом для отцовских шуток. Они предлагают программный доступ к своему чат-приложению через простой в использовании WebAPI.
Нажмите здесь, чтобы зарегистрироваться в Slack, создать команду или войти в свой старый проверенный аккаунт Slack. Как только вы всё настроите, прокрутите страницу API вниз до раздела Authentication и нажмите «Generate Test Tokens».
**Совет профессионала** – Вам понадобятся административные права в команде Slack, для которой вы генерируете тестовые токены.
Нам нужно убедиться, что наш Python-код имеет зелёный свет для вызова Slack API. Чтобы проверить, что он авторизован, нам нужно экспортировать наши секретные токены (как от Slack, так и от Twilio) в качестве переменных окружения. Мы экспортируем токен с именем SLACK_TOKEN.
export SLACK_TOKEN=’ваш токен Slack вставлен здесь’
Если у вас ещё нет аккаунта Twilio, сейчас самое время зарегистрироваться для бесплатного аккаунта. Нам нужно получить доступ к Twilio API для отправки и получения SMS. Если у вас уже есть аккаунт Twilio, войдите в него. Вам нужно будет приобрести номер, который вы будете использовать для отправки и получения SMS от Dadbot. Если у вас уже есть номер, который вы хотите использовать, это тоже подойдёт.
Twilio попросит указать URL, на который он сможет отправить HTTP POST-запрос, как только SMS достигнет нашего номера Twilio для Dadbot. Нам нужно решить то, что я называю «Проблемой Зулендера — наш код доступен только нашей локальной машине». Чтобы предоставить Twilio URL и решить проблему Зулендера, мы будем использовать ngrok для предоставления доступа к нашему локальному веб-серверу через доступный домен.
После того как вы загрузите ngrok, запустите его с помощью этой команды в терминале.
./ngrok http 5000
Вы должны увидеть что-то подобное.
Скопируйте URL переадресации, перейдите в Twilio Console и вставьте URL переадресации с добавлением «/twilio» в поле «A message comes in». Сохраните этот URL переадресации под рукой, так как он понадобится нам для обработки некоторых деталей Slack.
Далее мы экспортируем наш Twilio Account SID и Auth Token в качестве переменных окружения. Перейдите в Twilio Console и скопируйте эти две переменные.
Убедитесь, что вы больше не находитесь в Python REPL. Введите CTRL + d, если это так. Как только вы выйдете из REPL, используйте следующую команду для экспорта переменных.
Помните все те переменные окружения, которые мы экспортировали ранее? Модуль os извлечёт TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN и другие переменные, которые мы экспортировали из командной строки. Класс Flask создаст наше приложение, а request Response предоставит нам необходимые HTTP-входы и ответы.
Давайте получим эти переменные окружения и создадим экземпляр Flask-приложения вместе с клиентами Slack и Twilio.
Мы будем использовать команду python для проверки того, что наш Dadbot работает без сбоев, и для запуска Flask-сервера. Чтобы это стало возможным, добавьте следующую функцию:
Пришло время. Отправьте SMS на ваш номер телефона Twilio. Вы должны увидеть, что ваше сообщение появилось в канале Slack следующим образом.
Это простое «hai» подтверждает, что ваше SMS достигло Twilio, вызвало HTTP POST-запрос к вашему URL ngrok, ngrok переадресовал POST-запрос на вашу локальную машину и достиг файла dadbot.py, который работает на вашем Flask-сервере. Это путь отцовской шутки.
Никто не хочет слышать одну и ту же шутку снова и снова. Используйте модуль import random, чтобы позволить нашему приложению случайным образом выбирать отцовскую шутку из списка шуток, который мы поместим в myList. Нам нужно отредактировать некоторый код, чтобы Twilio знал, что нужно напечатать выбранную случайную шутку в Slack.
Вернитесь в файл Dadbot.py и добавьте следующие строки кода.
Мы используем модуль random.choice для выбора шутки из myList и говорим Twilio напечатать эту шутку в нашем канале Slack.
Сохраните файл dadbot.py и попробуйте отправить SMS на ваш номер Twilio. Он должен напечатать случайную шутку в вашем канале Slack.
Мой папа думает, что slack — это верёвка, и печатает электронные письма синим Comic Sans. Можно с уверенностью сказать, что он не заходит в Slack регулярно. Давайте откроем ему радость отцовских шуток, отправляя SMS, когда вы упоминаете @dadbot в канале Slack.
Чтобы отправлять SMS, когда кто-то вызывает dadbot, нам нужно использовать исходящие вебхуки Slack. Исходящий вебхук будет уведомлять наше Python-приложение через HTTP POST-запрос.
Нажмите CTRL+C на работающем Flask-сервере. Мы изменим наш файл dadbot.py, добавив следующие выделенные фрагменты кода.
Обратите внимание на добавление random.choice(myList) в response_message? Мы будем использовать эту функцию снова, чтобы отправлять случайные отцовские шутки через SMS.
Перейдите на страницу исходящих вебхуков Slack и нажмите ссылку «outgoing webhook integration», как показано ниже.
Прокрутите вниз до раздела Integration Settings. Выберите «#dadbot» в качестве канала для прослушивания. Введите «@dadbot» в поле «Trigger Word(s)». Скопируйте и вставьте ваш URL переадресации ngrok с добавлением «/slack» в текстовое поле URL(s).
После того как вы скопируете токен Slack, нажмите «Save Settings». Я сгенерировал токен на картинке заново, так что он не будет работать, если вы случайно его скопируете. Экспортируйте ваш токен Slack в качестве переменной окружения с помощью этой команды.
(dadbot)$ export SLACK_WEBHOOK_SECRET = ‘сгенерированный токен исходящего вебхука здесь’
Перезапустите ваш Flask-сервер и приготовьтесь к ужасным шуткам. Мы собираемся протестировать получение сообщений из Slack через SMS. Перейдите в созданный вами канал #dadbot. Вы должны увидеть уведомление о том, что исходящий вебхук интеграция была добавлена в канал.
Попробуйте упомянуть @dadbot. Сообщение должно начинаться с этого упоминания. Моё сообщение для dadbot не сработает, потому что я начал его с «что нового». Попробуйте сказать «@dadbot расскажи мне шутку!». Вы должны получить шутку на свой телефон.
Отлично! Наш Dadbot жив и рассказывает множество случайных, ужасных шуток. Дайте нам знать, какие отцовские шутки вы добавите в свой Dadbot. Моя любимая: «Какой любимый фрукт вампира? Нектарин». Да, она ужасна. Не вините меня, вините моего папу. Это его шутка. Если вам надоело добавлять шутки в своё приложение, вот несколько вещей, которые вы можете сделать, чтобы расширить возможности вашего Slack-бота.
— Добавить обработку естественного языка (NLP) в веб-приложение на Python Flask
— Попробовать другой клиент Slack или отказаться от вспомогательной библиотеки и использовать библиотеку Requests для реализации логики повторных попыток
— Написать и настроить более сложного Slack-бота
С Днём отца, всем!