Flask

Python初心者がたったの3日間でチャットボットを作った【0日目】

3日間でチャットボットをつくる挑戦の記録。
今回は0日目。
まずは準備から。

本記事の構成

この記事の構成は以下の通り。

  1. スタートライン
  2. 必要な環境
  3. LINE developersに登録
  4. Flaskでアプリケーションを作る
  5. Herokuにデプロイ!
  6. 設定
  7. 使ってみる
  8. まとめ

スタートライン

これから3日間でチャットボット作成に挑戦するにあたり、現在の私のスキルと使用する環境について記録しておく。

①現在のスキル
使用言語:Python
レベル:独学。本格的に勉強を始めてから4ヶ月。
制作経験:
・Flaskを使ったシンプルなスクレイピングアプリ。Herokuにデプロイ経験あり。
・Djangoを用いたWEBサイト。Herokuにデプロイ経験あり。
・チャットボットは全くの未経験。1から勉強。
その他スキル:
・WEB言語を使ったサイト構築経験。
・基本情報技術者試験50~60点程度のITリテラシー。
・プログラミング歴1年。

②環境
OS:Ubuntu18.04
言語:Python3.6.5
フレームワーク:Flask
サーバー:Heroku
チャットアプリ:LINE

必要な環境

今回詳細は割愛するが、LINEとHerokuのアカウントが必須。
HerokuCLIも必要。
Flaskアプリのデプロイ知識

HerokuへのFlaskアプリのデプロイに関しては、
初心者のためのFlaskアプリ開発
を参照。

LINE developersに登録

チャットボット作成のためにはLINE developersへの登録が必要になる。
登録は以下のリンクから。

Messaging API

ドキュメントもこのページから見られる。
登録自体は、LINEアカウントさえ持っていれば非常に簡単。

詳しい登録方法はこのサイトが参考になる。

PythonでLine botを作ってみた

登録が完了したら、自分のプロバイダを作成する。
今回は、カエデという名前のプロバイダを作成した。

Flaskでアプリケーションを作る

コードは基本的にこちらのgithubのサンプルコードをほぼ丸パクリした。
line-bot-sdk-python/examples/flask-echo/

とりあえず動くものを作ってから勉強することにする。
こちらのサンプルコードはLINE公式のもので、ドキュメントからも開くことができる。

今回はHeroku上にデプロイするため、一部のコードを修正して利用した。
具体的には、app_with_handler.pyの名前をapp.pyに変更して、以下のコードに変更した。

  from flask import Flask, request, abort

  from linebot import (
      LineBotApi, WebhookHandler
  )
  from linebot.exceptions import (
      InvalidSignatureError
  )
  from linebot.models import (
      MessageEvent, TextMessage, TextSendMessage,
  )
  import os

  app = Flask(__name__)

  #環境変数取得
  YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
  YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

  line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
  handler = WebhookHandler(YOUR_CHANNEL_SECRET)

  @app.route("/")
  def hello_world():
      return "hello world!"

  @app.route("/callback", methods=['POST'])
  def callback():
      # get X-Line-Signature header value
      signature = request.headers['X-Line-Signature']

      # get request body as text
      body = request.get_data(as_text=True)
      app.logger.info("Request body: " + body)

      # handle webhook body
      try:
          handler.handle(body, signature)
      except InvalidSignatureError:
          abort(400)

      return 'OK'


  @handler.add(MessageEvent, message=TextMessage)
  def handle_message(event):
      line_bot_api.reply_message(
          event.reply_token,
          TextSendMessage(text=event.message.text))


  if __name__ == "__main__":
      app.run()

また、gunicornを用いてHeroku上で動かすため、Procfileを以下のように修正した。

  web: gunicorn app:app

Herokuにデプロイ!

Flaskアプリのデプロイ方法はこちらの記事でまとめたのと同じ。
初心者のためのFlaskアプリ開発④ FlaskアプリをHerokuにデプロイ!

相変わらずデプロイでエラーが出た。
タイプミスに要注意。

今回でたエラーはエラーコードH14:No web dynos running
何が原因かと思ったら、Procfileの記述ミスだった。

正しくは、

  web: gunicorn app:app

であるところを、

  web:gunicorn app:app

と書いたらこのエラーが起きた。
わかりづらいが、”web:”のあとのスペースが必須だったようだ。
同様のエラーが出た人は参考にしてほしい。

設定

ここで、2つ重要な設定をする必要がある。
1つめは、環境変数の設定。
2つ目はWebhookの設定だ。

まず、環境変数の設定。

  
heroku config:set YOUR_CHANNEL_SECRET="" --app 
heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="" --app

チャンネルの秘密鍵とアクセストークンをHerokuに渡す必要がある。
チャンネルの秘密鍵とアクセストークンは、自分のプロバイダのページから参照できる。

もう一つはWebhookの設定。
こちらも同じく自分のプロバイダのページで設定する。

Webhook送信:利用する
Webhook URL:https://<アプリケーション名>.herokuapp.com/callback

と変更すればOK。
これでチャットボットが使用できるはずだ。

使ってみる

実際に使ってみた。

これが第一歩。
これから3日間でチャットボットを完成させる。
現状は完全にブラックボックスなので、勉強することだらけで大変だ。

困ったことにPythonでのLINEbotの開発は、あまりリソースが多くなさそうだ。

まとめ

社会人になってから初めての連休(3日!笑)を活用して何かアプリを一つつくりたいと思って始めた今回の企画。
連休は明日からだけど、とりあえず全体像を知ろうと思い、チュートリアル的にチャットボットを作ってみた。
予想外にリソースが少ないのと、何をどうしたら動くのか全く知識がない状態であることから、苦戦が予想されるものの、ちょっと頑張ってみようと思う。