(広辞苑より)2017年6月8日木曜日PythonでSlackのボットを作成するTweet職場でSlackを利用している。技術者としては与えられた機能を利用するだけではやはり満足できない。自分好みの道具を作りたい。いうわけで、単なるチャットツールとして使うSlackでは物足りなくなったので、Slackのボット(bot)をPythonで作ってみることにした。APIをPythonから制御してSlackと連携した。今回は、書き込んだ数字を素因数分解するボットを作ってみた。Slack用のボットを利用する準備をする。userのリンクからBotsのページを開く。integrationボタンをクリックする。Tokenが表示されており、ボットのスクリプトでこれを利用する。あとは好みに応じてアイコンの変更やボットの説明を記述しておく。今回のボットでは、デフォルトのフェイスマークに用意してあるロボットのアイコンを使い、説明文は「素因数分解をするよ!」とした。Integrationのボタンをクリックして設定を保存する。ボットの準備ができたら、それをSlackへメンバーとして加える。join...を選択する。先ほど設定したボットがメンバーとして表示されているのでそれを選ぶ。これで下準備は完了だ。次にPythonを使ってボット用スクリプトを作成する。目的は、Slack上で誰かが数字を書き込んだ際に、それを取得して素因数分解をすること。そのためには、Slackに書き込まれた内容を取得しなければならないが、そのためにslackclientというPythonのモジュールを利用する。slackclientpipであれば上記のコマンドでインストールが終わる。手動で導入する場合は、python-slackclientから入れる。素因数分解プログラムをスクラッチから作るのも面倒なので、数論用ライブラリNZMATH(ニジマス)を利用する。これもpipでインストールできる。nzmathさて、ここまでできたらあとはコードを書くだけだ。通信を確立するだけで良い。以下に簡単な例を書いておく。u"こんにちは")こんな感じ。今回のボットの場合、数字を取得してそれを素因数分解する。数字を取得すること自体は上に書いたとおり簡単なのだが、連続して数字が書かれた場合はそれを漏らさないためにキューに保存しておく必要がある。一定時間で解けない分解が難しい合成数などを取得した場合、タイムアウトを設定しなければならない。これらを実現するためにはスレッドを使って並列処理をする必要がある。数字を取得したらキューに入れ、そのキューから別スレッドのworkerスレッドが処理を行う。workerスレッドはキューから数字を一つ取り出し、それの素因数分解を試みる。この時にタイムアウトを考慮するので、この素因数分解を行う関数についてもスレッドを利用する。そのスレッド内で時間を測り、計算が終了しないまま一定時間が過ぎたら処理を強制終了する。実行方法はネットにつながっているPCから以下のコマンドを実行するだけ。./prime_decomposition_bot.pyそして、実際のSlack上の画面は以下のようになる。今回書いたコードは以下の通り。今回は素因数分解をするボットだったが、これをベースに作り変えれば大抵のことはできると思う。Engineメッセージボード*当ブログに関する意見や要望などにお使いください。Googleアカウントでログインすることで書き込みができます。Twitterへの送信を同時に行うこともできます。ストリートビューで散歩*Googleマップのストリートビューを利用して散歩をするWebアプリです。ストリートビューとマップを分割してマーカーを視界タイプに変更することで使いやすくしてあります。APIを利用したグラフ・チャート作成ウェブアプリです。クリック一つで簡単にグラフを作成できます。ブログ記事への貼り付けなどにどうぞ。OpenIDテスト*OpenIDによるログインのテストを行います。mixiであればクリック一つで、他のOpenIDアカウントであればそのURLを入力することでテストできます。一言コメント表示機能付きです。HTML文字変換*テキストで使われているHTML特殊文字をウェブで表示できるようにするための文字変換ウェブアプリです。プログラムのソースコードなどをブログ記事に貼り付けるときなどに便利です。短縮URLチェッカー*フィッシングサイト判別機能付き短縮URLチェッカーです。テキストボックスに変換したいURLを入力すればbit.lyの短縮URLが表示され、bit.lyの短縮URLを入力すればもとのURLが表示されます。展開されたURLがリンク付きで表示されますが、もしフィッシングサイトの疑いがある場合は警告が表示されます。Trendsの急上昇ワードをランキング順に表示します。Googleでのキーワード・画像検索やWikipediaによる用語の説明もあります。※GoogleがAPIの提供を終了したため、現在停止中です。自己紹介noxゲームを楽しむだけの余裕と感性は失いたくないnoxです。