Ubuntu 16.04でFlaskとPython 3を使用してスラッシュコマンドを記述する方法

前書き

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に短いメッセージが返されます。

uWSGIアプリケーションサーバーを使用してこのFlaskアプリを提供し、リバースプロキシとしてNginxを使用します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

[[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ボタンをクリックします。 次のページが表示されます。

Page for creating 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を見つけます。

The 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と入力します。 次の応答が表示されます。

Slack slash command is successful!

コマンドが失敗したことを示すメッセージを受け取った場合は、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とやり取りしたり、コードをデプロイするためのコマンドを作成することもできます。

Related