Небольшой туториал, как сделать простого слэк-бота на Python, развернуть его на Heroku, подключить Travis CI за двадцать минут и начать делать что-то полезное.

Итак у нас есть бот, который карает людей пишущих в чат «привет», только чтобы отвлечь нас от работы. Как сделать себе такого же, но лучше?


Heroku + Python Web App


Установка хероку прекрасно описана тут нам потребуется всего три файла

- requirements.txt
- Procfile
- runtime.txt

В первом перечисляем все зависимости примерно так

httplib2
slacker
Flask==0.12

можно их сразу не писать, умный PyCharm сам подскажет, что мы что-то пропустили.
Httplib2 понадобится нам чтобы посылать запросы для прохождения авторизации, Slacker — чтобы удобно работать со Slack API, а Flask — для приема запросов, это самый простой и безболезненный веб-фреймворк, требующий нулевой настройки.

В runtime.txt указываем версию пайтона, которая нам нравится.
В Procfile тоже ровно одна строка
web: python app.py

Теперь мы готовы писать свое первое приложение, создаем app.py с таким содержимым

from flask import Flask
from flask import request
from flask import make_response

app = Flask(__name__)

# создали ендпоинт
@app.route('/webhook')
def hello_slack():
    # получили данные из запроса
    request_json = request.get_json(silent=True, force=True)
    # тут ваш код возьмет запрос и вернет в ответ любой dict объект ответа, можно даже пустой
    # примерно так request_json -> response_body_json
    ...
    response_body = json.dumps(response_body_json)
    # упаковали все в корректный респонс
    response = make_response(response_body)
    response.headers['Content-Type'] = 'application/json'
    # и вернули
    return response

if __name__ == '__main__':
    port = int(os.getenv('PORT', 5000))
    app.run(debug=False, port=port, host='0.0.0.0')

Пушим все на гитхаб, заходим на хероку и создаем новое приложение из публичного репозитория. Хероку самостоятельно выкачает коды, поставит зависимости из requirements.txt и запустит приложение согласно Procfile.

Slack


Все, с этого момента у нас есть бекенд по адресу

https://YOUR_APP_NAME.herokuapp.com/webhook
и можно создавать свое слэк приложение, которое будет *делать-что-то-полезное*. Осталось его валидировать для events API (то есть, самого полезного АПИ — АПИ оповещения нас о любых событиях). Слэк сам просто на наш ендпоинт особый challenge-request из которого нужно достать код и положить его в респонс. Теперь уже в настройках слэк-приложения в разделе Event Subscriptions выбираем нужные нам события и все. События будут падать на тот же адрес. Как только сделаете все, что хотите с входящими данными, нужно поддержать авторизацию других пользователей. Для этого нужен будет еще один эндпоинт, например /auth, на который слэк отправит запрос, как только новый пользователь захочет поставить себе ваше приложение. Получив такой запрос, нужно вытащить из него код и выслать POST-ом на slack.com/api/oauth.access вместе с кредами приложения, а на сам запрос ответить любым успешным ответом, или же редиректом на страничку, которую хотите показать пользователю после авторизации.

Travis CI


Бот готов. Осталось убедиться, что он работает. Приложение всегда можно запустить локально и поспамить запросами через curl, но толку от этого мало, поэтому сразу пишем юнит тесты и просим Тревиса следить за репозиторием. Проект в Тревисе создается почти так же интуитивно как в хероку, нужен только адрес репа, все остальное тревис сделает сам если создать еще один файл в корне проекта .travis.yml

language: python
python:
  - "3.6"
script:
  python3 -m unittest discover
В секции script мы сообщаем тревису, что делать, после того как скачана последняя версия исходников. Эта команда (которую стоит почаще запускать локально) сама найдет юнит-тесты в нашем проекте и прогонит их.

С этого момента Тревис и Хероку (если включено в настройках) следят за репозиторием и скачивают ваше приложение, разворачивают его и запускают тесты, присылают результаты их выполнения на почту. И вы почти готовы к продакшену, как только все заработает, нужно будет только отключить автоустановку сорцов в хероку, и перенастроить Тревис, чтобы он сам проводил деплой только тогда, когда тесты прошли успешно. Профит!

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

Удачи!

Комментарии (4)


  1. iroln
    04.08.2017 15:33

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

    Как лучше хранить "вечные" токены (access_token, bot_access_token)?


    В документации Slack есть некоторые bla-bla-bla
    https://api.slack.com/docs/oauth-safety#safe_token_storage


    1. fo2rist Автор
      04.08.2017 17:06

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


      1. iroln
        04.08.2017 18:20

        На хероку переменные среды удобно настраиваются, через панель разработчика

        Не совсем понимаю.


        Приложение уже запущено и работает. Допустим, новый пользователь установил/переустановил наше приложение у себя в Slack team. Мы от него получили токены. Как их через панель разработчика установить в переменные среды? Мы не можем полученные токены не сохранить где-то в постоянном хранилище, иначе мы потеряем доступ к slack team пользователя, например, при перезапуске приложения.


        1. fo2rist Автор
          04.08.2017 19:44
          +1

          Извиняюсь, подумал вопрос про реально «вечные переменные» которые выдаются слэком на приложение: API_KEY, CLIENT_ID, CLIENT_SECRET — их как раз удобно задавать через среду.
          Пользователи, установившие приложение внутри компании, авторизуют его получать события в автоматическом режиме. И с этого момента приложение получает их независимо от того, сохранит оно какой-то ключ, или нет, то есть нужды что-то хранить нет, и как только пользователь отзовет авторизацию, мы просто перестанем получать апдейты. Если хочется выполнять какие-то действия от имени пользователя, то да, нужно будет сохранить у себя пользовательский access_token. Среди БД Хероку в явной форме рекомендует Постгрес, но и key-value хранилищ среди Хероку-плагинов хватает