#はじめに
株式会社サイシードのサマーインターンシップに参加してLINE Chatbotを開発してきました。2016/9/29にLINEから公式版のMessaging APIが発表されたので、今回は公式版のほうで自動応答してくれるbotを作成しました。
この記事は
[LINE Messaging APIとPythonを使ってChatbotを作ってみた(1)]
(http://qiita.com/Kosuke-Szk/items/eea6457616b6180c82d)
の続きとなっています。今回はサーバー構築とWebhook URL登録について記載していきます。
#ソースコード
githubにソースコードを公開しています。
https://github.com/Sciseed/yukko-line-bot
#開発環境
・MAC OS X 10.10.3
・Python 3.4.0
・Django 1.8.14
#必要なもの
.herokuアカウント
・heroku toolbelt
・virtualenv
#djangoで空アプリを作成
####アプリ用ディレクトリ作成
$ mkdir bottest
$ cd bottest
####仮想環境構築
$ virtualenv virenv
$ source virenv/bin/activate
####django-toolbeltをインストール
$ pip install django-toolbelt
####Djangoプロジェクトを作成
$ django-admin.py startproject bottest
####Djangoアプリを作成
$ cd bottest
$ python manage.py startapp bot
####gunicornの設定
django-toolbeltの中にgunicornが入ってるのでそれを用います
``
####Procfileの作成
アプリの一番上の階層にProcfile(拡張子なし)を作成し、以下の内容を記載します
web: gunicorn bottest.wsgi bot:app --log-file -
####pythonのバージョン指定
runtime.txtというテキストファイルをProcfileと同じ階層に作成し、以下のように記載します。
python-3.4.0
これでherokuでアプリを動かす際にpythonのバージョンが認識されます(3.X系では必須の作業)
####ローカルサーバーを起動してみる
$ python manage.py runserver
今回の仕様では外部のAPIを通じてメッセージデータをやり取りするだけなので、内部でデータを保持する必要はなく、データベースを使用していません。なので、migrationを要求されますが不要です。
http://127.0.0.1:8000/
にアクセスして動作確認します。
#herokuにデプロイ
git管理を行う
$ git init
$ git add .
$ git commit -m "Initial commit"
herokuにリポジトリを作成
$ heroku create [アプリ名]
herokuへデプロイ
$ git push heroku master
デプロイされたかチェック
$ heroku open
#Webhook URLをテストする
herokuアプリケーションのURLをwebhook URLに打ち込んでverifyを通します。(テストの時点ではアプリ自体はリクエストに何も処理をほどこさないようにしたほうがいいです)
失敗した時はエラーステータスが通知されます。成功した時はなにも表示されません。
この時
heroku logs -t
でログを表示させておくことで、verifyのPOSTメソッドがどう処理されてるか確認できます。HTTPステータスで200が返って来たら成功です。
#LINEクライアントからテスト
LINEアプリからbotに向かって話しかけてみます。
成功していればherokuのlogからPOSTメソッドと共にテキストメッセージが投げられているのが確認できるはずです。
#ハマったとこ
・csrfでPOSTリクエストがずっとはじかれてた
djangoではCSRF(Cross site request forgeries)攻撃からwebアプリを守るために対策が施されています。ざっくり言うと、正規ルート以外のPOSTリクエストは受け付けませんよっていう機能です。これのためにたとえばcurlでアプリにPOSTを投げても、もちろんLINEからverifyを通そうとしてもエラーが返って来ます。
今回はテストなので一時的にcsrf防御をオフにします
MIDDLEWARE_CLASSES = [
...
'django.middleware.csrf.CsrfViewMiddleware', #<=ここをコメントアウト
...
]
・LINE APIのverifyを通す時、始めからリクエストに処理を加える実装をしていたので、LINEからリクエストを投げてもエラーが戻り続けて苦しみました。(LINEのレスポンス形式指定に則ったレスポンスを返せてなかった)
なのでテストの時はリクエストの処理部分は実装せず、POSTリクエストの受け取りと、それに対するシンプルなレスポンスだけをログで眺めてるのがいいです。
・LINE APIにリクエストを投げたときにヘッダーの形式を間違えていたために苦労しました。(正しく辞書形式で送信できていませんでした。)エラーが返ってくるときはヘッダーやボディが正しいフォーマットで記載されているかも確認してみてください。
#参考
たった5分でDjangoアプリをherokuにデプロイする方法
Rubyに負けるな!HerokuでPython(Django)動かす方法