ビジネス用メッセージングアプリのSlackが便利だ。Slackを使うとプロジェクトごとの専用スペースに情報を集約できる。筆者が特にSlackが便利だと感じているのが、自作コマンドを簡単に自作できる点にある。今回はPythonと格安レンタルサーバーを活用して、自作Slackコマンドを作ってみよう。
Slackについて
Slackはビジネス向けのメッセージングアプリだ。チャット機能に加えて、ファイル管理、検索機能など、社内コミュニケーションの円滑化に役立つ機能を備えている。こちらに分かりやすく基本的な使い方が書かれている。これからSlackを始めてみようという方は確認してみると良いだろう。
なお、基本的にはLINEなどのコミュニケーションアプリと大きな違いはないが、外部のWebサービスと連携する機能が豊富なのが特徴だ。そして、プログラマーにとってのメリットだが、とても簡単に独自コマンドを作成できる点にある。さっそく自作コマンドの作成に挑戦してみよう。
3ステップでできる独自スラッシュコマンド
Slackには「スラッシュコマンド」という機能がある。チャット画面で「/コマンド名」と書くことで手軽にそのコマンドを実行できるのだ。例えば、Googleカレンダーをアプリに追加しておけば「/gcal today」とコマンドを打つだけ。その日の予定を取得してチャット画面に表示してくれる。
実際、既に有名アプリと連携するさまざまなコマンドが最初から用意されているので、基本的に困ることはない。しかし、自作コマンドを作るなら、プロジェクト進行に役立つ機能をSlackに追加できる。さっそく作ってみよう。
独自スラッシュコマンドの作成は、次の3ステップで行う。
- (1)Slackアプリ作成ページでアプリ(コマンド)を登録
- (2)アプリをチャンネルに追加
- (3)指定したURLにプログラムを配置
いずれも簡単なので、一つずつ試してみよう。ここでは、最も簡単な挨拶するだけのコマンドを作ってみよう。なお、Pythonが動く格安レンタルサーバーを用意しておく必要がある。詳しくは、本連載の43回目「Pythonを使ったWebサイトは百円で運用できる」で紹介している。
手順1:Slackアプリ作成ページでアプリを登録しよう
Slackのワークスペースにサインインしたら、こちらのアプリの作成ページを開こう。そして、適当にアプリの情報を指定しよう。アプリの作成ページは日本語化されていないが、いずれも簡単な英語しか使われていないので挑戦してみよう。
まず、アプリ作成ページにアクセスすると、英語で「From scratch(ゼロから作る)」と「From an app manifest(マニフェストから作る)」の選択肢が出る。ここでは、「From scratch」を選択しよう。
次に、「Name app & choose workspace」の画面がでるので、ここでは、アプリ名を指定して、ワークスペースを選択しよう。ここでは「hello」という名前にした。そして「Create App」ボタンを押そう。
すると、英語で「Building Apps for Slack(Slackのためのアプリ構築)」という管理画面が表示される。ここでは、「Slash Commands」というリンクを探してクリックしよう。
どんなコマンドを作るのかを指定する画面が出るので、ここでは、Commandに「/hello」を指定しよう。次のRequest URLには手順3でプログラムを配置するWebサイトのURLを指定しよう。このURLは後から変更可能だ。最後に[Save]ボタンを押そう。
手順2:アプリをワークスペースに追加
アプリを作成したら、作成したアプリをどのワークスペースに追加するのかを指定しよう。「Building Apps for Slack」にある「Install to Workspace(ワークスペースにインストール)」のボタンをクリックしよう。あるいは、画面左側のメニューから「Install App」をクリックしよう。
次に、アプリをワークスペースにインストールして良いか許可を求める画面が出るので「許可する」のボタンをクリックしよう。インストールが無事行われると、OAuth認証のためのトークンが表示される。(なお、今回は特に認証を利用しないのでこのトークンを使うことはないが、認証が必要なアプリを作る場合には必要な情報なのでメモしておく必要がある。)
手順3:CGIプログラムを作ってアップロード
次に、手順(2)で指定したURLに自作プログラムをアップロードしよう。今回は挨拶をするだけなので、以下のような簡単なPython CGIのプログラムを作る。FTPツールなどを使って、サーバにアップロードしよう。
#!/usr/local/bin/python3.7
# ↑ Pythoのパスは書き換えが必要
# ライブラリの取り込み --- (*1)
import os, sys, io, cgi
sys.stdin = open(sys.stdin.fileno(), 'r', encoding='UTF-8')
sys.stdout = open(sys.stdout.fileno(), 'w', encoding='UTF-8')
sys.stderr = open(sys.stderr.fileno(), 'w', encoding='UTF-8')
out = lambda msg: print(msg, end="\r\n")
# /hello に続く文字列を得る --- (*2)
form = cgi.FieldStorage()
text = 'test'
if 'text' in form: text = form['text'].value
# ヘッダとコンテンツを出力 --- (*3)
out("Content-Type: text/html; charset=utf-8");
out("") # ヘッダと本文は空行で区切るのが決まり
out("Hello, " + text + "!")
なお、アップロードに際して注意点がいくつかある。チェックしたいポイントは次の点だ。
まず、自作プログラムの1行目には、Pythonのインストールパスを指定する必要がある。サーバごとにインストールパスが異なるので、契約したサーバのマニュアルを確認してみよう。ちなみに、格安レンタルサーバのロリポップを使う場合には、契約時期や契約プランによって、Pythonのバージョンやインストールパスが異なるので、自分が割り当てられているサーバ名を確認して変更しよう。
また、ファイルをアップロードした後、CGIファイルのパーミションを変更する必要もあるが、これもサーバごとに異なるのでマニュアルを確認しよう。加えて、テキストエディタでプログラムを保存する際、改行コードは、Windows標準のCR+LFではなく、Linux標準のLFで保存する必要がある。そして文字エンコーディングにはUTF-8を指定しよう。CGIのプログラムが動かない多くの理由は、改行コードと文字エンコーディングが問題であることが多いので気をつけよう。
プログラムを詳しく見てみよう。これは至って普通のPython CGIのプログラムだ。(*1)の部分で基本的なライブラリの取り込みを行う。そして、(*2)ではSlackから送信されたコマンドを受け取る処理を記述している。なお、Slackのスラッシュコマンドで「/hello abcd」を送信した場合、CGIのPOSTメソッドのtextというパラメータに「abcd」が得られる仕組みとなっている。
そして、(*3)の部分では、Slackに返信するメッセージを作成している。CGIを作る場合、最低Content-Typeヘッダが必要だ。そのため、Content-Type: text/htmlを返信したら空行を入れる。その後で実際に送信したいコンテンツのデータを記述する。
なお、ここでは、プログラムの(*2)で受け取ったパラメータを受け取って、「Hello, abcd!」のような文字列を返信するだけの簡単なプログラムにした。実際には、この部分を何かしらの役立つデータなどに差し替えれば、役立つコマンドになるだろう。
実行してみよう
それでは、実行してみよう。「/hello」とだけ送信した場合「Hello, test!」と返し、「/hello wold」と送信した場合には「Hello, world!」とSlackの画面に表示される。
もしも、うまくアプリがワークスペースに追加されなかったときは、手動でアプリを追加しよう。アプリを追加するには、チャット画面の左側のAppから[+ アプリを追加する]から追加できる。
また、アプリがうまく動いてない場合には、Slackからではなく、Webブラウザを使って、プログラムを設置したURLにアクセスしてみて「Hello, test!」と表示されることを確認しよう。
改良してみよう - 数値の合計コマンド
挨拶をするだけでは面白くないので、カンマで区切った数値を合計するだけのコマンドを紹介しよう。例えば「/sum 100,500,50」と書くと数値を合計して650のように結果を返すというコマンドだ。上記のプログラム(*2)をちょっと書き直すだけで実現できる。
プログラム全体で22行だが、ほとんど同じなので、こちらに配置した。
まとめ
試してみると思ったよりも簡単に自作コマンドが作れるので楽しい。対話的なプログラムを作るには、ちょっとコツが必要になるものの、今回見たようにパラメータに応じて簡単な処理を実行するだけならとても簡単だ。アイデア次第でいろいろ作れるので試してみよう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。