WhatsappのChatbotを作ってみる
日本語の情報だと、LINEのChatbotは多く検索できるが、WhatsappのChatbotはあまり出てこないのでまとめてみた。Pythonで作っているが、コードはほぼコピペしている。
参考にした、というかトレースしたサイトは、https://www.twilio.com/blog/build-a-whatsapp-chatbot-with-python-flask-and-twilioである。まだFlaskのフレームワークとか、Twilioのサービスとか全く知らないままに書いている。
ここで作るのは、Whatsappで特定の番号に、quoteという単語の入ったメッセージを送ると、ランダムに何か有名な引用句が返信され、catという単語が入っていると、ランダムで猫の画像が返信されるというもの。
まずはTwilioに登録する必要がある。https://www.twilio.com/からアカウント登録を行う。登録が終われば左上のメニューからProgrammable Messagingを選び、Try it Out, Try WhatsAppをクリックする。すると、SandboxのナンバーとJoinコードが表示される。
自分のWhatsappアカウントとSandboxを関連付けるために、このSandboxの番号にJoinコードを送る。Whatsappから新しい連絡先としてこの電話番号を登録し、そこにjoin ****-***と送信すると、メッセージの送受信を開始できることを示す返信がTwilioから届く。
ここからはPythonでの仕事。例に沿ってChatbot用にディレクトリを作成し、その中に仮想環境を作成する。そこにChatbotに必要なPythonパッケージをインストールしていく。
自分の場合はAnaconda promptで、
$ mkdir whatsapp-bot $ cd whatsapp-bot
$ conda create -n whatsapp-bot
$ conda info -e (仮想環境の確認)
$ activate whatsapp-bot$ pip install twilio flask requests
from flask import Flask, request import requests from twilio.twiml.messaging_response import MessagingResponse app = Flask(__name__) @app.route('/bot', methods=['POST']) def bot(): incoming_msg = request.values.get('Body', '').lower() resp = MessagingResponse() msg = resp.message() responded = False if 'quote' in incoming_msg: # return a quote r = requests.get('https://api.quotable.io/random') if r.status_code == 200: data = r.json() quote = f'{data["content"]} ({data["author"]})' else: quote = 'I could not retrieve a quote at this time, sorry.' msg.body(quote) responded = True if 'cat' in incoming_msg: # return a cat pic msg.media('https://cataas.com/cat') responded = True if not responded: msg.body('I only know about famous quotes and cats, sorry!') return str(resp) if __name__ == '__main__': app.run()
(whatsapp-bot-venv) $ python bot.py * Serving Flask app "bot" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit