前書き
Slackは、チーム向けのコミュニケーションプラットフォームです。 Slackには、チームがSlackを拡張し、他のプログラムと統合できるようにする多数のアドオンがあります。 Slackslash commandsは、メッセージ入力ボックスでアクションを実行するための迅速で簡単な方法です。 たとえば、/who
と入力すると、現在のチャネルのすべてのユーザーが一覧表示されます。 組み込みのスラッシュコマンドの完全なリストは、https://get.slack.help/hc/en-us/articles/201259356-Slash-commandsにあります。
Slackワークスペースのメンバーが役立つと思う独自のスラッシュコマンドを作成できます。 コマンドをワークスペースにインストールしてコマンドを呼び出すと、作成したプログラムにリクエストを送信するようSlackに指示できます。 このプログラムはSlackから情報を受け取り、Slackに表示される応答を返します。 API documentationを読むと、Slackスラッシュコマンドの詳細を知ることができます。
このチュートリアルでは、Ubuntu 16.04サーバーで実行されているFlaskアプリを利用して/slash
というSlackスラッシュコマンドを作成し、このコマンドをSlackワークスペースにインストールします。 完了したら、メッセージ入力ボックスに/slash
と入力すると、Flaskアプリに情報が送信され、リクエストが処理されて、Slackに短いメッセージが返されます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
sudo非rootユーザーとファイアウォールを含むthe Ubuntu 16.04 initial server setup guideをフォローしてセットアップされた1つのUbuntu16.04サーバー。
-
既存のFlaskアプリケーションは、Nginxの背後で実行されているuWSGIで提供されていました。 チュートリアルHow To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04を完了して、サーバーでこれを構成します。
-
アプリをインストールする権限を持つ開発Slackワークスペース。アプリがない場合は、https://slack.com/createで作成します。
[[step-1 -—- creating-and-installing-the-slack-app]] ==ステップ1—Slackアプリの作成とインストール
コードを作成する前に、まずSlack appを作成します。これは、Slackに追加機能を提供し、開発用Slackワークスペースにインストールします。 次に、コマンドを定義し、コマンドを呼び出すときにコマンドが要求するURLを指定します。
Slackアプリを作成するには、https://api.slack.com/appsにアクセスし、緑色のCreate New Appボタンをクリックします。 表示されるフォームで、次の詳細を入力します。
-
App Nameには、
DigitalOcean Slack slash command
と入力します。 -
Development Slack Workspaceには、開発ワークスペースを選択します。
次に、緑色のCreate Appボタンをクリックします。
アプリが作成されたら、Slash Commandsをクリックしてから、Create New Commandボタンをクリックします。 次のページが表示されます。
このチュートリアルでは、/slash
というコマンドを作成します。このコマンドは、HTTP POSTを介してhttp://server_domain_or_IP/slash
であるリクエストURLにデータを送信します。 そのため、次の情報を入力します。
-
Commandフィールドに
/slash
を入力します。 -
Request URLには、
http://your_server_ip_or_domain/slash
と入力します。 -
Short Descriptionには、
DigitalOcean Slack slash command
と入力します。
次に、緑色のSaveボタンで、スラッシュコマンドの作成を終了します。
次に、Install Appリンクをクリックして、アプリをワークスペースにインストールします。 緑のInstall App to Workspaceボタンを押します。 次に、緑色のAuthorizeボタンを押します。
開発用SlackワークスペースにSlackアプリを作成してインストールしましたが、スラッシュコマンドを処理するWebアプリを作成するまでコマンドは機能しません。 アプリを構築する前に、Python環境を構成する必要があります。
[[step-2 -—- configuring-the-python-environment]] ==ステップ2—Python環境の構成
How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04チュートリアルを終了すると、~/myproject/
にFlaskアプリが配置されます。 このディレクトリには、次のファイルとディレクトリが含まれます。
-
myproject.ini
-
myproject.py
-
wsgi.py
-
myprojectenv/
myproject.py
でFlaskアプリを変更して、Slack slashコマンドによって送信されたデータに作用し、SlackにJSON応答を返します。
API documentation for commandsは、Slackが提供するcommndに関連付けられた検証トークンを使用してスラッシュコマンドを検証する必要があることを示しています。
この検証トークンは秘密にしておく必要があるため、バージョン管理下にない.env
ファイルという新しいファイルに保存します。 python-dotenv
パッケージを使用して、.env
のキーと値のペアを環境変数としてエクスポートし、myproject.py
のそれらの環境変数にアクセスします。
まず、次を実行してPython仮想環境をアクティブにします。
source myprojectenv/bin/activate
virtualenvがアクティブ化されていることを確認するには、Bashプロンプトの左側に(myprojectenv)
が表示されます。 検証トークンなどの秘密は、バージョン管理下に保管しないでください。 これを実現するために、シークレットを環境変数としてエクスポートするpython-dotenv
パッケージを使用します。 pip
を使用して、python-dotenv
パッケージをインストールします。
pip install python-dotenv
nanoまたはお気に入りのテキストエディタを使用して、.env
ファイルを作成します。
nano .env
https://api.slack.com/appsにアクセスして、検証トークンを取得します。 DigitalOcean Slack slash commandアプリをクリックしてから、Basic Informationをクリックします。 次に、Verification Tokenを見つけます。
トークンの値をコピーして.env
ファイルに配置し、値をVERIFICATION_TOKEN
という環境変数に割り当てます。
~/myproject/.env
VERIFICATION_TOKEN=your_verification_token
ファイルを保存し、エディターを終了します。
Flaskアプリを開発している場合、アプリに変更を加えると、uWSGIサーバーが自動的にリロードされるようになります。 これを行うには、最初にエディターでmyproject.ini
を開きます。
nano myproject.ini
この行をファイルの最後に追加して、touch
またはmyproject.py
でFlaskアプリを変更したときにuWSGIが自動的に再ロードされるようにします
~/myproject/myproject.ini
...
touch-reload = myproject.py
ファイルを保存し、エディターを終了します。
次に、スラッシュコマンドによって送信された情報を受信して処理し、適切な応答をSlackに返すFlaskアプリを作成します。
[[step-3 -–- creating-the-flask-app]] ==ステップ3–Flaskアプリの作成
Slackで/slash
コマンドを呼び出すと、Slackはサーバーにリクエストを送信します。 URL/slash
をヒットするようにコマンドを構成したので、そのエンドポイントに応答するように作成したFlaskアプリを変更します。
エディタでmyproject.py
を開きます。
nano myproject.py
ファイルの内容を削除します。 新しいアプリをゼロから作成します。
Flaskをインポートし、JSONデータを処理してWebリクエストを行うための追加モジュールをロードする次のコードを追加します。
~/myproject/myproject.py
#!/usr/bin/env python
from flask import Flask, jsonify, request
次に、dotenv
モジュールをロードするこのコードを追加します。 作成した.env
ファイルの内容を読み取ります。 その内容を環境変数にロードし、環境から検証トークンをフェッチして、変数verification_token
に格納します。
~/myproject/myproject.py
...
import os
import dotenv
dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)
verification_token = os.environ['VERIFICATION_TOKEN']
次のコードを追加して、「DigitalOcean Slack slashコマンドが成功しました!」というテキスト応答を送信して、Slack slashコマンドに応答するようにFlaskアプリを構成します。
~/myproject/myproject.py
...
app = Flask(__name__)
@app.route('/slash', methods=['POST'])
def slash():
if request.form['token'] == verification_token:
payload = {'text': 'DigitalOcean Slack slash command is successful!'}
return jsonify(payload)
if __name__ == '__main__':
app.run()
ファイルを保存し、エディターを終了します。
myproject
systemdサービスを再起動して、コードの最新バージョンが実行されていることを確認します。
sudo systemctl restart myproject
次に、Nginxの構成を変更して、スラッシュコマンドをサポートします。
[[step-4 -–- configuring-nginx-to-serve-the-command]] ==ステップ4–コマンドを提供するためのNginxの構成
リクエストURLはhttp://server_domain_or_IP/slash
であるため、Nginxサーバーブロックのlocation
値を/
から/slash
に変更する必要があります。
エディターでファイル/etc/nginx/sites-available/myproject
を開きます。
sudo nano /etc/nginx/sites-available/myproject
location
の値を/
から/slash
に変更します。
/etc/nginx/sites-available/myproject
...
location /slash {
include uwsgi_params;
uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
}
}
ファイルを保存し、エディターを終了します。
次に、Nginx構成ファイルで構文エラーを確認します。
sudo nginx -t
Nginx構成ファイルに構文エラーがない場合は、Nginxサービスを再起動します。
sudo systemctl restart nginx
開発用のSlackワークスペースにアクセスし、任意のチャネルに/slash
と入力します。 次の応答が表示されます。
コマンドが失敗したことを示すメッセージを受け取った場合は、myproject.py
のコードで構文エラーや問題がないか再確認してください。 それからもう一度やり直してください。
最後に、コマンドの開発が完了したら、Python仮想環境を非アクティブ化して、将来のPythonコマンドがシステムPythonインタープリターを使用するようにします。
deactivate
これで、/slash
スラッシュコマンドから情報を受け取り、Slackに応答を返すFlaskアプリが正常に作成されました。
[.note]#サーバーとSlack間の通信が安全であることを確認するには、リクエストURLにHTTPSを使用して、スラッシュコマンドの接続を暗号化します。 installing a free SSL certificate issued by Let’s Encrypt on the Nginx serverでこれを行うことができます。 完了したら、必ずSlackアプリのURLを変更し、http://
をhttps://
に変更してください。
#
結論
このチュートリアルでは、uWSGIアプリケーションサーバーとNginxリバースプロキシサーバーによって提供されるFlaskアプリをセットアップして、Slackスラッシュコマンドを実装しました。
スラッシュコマンドの作成の基本を理解したので、チームが必要とする任意のスラッシュコマンドを実装できます。 データベースからデータを取得するコマンドを作成したり、他のAPIとやり取りしたり、コードをデプロイするためのコマンドを作成することもできます。