Ubuntu16.04でFlaskとPython3を使用してスラッシュコマンドを作成する方法
序章
Slack は、チーム向けのコミュニケーションプラットフォームです。 Slackには、チームがSlackを拡張し、他のプログラムと統合できるようにする多数のアドオンがあります。 Slack スラッシュコマンドは、メッセージ入力ボックスでアクションを実行するためのすばやく簡単な方法です。 たとえば、/who
と入力すると、現在のチャネルのすべてのユーザーが一覧表示されます。 組み込みのスラッシュコマンドの完全なリストは、https://get.slack.help/hc/en-us/articles/201259356-Slash-commandsにあります。
Slackワークスペースのメンバーが役立つ独自のスラッシュコマンドを作成できます。 コマンドをワークスペースにインストールしてコマンドを呼び出すと、作成したプログラムにリクエストを送信するようにSlackに指示できます。 このプログラムはSlackから情報を受け取り、Slackに表示される応答を返します。 APIドキュメントを読むと、Slackスラッシュコマンドの詳細を学ぶことができます。
このチュートリアルでは、Ubuntu16.04サーバーで実行されているFlask アプリを利用して、/slash
というSlackスラッシュコマンドを作成し、このコマンドをSlackワークスペースにインストールします。 完了したら、メッセージ入力ボックスに/slash
と入力すると、Flaskアプリに情報が送信され、リクエストが処理され、Slackに短いメッセージが返されます。
このFlaskアプリは、 uWSGI アプリケーションサーバーを使用して提供し、Nginxをリバースプロキシとして使用します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
- Nginxの背後で実行されているuWSGIで提供される既存のFlaskアプリケーション。 チュートリアルUbuntu16.04 でuWSGIとNginxを使用してFlaskアプリケーションを提供する方法を完了して、サーバーでこれを構成します。
- アプリをインストールする権限を持つ開発Slackワークスペース。アプリがない場合は、https://slack.com/createで作成します。
ステップ1—Slackアプリの作成とインストール
コードを書く前に、まず Slackアプリを作成します。これはSlackに追加機能を提供し、開発用Slackワークスペースにインストールします。 次に、コマンドを定義し、コマンドを呼び出すときにコマンドが要求するURLを指定します。
Slackアプリを作成するには、 https://api.slack.com/apps にアクセスし、緑色の Create NewAppボタンをクリックします。 表示されるフォームに、次の詳細を入力します。
- アプリ名に
DigitalOcean Slack slash command
と入力します。 - Development Slack Workspace で、開発ワークスペースを選択します。
次に、緑色のアプリの作成ボタンをクリックします。
アプリが作成されたら、スラッシュコマンドをクリックしてから、新しいコマンドの作成ボタンをクリックします。 次のページが表示されます。
このチュートリアルでは、/slash
というコマンドを作成します。このコマンドは、HTTPPOSTを介してhttp://server_domain_or_IP/slash
のリクエストURLにデータを送信します。 そのため、次の情報を入力してください。
- コマンドフィールドに
/slash
を入力します。 - リクエストURLには、
http://your_server_ip_or_domain/slash
と入力します。 - 簡単な説明には、
DigitalOcean Slack slash command
と入力します。
次に、緑色の保存ボタンで、スラッシュコマンドの作成を終了します。
次に、アプリのインストールリンクをクリックして、アプリをワークスペースにインストールします。 緑色のアプリをワークスペースにインストールボタンを押します。 次に、緑色の承認ボタンを押します。
これで、開発SlackワークスペースにSlackアプリを作成してインストールしましたが、slashコマンドを処理するWebアプリを作成するまで、このコマンドは機能しません。 アプリをビルドする前に、Python環境を構成する必要があります。
ステップ2—Python環境の構成
Ubuntu 16.04 チュートリアルでuWSGIとNginxを使用してFlaskアプリケーションを提供する方法を完了すると、~/myproject/
にFlaskアプリが配置されます。 このディレクトリには、次のファイルとディレクトリが含まれています。
myproject.ini
myproject.py
wsgi.py
myprojectenv/
myproject.py
のFlaskアプリを変更して、Slack slashコマンドによって送信されたデータに作用し、SlackにJSON応答を返します。
コマンドのAPIドキュメントには、Slackが提供するcommndに関連付けられた検証トークンを使用してslashコマンドを検証する必要があると記載されています。
この検証トークンは秘密にしておく必要があるため、バージョン管理下にない.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スラッシュコマンドアプリをクリックしてから、基本情報をクリックします。 次に、検証トークンを見つけます。
トークンの値をコピーして.env
ファイルに配置し、VERIFICATION_TOKEN
という環境変数に値を割り当てます。
VERIFICATION_TOKEN=your_verification_token
ファイルを保存して、エディターを終了します。
Flaskアプリを開発しているときは、アプリに変更を加えたときにuWSGIサーバーを自動的にリロードする必要があります。 これを行うには、まずエディターでmyproject.ini
を開きます。
- nano myproject.ini
この行をファイルの最後に追加して、touch
またはmyproject.py
でFlaskアプリを変更したときにuWSGIが自動的に再ロードされるようにします。
...
touch-reload = myproject.py
ファイルを保存して、エディターを終了します。
次に、slashコマンドによって送信された情報を受信して処理し、Slackに適切な応答を返すFlaskアプリを作成します。
ステップ3–フラスコアプリを作成する
Slackで/slash
コマンドを呼び出すと、Slackはサーバーにリクエストを送信します。 URL /slash
をヒットするようにコマンドを構成したので、そのエンドポイントに応答するように作成したFlaskアプリを変更します。
エディタでmyproject.py
を開きます。
- nano myproject.py
ファイルの内容を削除します。 新しいアプリを最初から作成します。
Flaskをインポートし、JSONデータを処理してWebリクエストを行うための追加モジュールをロードする次のコードを追加します。
#!/usr/bin/env python
from flask import Flask, jsonify, request
次に、dotenv
モジュールをロードするこのコードを追加します。 作成した.env
ファイルの内容を読み取ります。 その内容を環境変数にロードし、環境から検証トークンをフェッチして、変数verification_token
に格納します。
...
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コマンドが成功しました!」というテキスト応答を送信して、Slackslashコマンドに応答するようにFlaskアプリを構成します。
...
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構成を変更しましょう。
ステップ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
に変更します。
...
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
slashコマンドから情報を受け取り、Slackに応答を返すFlaskアプリが正常に作成されました。
サーバーとSlack間の通信を安全にするには、リクエストURLにHTTPSを使用して、slashコマンドの接続を暗号化します。 これを行うには、Let’sEncryptによって発行された無料のSSL証明書をNginxサーバーにインストールします。 完了したら、必ずSlackアプリのURLを変更し、http://
をhttps://
に変更してください。
結論
このチュートリアルでは、uWSGIアプリケーションサーバーとNginxリバースプロキシサーバーによって提供されるFlaskアプリを設定することにより、Slackスラッシュコマンドを実装しました。
スラッシュコマンドの作成の基本を理解したので、チームが必要とする任意のスラッシュコマンドを実装できます。 データベースからデータを取得したり、他のAPIとやり取りしたり、コードをデプロイするためのコマンドを作成したりするコマンドを作成できます。