python

Пишем бота для Slack на Python

  • суббота, 5 августа 2017 г. в 03:11:55
https://habrahabr.ru/post/334678/
  • Python


Небольшой туториал, как сделать простого слэк-бота на 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 мы сообщаем тревису, что делать, после того как скачана последняя версия исходников. Эта команда (которую стоит почаще запускать локально) сама найдет юнит-тесты в нашем проекте и прогонит их.

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

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

Удачи!