序章

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 で、開発ワークスペースを選択します。

次に、緑色のアプリの作成ボタンをクリックします。

アプリが作成されたら、スラッシュコマンドをクリックし、新しいコマンドの作成ボタンをクリックします。 次のページが表示されます。

Page for creating new command.

このチュートリアルでは、/slashというコマンドを作成します。このコマンドは、HTTPPOSTを介してhttp://server_domain_or_IP/slashのリクエストURLにデータを送信します。 そのため、次の情報を入力してください。

  • コマンドフィールドに/slashを入力します。
  • リクエストURLには、http://your_server_ip_or_domain/slashと入力します。
  • 簡単な説明には、DigitalOcean Slack slash commandと入力します。

次に、緑色の保存ボタンで、スラッシュコマンドの作成を終了します。

次に、アプリのインストールリンクをクリックして、アプリをワークスペースにインストールします。 緑色のアプリをワークスペースにインストールボタンを押します。 次に、緑色の承認ボタンを押します。

これで、開発SlackワークスペースにSlackアプリを作成してインストールしましたが、スラッシュコマンドを処理する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が提供するコマンドに関連付けられた検証トークンを使用してスラッシュコマンドを検証する必要があると記載されています。

この検証トークンは秘密にしておく必要があるため、バージョン管理下にない.envファイルという新しいファイルに保存します。 python-dotenv パッケージを使用して、.envのキーと値のペアを環境変数としてエクスポートし、myproject.pyでそれらの環境変数にアクセスします。

まず、次のコマンドを実行してPython仮想環境をアクティブ化します。

  1. source myprojectenv/bin/activate

virtualenvがアクティブ化されていることを確認するには、Bashプロンプトの左側に(myprojectenv)が表示されます。 検証トークンなどのシークレットは、バージョン管理下に保存しないでください。 これを実現するために、シークレットを環境変数としてエクスポートするpython-dotenvパッケージを使用します。 pipを使用して、python-dotenvパッケージをインストールします。

  1. pip install python-dotenv

nanoまたはお気に入りのテキストエディタを使用して、.envファイルを作成します。

  1. nano .env

https://api.slack.com/appsにアクセスして確認トークンを取得します。 DigitalOcean Slackスラッシュコマンドアプリをクリックしてから、基本情報をクリックします。 次に、検証トークンを見つけます。

The verification token

トークンの値をコピーして.envファイルに配置し、VERIFICATION_TOKENという環境変数に値を割り当てます。

〜/ myproject / .env
VERIFICATION_TOKEN=your_verification_token

ファイルを保存して、エディターを終了します。

Flaskアプリを開発しているときは、アプリに変更を加えたときにuWSGIサーバーを自動的にリロードする必要があります。 これを行うには、まずエディターでmyproject.iniを開きます。

  1. nano myproject.ini

この行をファイルの最後に追加して、touchまたはmyproject.pyでFlaskアプリを変更したときにuWSGIが自動的に再ロードされるようにします。

〜/ myproject / myproject.ini
...

touch-reload = myproject.py

ファイルを保存して、エディターを終了します。

次に、slashコマンドによって送信された情報を受信して処理し、Slackに適切な応答を返すFlaskアプリを作成します。

ステップ3–フラスコアプリを作成する

Slackで/slashコマンドを呼び出すと、Slackはサーバーにリクエストを送信します。 URL /slashをヒットするようにコマンドを構成したので、そのエンドポイントに応答するように作成したFlaskアプリを変更します。

エディタでmyproject.pyを開きます。

  1. 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コマンドが成功しました!」というテキスト応答を送信して、Slackslashコマンドに応答するように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サービスを再起動して、コードの最新バージョンが実行されていることを確認します。

  1. sudo systemctl restart myproject

次に、スラッシュコマンドをサポートするようにNginx構成を変更しましょう。

ステップ4–コマンドを提供するようにNginxを構成する

リクエストURLはhttp://server_domain_or_IP/slashであるため、Nginxサーバーブロックのlocationの値を/から/slashに変更する必要があります。

エディターでファイル/etc/nginx/sites-available/myprojectを開きます。

  1. 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構成ファイルで構文エラーを確認します。

  1. sudo nginx -t

Nginx構成ファイルに構文エラーがない場合は、Nginxサービスを再起動します。

  1. sudo systemctl restart nginx

開発用のSlackワークスペースにアクセスし、任意のチャネルに/slashと入力します。 次の応答が表示されます。

Slack slash command is successful!

コマンドが失敗したことを示すメッセージを受け取った場合は、myproject.pyのコードで構文エラーや問題がないか再確認してください。 その後、再試行してください。

最後に、コマンドの開発が完了したら、Python仮想環境を非アクティブ化して、将来のPythonコマンドがシステムPythonインタープリターを使用できるようにします。

  1. deactivate

これで、/slash slashコマンドから情報を受け取り、Slackに応答を返すFlaskアプリが正常に作成されました。

サーバーとSlack間の通信を安全にするには、リクエストURLにHTTPSを使用して、slashコマンドの接続を暗号化します。 これを行うには、Let’sEncryptによって発行された無料のSSL証明書をNginxサーバーにインストールします。 完了したら、必ずSlackアプリのURLを変更し、http://https://に変更してください。

結論

このチュートリアルでは、uWSGIアプリケーションサーバーとNginxリバースプロキシサーバーによって提供されるFlaskアプリを設定することにより、Slackスラッシュコマンドを実装しました。

スラッシュコマンドの作成の基本を理解したので、チームが必要とする任意のスラッシュコマンドを実装できます。 データベースからデータを取得したり、他のAPIとやり取りしたり、コードをデプロイするためのコマンドを作成したりするコマンドを作成できます。