Hello Wor.log

IT系大学生4人による備忘録のようなもの

LINE Messaging API + Python + Heroku でLINE Botを作る

こんにちは、CPPXのP1です。
今日は、タイトル通り、LINEのBotPythonで作成する手順を紹介したいと思います。 いくつも記事がありますが、APIの仕様変更が頻繁にあるみたいで、少し古い記事だと上手くいかないことも多いので、いくつかの記事を並行に見つつやっていくのがおすすめです。

LINE側のアカウントの作成

ますは、LINE側のカウントを設定していきましょう。

LINE@MANAGERの登録、アカウント作成

初めに、 http://at.line.me/jp/から、LINE@MANAGERの登録をしましょう。f:id:cppx:20171031124309p:plain ここの「LINE@アカウントを作成する」から、「一般アカウントを作成する」を選択していきましょう。アカウント名とか、業種とかは適当で大丈夫だと思います。

Messaging APIの登録

次に、先ほど作成したアカウントで、MessagingAPIを使用できるようにしていきます。
https://admin-official.line.me/にアクセスして、アカウント一覧が出てくれば大丈夫です。作成したアカウントを選択して、

f:id:cppx:20171031125109p:plain


上の画像のように左のバーから「アカウント設定」→「Messaging API設定」を選択し、 f:id:cppx:20171031125424p:plain プロバイダを自分の名前にして、APIを利用するを選択していきましょう。

https://developers.line.me/console/にアクセスして、作ったアカウントが出てきていたらOKです。
この後もう少し設定をしますが、それはHerokuの設定が終わってからで大丈夫です!

Pythonのコード作成

そして、Pythonのコードを作成していきましょう。とは言っても難しくはなくて、https://github.com/line/line-bot-sdk-pythonにオウム返ししてくれるBotのサンプルがあるので、こちらをコピペしてきてしまいましょう。
コードの理解とかは、とりあえず動くようになってからいじくるときにやっていきましょうね。
一応コード貼っておきます。

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("/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と、line-bot-sdkは忘れずにpip installを!
'YOUR_CHANNEL_ACCESS_TOKEN'と'YOUR_CHANNEL_SECRET'にMessaging APIで与えられたtokenを入れなきゃですが、これはHerokuの環境変数に入れて使いたいので、また後ほど

Herokuのセットアップ

いよいよHerokuの設定をしていきましょう。Herokuの公式ページはここです。登録等はこちらで。この辺は済んでいる前提で進めます!

作成とアドオンの設定

$ heroku create 好きなURL

で「好きなURL.herokuapp.com」が自分のサイトとして作成されますね。
また、詳しい話は割愛しますが、仕様上Herokuのアドオンの「Fixie」を利用します。

$ heroku addons:create fixie:tricycle

で利用を開始できるのですが、Herokuにクレジットカードを登録する必要があります。プリペイドクレジットカード的なものでもいけます!
Herokuのマイページから右上のアイコンの「Account settings」→「Billing」→「Add Credit Card」として登録しておきましょう。残念ながら必須です。ファイト!

LINE側にWebhook URLの指定

LINE側にWebhook URLを指定します。https://developers.line.me/console/から、今回作ったアカウントに行って、中腹あたりの「Webhook URL ※SSLのみ対応」の項目に、Herokuで作ったURL/callbackを指定しましょう。(例:sample.herokuapp.comをcreateしたなら、https://sample.herokuapp.com/callbackを指定)

各種トークンをHerokuの環境変数に登録する

登録するのは、Channel Secretとアクセストークンです。それぞれ先ほどWebhook URLを指定したページにあると思います。

$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列"
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列"

こんな感じで登録できます。もちろん名前は、プログラム側と環境変数で合わせれば何でも構いません。

各種設定ファイルの作成、デプロイ

HerokuでPythonを上手く動かすためにいくつか設定ファイルを作成します。作成するのは、

  • runtime.txt ・・・ Pythonのバージョンを記述する
  • requirements.txt ・・・ インストールするライブラリを記述する(依存関係含めて)
  • Procfile ・・・ どのプログラムをどう実行するかを指定する

の3つです。
記事作成時(2017年10月31日)の情報です!

  • runtime.txt
python-3.6.2
  • requirements.txt
line-bot-sdk==1.5.0
future==0.16.0
requests==2.14.2
Flask== 0.12.2
click==6.7
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==0.23
Werkzeug==0.12.2

pyvenv等でプロジェクトごとにバージョンを管理しているなら、

$ pip freeze > requirements.txt

で準備出来ます。

  • Procfile
web: python main.py

これはPythonのプログラムの名前がmain.pyの場合です。どんな名前でも構いません。

後はデプロイすれば良いので

$ git init
$ git add -A
$ git commit -m "first commit"
$ git push heroku master

みたいな感じでherokuにpushすればOKです!

完成

これで、一通り終了です。LINEのアカウントのページの下部のQRコードから友達に登録して、話しかけてオウム返ししてくれれば成功です!

もしダメなら、

$ heroku logs --tail

でログを見てみましょう。色々な理由で、1発では上手く動かないかもしれません。ファイトです!