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

FlaskでLINE botを実装し,herokuにdeployするまで

More than 1 year has passed since last update.

はじめに

注:2017/9/21にLINE Business centerが廃止され,Messaging API関連の設定コンソールがLINE Developersに一元化され簡単に行えるようになりました

PythonのWebアプリケーションフレームワークであるFlaskを使ってLINE botを構築します.
ここでは一通りの流れを記述するため,構築するLINE botはユーザから送信されたメッセージをオウム返しするだけとします.
ローカルで構築・テストしたbotはherokuへdeployします.
参考にしたサイト等は末尾に列挙しています.

開発環境

  • Mac OS Sierra
  • Homebrew 環境構築済み
  • Python 環境構築済み
  • LINEの個人アカウントを持っている

LINE Developersでの設定

チャネルの作成

公式のチュートリアルが詳しいので,これに従って設定を行ってください.
Messaging APIを利用するには - LINE Developers

  1. LINE DevelopersでBOT用チャネルを作成
  2. プランはDeveloper Trialとフリーの2種類ありますが,Push APIの有無と友達登録数50人の上限を天秤にかけて選んでください.

plan.png
プランの詳細は以下から.
プラン・料金 - LINE@でファン獲得!無料アプリで簡単に始めるビジネスLINE

コンソールの設定

こちらも公式のチュートリアルが充実してます.
ボットを作成する - LINE Developers
以前はMessaging APIを設定する場所が複数箇所に分かれていたのですが,
現在ではLINE Developersのコンソールから簡単に設定できます.
今後もこのコンソールから各種設定をします.

  1. 作成したチャネルの基本設定から,メッセージ送受信設定 -> Webhook送信を利用するにチェック
  2. 同じく基本設定から,メッセージ送受信設定 -> アクセストークンを発行
  3. 基本設定にあるChannel Secretと発行したChannel Access Tokenを控えておく

Flaskを使ってLINE botを作成

まずはローカル環境で一通り開発します.
Flaskのdevelopment serverで実行したあと,一時的にngrokで外部に公開しテストします.
LINEのプラットフォームにngrokのURLを登録し,メッセージをローカルのFlaskで処理するためです.

環境構築

Flask・SDK of the LINE Messaging API for Python・ngrokをインストールします.
Python環境をanacondaで構築している人は元からFlaskが入っていると思います.

$ pip install flask 
$ pip install line-bot-sdk
$ brew install ngrok
$ pip install gunicorn % optional

サンプルプログラムの作成

line-bot-sdk-pythonのサンプルプログラムを実行してみましょう.
https://github.com/line/line-bot-sdk-python
上記URLのUsageにあるサンプルプログラムをapp.pyとして保存します.
下記のapp.pyではデバッグのためにhello_worldを追加しています。
LINE Developersの設定で控えたChannel SecretとChannel Access TokenをYOUR_CHANNEL_SECRETとYOUR_CHANNEL_ACCESS_TOKENに書きます.
(本来なら環境変数に持たせるなどするべきですが,一旦ここではこのまま実行します.)

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,
)

app = Flask(__name__)

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()

Flaskの実行とngrokによる公開

Flaskのdevelopment severの実行

app.pyのあるディレクトリに移動して,以下のコマンドを実行

$ export FLASK_APP=app.py
$ export FLASK_DEBUG=1
$ flask run --host=0.0.0.0

ブラウザで http://localhost:5000 にアクセスしhello world!と出ればOK.

ngrokによる外部への公開

Flaskでプログラムが問題なく起動したら,ngrokを実行し外部へ一時的に公開しましょう.
以下のコマンドを実行してテストします.

$ ngrok http 5000

Forwarding https://[乱数].ngrok.com -> 0.0.0.0:5000
と表示されているURLをメモっておきます.

webhook URLの登録

LINE developersのコンソールにアクセスし,チャネルの基本設定ページに行きます.
そこでWebhook URLに先程ngrokで取得したhttpsのURLを登録します.
ただし https://[乱数].ngrok.com/callback としてください.
サンプルプログラムでは/callbackにきたpostリクエストを処理するようになっているので.

オウム返しの確認

作成したbotと友達になり,適当にメッセージを送ってみましょう.
以下のようにオウム返ししてくれば一旦は完成です.

LINE botをherokuにdeploy

ローカルで作ったbotをherokuにdeployします.
herokuでの最適な開発フローは模索中ですが自分用メモとして公開します.

herokuに登録

まだherokuに登録してない人は以下から登録します.
Cloud Application Platform | Heroku

登録後,ターミナルからherokuを操作するためheroku-cliをインストールし,ログインしておきます.

$ brew install heroku/brew/heroku
$ heroku login

heroku用ファイル準備

以下のファイルをapp.pyと同じディレクトリ内に作成します.
app.pyも環境変数からchannel secret等を読み込む用に書き換えます.
Pythonのversionやrequirements.txtの内容などは適宜読み替えてください.
(本来ならvirtualenvしてpip freezeすべきですが・・・)

  • app.py
    • flaskの実行ファイルです.
  • .gitignore
    • gitignore
  • .env
  • Procfile
    • heroku上で実行するコマンドを書く.
  • requirements.txt
    • pipでインストールしたライブラリの管理.
    • ここに書かれたライブラリ(version)がheroku上でもインストールされる.
  • runtime.txt
    • pythonのversionを書く.
app.py
import os
import sys
from flask import Flask, request, abort

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

app = Flask(__name__)

# 環境変数からchannel_secret・channel_access_tokenを取得
channel_secret = os.environ['LINE_CHANNEL_SECRET']
channel_access_token = os.environ['LINE_CHANNEL_ACCESS_TOKEN']

if channel_secret is None:
    print('Specify LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_access_token is None:
    print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(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()
.gitignore
.env
__pycache__
.env
LINE_CHANNEL_SECRET=hogehoge
LINE_CHANNEL_ACCESS_TOKEN=fugafuga
Procfile
web: gunicorn app:app --log-file -
requirements.txt
Flask==0.12.2
gunicorn==19.6.0
line-bot-sdk==1.3.0
runtime.txt
python-3.5.2

herokuにdeploy

gitを使ってherokuにdeployします.

$ cd path/to/your/linebot/directory
$ git init
$ git add . 
$ git commit -m "first commit Yeaahhhh"
$ heroku create [Your bot name] % http://[your bot name].herokuapp.com/ になる.指定しないとランダム文字列.
$ git push heroku master

dynoの数を1にし,
LINE messaging APIのChannel secret等はherokuの環境変数に持たせます.

$ heroku ps:scale web=1
$ heroku config:set LINE_CHANNEL_SECRET=hogehoge
$ heroku config:set LINE_CHANNEL_ACCESS_TOKEN=fugafuga

heroku openでhello world!を確認できればOKです.

$ heroku open

最後に先程と同様にLINE developersのコンソールにアクセスし,
Webhook URLにherokuのアドレスを登録すればbotの完成です.
(登録するのは,https://[your bot name].herokuapp.com/callback )

herokuでよく使うコマンド

$ heroku logs % logの確認
$ heroku open % ブラウザでherokuのappのURLを開く
$ heroku run ls
$ heroku run python

参考

suigin
社会人
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
ユーザーは見つかりませんでした