Help us understand the problem. What is going on with this article?

LINE Messaging APIとPythonを使ってChatbotを作ってみた(2)~サーバー編~

More than 3 years have passed since last update.

はじめに

株式会社サイシードのサマーインターンシップに参加してLINE Chatbotを開発してきました。2016/9/29にLINEから公式版のMessaging APIが発表されたので、今回は公式版のほうで自動応答してくれるbotを作成しました。
この記事は
LINE Messaging APIとPythonを使ってChatbotを作ってみた(1)
の続きとなっています。今回はサーバー構築と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と同じ階層に作成し、以下のように記載します。

runtime.txt
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を通します。(テストの時点ではアプリ自体はリクエストに何も処理をほどこさないようにしたほうがいいです)
image
失敗した時はエラーステータスが通知されます。成功した時はなにも表示されません。

この時
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防御をオフにします

settings.py
    MIDDLEWARE_CLASSES = [
                 ...
    'django.middleware.csrf.CsrfViewMiddleware', #<=ここをコメントアウト
                 ...
]

・LINE APIのverifyを通す時、始めからリクエストに処理を加える実装をしていたので、LINEからリクエストを投げてもエラーが戻り続けて苦しみました。(LINEのレスポンス形式指定に則ったレスポンスを返せてなかった)
なのでテストの時はリクエストの処理部分は実装せず、POSTリクエストの受け取りと、それに対するシンプルなレスポンスだけをログで眺めてるのがいいです。
・LINE APIにリクエストを投げたときにヘッダーの形式を間違えていたために苦労しました。(正しく辞書形式で送信できていませんでした。)エラーが返ってくるときはヘッダーやボディが正しいフォーマットで記載されているかも確認してみてください。

参考

たった5分でDjangoアプリをherokuにデプロイする方法
Rubyに負けるな!HerokuでPython(Django)動かす方法

sciseed
AI・RPAを活用した業務効率化ソリューション『sAI Chat』『sAI Search』を提供するITベンチャー
https://saichat.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした