- PVSM.RU - https://www.pvsm.ru -
Небольшой туториал, как сделать простого слэк-бота на Python, развернуть его на Heroku, подключить Travis CI за двадцать минут и начать делать что-то полезное.
Итак у нас есть бот, который карает людей [1] пишущих в чат «привет», только чтобы отвлечь нас от работы. Как сделать себе такого же, но лучше?
Установка хероку прекрасно описана тут [2] нам потребуется всего три файла
- requirements.txt - Procfile - runtime.txt
В первом перечисляем все зависимости примерно так
httplib2
slacker
Flask==0.12
можно их сразу не писать, умный PyCharm [3] сам подскажет, что мы что-то пропустили.
Httplib2 понадобится нам чтобы посылать запросы для прохождения авторизации, Slacker — чтобы удобно работать со Slack API, а Flask [4] — для приема запросов, это самый простой и безболезненный веб-фреймворк, требующий нулевой настройки.
В 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.
Все, с этого момента у нас есть бекенд по адресу
https://YOUR_APP_NAME.herokuapp.com/webhook
и можно создавать свое слэк приложение [5], которое будет *делать-что-то-полезное*. Осталось его валидировать для events API [6] (то есть, самого полезного АПИ — АПИ оповещения нас о любых событиях). Слэк сам просто на наш ендпоинт особый challenge-request из которого нужно достать код и положить его в респонс. Теперь уже в настройках слэк-приложения в разделе Event Subscriptions выбираем нужные нам события и все. События будут падать на тот же адрес. Как только сделаете все, что хотите с входящими данными, нужно поддержать авторизацию других пользователей. Для этого нужен будет еще один эндпоинт, например /auth, на который слэк отправит запрос, как только новый пользователь захочет поставить себе ваше приложение. Получив такой запрос, нужно вытащить из него код и выслать [7] POST-ом на slack.com/api/oauth.access [8] вместе с кредами приложения, а на сам запрос ответить любым успешным ответом, или же редиректом на страничку, которую хотите показать пользователю после авторизации.
Бот готов. Осталось убедиться, что он работает. Приложение всегда можно запустить локально и поспамить запросами через curl, но толку от этого мало, поэтому сразу пишем юнит тесты [9] и просим Тревиса следить за репозиторием. Проект в Тревисе создается [10] почти так же интуитивно как в хероку, нужен только адрес репа, все остальное тревис сделает сам если создать еще один файл в корне проекта .travis.yml
language: python
python:
- "3.6"
script:
python3 -m unittest discover
В секции script мы сообщаем тревису, что делать, после того как скачана последняя версия исходников. Эта команда (которую стоит почаще запускать локально) сама найдет юнит-тесты в нашем проекте и прогонит их.
С этого момента Тревис и Хероку (если включено в настройках) следят за репозиторием и скачивают ваше приложение, разворачивают его и запускают тесты, присылают результаты их выполнения на почту. И вы почти готовы к продакшену, как только все заработает, нужно будет только отключить автоустановку сорцов в хероку, и перенастроить Тревис, чтобы он сам проводил деплой только тогда, когда тесты прошли успешно. Профит!
Сылки на исходники лежат тут [11], а живой Тревис здесь [12]. Сам бот доступен только коллегам родной компании [13], но я не исключаю выпуск его в паблик, если будет интерес.
Удачи!
Автор: fo2rist
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/261683
Ссылки в тексте:
[1] Итак у нас есть бот, который карает людей: https://habrahabr.ru/post/334674/
[2] описана тут: https://devcenter.heroku.com/articles/python-runtimes
[3] PyCharm: http://www.jetbrains.com/pycharm/download
[4] Flask: http://flask.pocoo.org
[5] создавать свое слэк приложение: https://api.slack.com/apps?new_app=1
[6] events API: https://api.slack.com/events-api
[7] вытащить из него код и выслать: https://api.slack.com/docs/oauth
[8] slack.com/api/oauth.access: https://slack.com/api/oauth.access
[9] юнит тесты: http://www.diveintopython3.net/unit-testing.html
[10] Проект в Тревисе создается: https://docs.travis-ci.com/user/languages/python/
[11] тут: https://github.com/fo2rist/saynohi
[12] здесь: https://travis-ci.org/fo2rist/saynohi
[13] родной компании: http://distillery.com
[14] Источник: https://habrahabr.ru/post/334678/
Нажмите здесь для печати.