
流行りのChatbotはいろいろな可能性を秘めています。流行っているのにはわけがあるのです。今回はSlackというチャットサービス上で、チャットするだけでボットが為替レートを教えてくれるChatbotをPythonで作ってみましょう。
はじめに
以下の以前の記事でChatfuelというサービスを使ったChatbotの作成方法について紹介しました。
これはサービスなのでコーディング無しで簡単にChatbotが作れたわけですが、エンジニアからすると物足りないですよね。ということで、今回はPythonで実際にコーディングしながら、Slackにチャットするだけで為替レートを教えてくれるChatbotを作ってみましょう。
また、Pythonはインストールされている前提で進めます。インストール方法を知りたい人はこちらの記事を参考にして下さい。
Slackに登録する
Slackは仕事でよく使われるチャットサービスです。HipChatなどと比べると後発組になるので、デザインがオシャレで使いやすいです。デスクトップアプリはElectronで作られているのは以前の記事でお伝えしましたね。
それでは、Slackに登録していきましょう。Slackのサイトに行き、「Slackを始める」から「ワークスペースを新規作成」を選択します。ワークスペース名はチームで共有するチャットルームの名前ですが、今回はあなたとChatbotの会話になるので、好きな名前をつければ良いと思います。
後は自分の名前とメールアドレスを登録すれば完了です。チームでの活動を前提とした作りなので他の人を招待するように促されますが、招待はしてもしなくても構いません。
SlackにBotsを登録する
次に、ワークスペースにログインし、「アプリを検索する」をクリックしましょう。
アプリ一覧の検索画面が表示されるので、「bots」と入力して下さい。一番上に出てきたのが今回使う「Bots」というアプリです。「インストール」をクリックしましょう。
続いて「設定を追加」をクリックします。
「ユーザ名」はワークスペースに表示されるChatbot自体の名前になりますので、自由に決めてください。ユーザ名の入力が終わったら「ボットインテグレーションを追加する」をクリックします。
SlackとBotsとのインテグレーションが完了すると、APIトークンが払い出されますので、メモしましょう。後で使います。
これでSlack側の設定は完了です。
slackbotのインストール
今回はSlackのChatbotを実装するためにslackbotを使用します。
それでは、Pythonで仮想環境を作って、インストールしていきましょう。
$ python --version
Python 3.6.0
$ pip --version
pip 9.0.1
$ python -m venv slackbot-env
$ ls
slackbot-env/
$ cd slackbot-env/
$ ls
bin/ include/ lib/ pyvenv.cfg
$ pip install slackbot
これでインストールは完了です。
初期設定をする
インストールが終わったので、初期設定をしましょう。
フォルダとファイルを作る
まずは、今回必要なフォルダとファイルを作成します。
$ mkdir mybot
$ cd mybot/
$ touch slackbot_settings.py
$ touch run.py
$ mkdir plugins
$ cd plugins/
$ touch __init__.py
$ touch exchange_rate_bot.py
$ cd ..
$ tree
.
├── plugins
│ ├── __init__.py
│ └── exchange_rate_bot.py
├── run.py
└── slackbot_settings.py
1 directory, 4 files
設定ファイルを書く
「slackbot_settings」を書きましょう。
このファイルは、プロパティ値を書くためのファイルです。「API_TOKEN」に先程SlackのBotsの「インテグレーションの設定」で確認した「APIトークン」を記載して下さい。「DEFAULT_REPLY」はチャット上でメッセージを受け取った際に取るべきアクションがない場合に返却されるメッセージです。例えばSiriで言うところの「すみません、よくわかりません。」というメッセージのことです。「PLUGINS」は特定のフォルダを指定することで、そのフォルダ内のファイルを自動的に読み込んでくれる設定です。
API_TOKEN = "XXXX-XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXX"
DEFAULT_REPLY = "Sorry I didn't get you"
PLUGINS = ['plugins']
「run.py」を書きましょう。
このファイルは、slackbotを実行するためのスクリプトです。
from slackbot.bot import Bot
def main():
bot = Bot()
bot.run()
if __name__ == "__main__":
print("Slack bot is starting...")
main()
為替レートの取得とメッセージを実装する
それでは、メインのコーディングに入ります。
為替レートを取得するAPIですが、当初は以前使っていたYQLからYahoo!ファイナンスのデータを取得しようと思ったのですが、これは現在は動いていないです。なので、代わりに、FloatRatesのAPIを使います。データの取得は一日2回と書いてあるので、取得頻度が多い場合は向きませんが、今回は今日の為替レートが分かれば良いので、これを使います。
Pythonでコーディング
「exchange_rate_bot」の中身をコーディングしましょう。
ちゃちゃっとコーディングするとこうなります。
from slackbot.bot import respond_to
from slackbot.bot import listen_to
import re
import requests
import json
BASE_URL = "http://www.floatrates.com/"
JPY_URI = "daily/jpy.json"
USD_URI = "daily/usd.json"
CAD_URI = "daily/cad.json"
def getFloatRatesAPI(uri):
floatrates_api_url = BASE_URL + uri
res = requests.get(
floatrates_api_url
)
return res
@respond_to('rates', re.IGNORECASE)
def mention_func(message):
message.reply("Today's exchange rates are ...")
jpy_data = getFloatRatesAPI(JPY_URI).json()
usd_data = getFloatRatesAPI(USD_URI).json()
uca_data = getFloatRatesAPI(CAD_URI).json()
message.reply('[USD/JPY] ' + str(jpy_data['usd']['rate']) + "\n"
+ '[CAD/JPY] ' + str(jpy_data['cad']['rate']) + "\n"
+ '[JPY/USD] ' + str(usd_data['jpy']['rate']) + "\n"
+ '[JPY/CAD] ' + str(uca_data['jpy']['rate'])
)
完成です。
円とアメリカ・ドルのレートと円とカナダ・ドルのレートを取得しています。「@respond_to」にチャットで聞く際のメッセージ(今回は「rates」)を記載し、「message.reply」で返答となるメッセージを設定しています。
Slackでチャットして動作確認する
最後に動作確認をしていましょう。
まずは、run.pyを実行してslackbotを起動します。
$ python run.py
Slack bot is starting...
すると、ワークスペースでmybotの起動を確認できます。
それでは、mybotにチャットしてみましょう。mybotとのチャットページで「rates」と入力すると、今日の為替レートが返却されます。
前から思っていましたが、カナダ・ドルのレートを見ると円高なんじゃないかと錯覚しますよね(笑)アメリカ・ドルと比べてお得感があるというか。
それはさておき、便利なボットなので、チームのみんなにも紹介してあげましょう。ということで、mybotを「#general」に招待します。
すると、「#general」で誰でもmybotに為替レートを聞くことができます。
返却される為替レートの結果は同じになりました。これは、最初に記載した通り、このAPIは一日2回のデータ更新なので、続けて実行しても結果は同じです。
それにしても律儀に毎回教えてくれるなんて、親切なボットができましたね。
最後に
いかがでしたか?Slackを使って為替レートを教えてくれるChatbotは楽しんでいただけましたか?天気予報やニュースと言った便利な情報を取得して教えてくれるボットや、ChatOpsなどのような何かアクションを代わりに実行してくれるようなボットなど、応用する範囲はいろいろあるので、試してみると面白いでしょう。それでは。
環境
- PC : macOS High Sierra 10.13.3
- python : 3.6.0
- pip : 9.0.1
- slackbot : 0.5.1