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

PythonでLINEの「Messaging API」でテンプレートメッセージを実装してみた

More than 1 year has passed since last update.

LINEの「Messaging API」は、一度は使ってみたいと思ったことがあるんじゃないでしょうか。
自作サービスと違って、完璧に整ったLINEのUIを使って、サービスを展開できるのがすごいところ!!

では、四の五の言わずに実装しましょう。

ちなみに、完成品はこちらを友達登録して、ご確認ください。
(プッシュ通知を設定していないので、分かりづらいですが、なんでもいいのでメッセージを適当に送ってください。)

ぜひ、この機能を実装したLINE Botを使ってみてください!
友だち追加

目次

  • LINE Developerの登録
  • テンプレートメッセージを実装
  • Herokuの登録
  • 参考サイト
  • おまけ

対象

  • LINEのMessaging APIを使ってみたい人
  • Messaging APIのテンプレートメッセージを実装したい人
  • Herokuの勉強をしたい人

LINE Developerの登録

Messaging APIのトップ画面の「はじめよう」から、LINE Developerに移れます。

すでにLINEアカウントをお持ちの方は、そのアカウントで登録することができます。すごく簡単\\\└('ω')┘////

新規チャネルの作成

Developerの登録が終わると、「新規チャネル作成」の画面になります。簡単な必要事項を入力するだけでokです。

作成するとこの画面になります。
image.png

テンプレートメッセージを実装

では、メインのテンプレートメッセージを実装します。
フレームワークはとっても使いやすいFlaskを使います。

ライブラリの準備

$ pip install flask
$ pip install line-bot-sdk

ディレクトリ構成

特に気を使わず、同階層で大丈夫です。

├── Procfile
├── app.py
├── requirements.txt
└── runtime.txt

テンプレートメッセージの返信機能を実装

今回は、とりあえず動かすことを目的としていますので、細かい解説は、省きます。

app.py
import os

from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TemplateSendMessage, CarouselTemplate, CarouselColumn)

app = Flask(__name__)

LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)


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

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

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

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def response_message(event):
    # notesのCarouselColumnの各値は、変更してもらって結構です。
    notes = [CarouselColumn(thumbnail_image_url="https://renttle.jp/static/img/renttle02.jpg",
                            title="【ReleaseNote】トークルームを実装しました。",
                            text="creation(創作中・考え中の何かしらのモノ・コト)に関して、意見を聞けるようにトークルーム機能を追加しました。",
                            actions=[{"type": "message","label": "サイトURL","text": "https://renttle.jp/notes/kota/7"}]),

             CarouselColumn(thumbnail_image_url="https://renttle.jp/static/img/renttle03.jpg",
                            title="ReleaseNote】創作中の活動を報告する機能を追加しました。",
                            text="創作中や考え中の時点の活動を共有できる機能を追加しました。",
                            actions=[
                                {"type": "message", "label": "サイトURL", "text": "https://renttle.jp/notes/kota/6"}]),

             CarouselColumn(thumbnail_image_url="https://renttle.jp/static/img/renttle04.jpg",
                            title="【ReleaseNote】タグ機能を追加しました。",
                            text="「イベントを作成」「記事を投稿」「本を登録」にタグ機能を追加しました。",
                            actions=[
                                {"type": "message", "label": "サイトURL", "text": "https://renttle.jp/notes/kota/5"}])]

    messages = TemplateSendMessage(
        alt_text='template',
        template=CarouselTemplate(columns=notes),
    )

    line_bot_api.reply_message(event.reply_token, messages=messages)


if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

設定ファイルを作成

pythonのバージョンの管理やライブラリの指定をします。

Procfile
web: python app.py
requirements.txt
Flask==1.0.2
line-bot-sdk==1.7.2
runtime.txt
python-3.6.6

公式サイトによると、Pythonのバージョンは、python-3.7.0 python-3.6.6 python-2.7.15のいずれかを指定する必要があるみたいです。

Herokuの準備

Herokuの公式サイトからもダウンロードできますし、下記のコマンドからでもインストールできます。

$ brew install heroku/brew/heroku

ちょいつまった

(上のコマンドで正しくインストールされれば、飛ばしてください。)
上のコマンドを打ったら、下のように怒られた。

Error: heroku 7.16.0 is already installed
To upgrade to 7.19.3, run `brew upgrade heroku`

アップグレードするだけでOK!

$ brew upgrade heroku

Herokuへログイン

ターミナルで下記のコマンドを打つと、

$ heroku login

ブラウザに移行して、メールアドレスとパスワードを求められます。
image.png

無事、ログインに成功すると、下の画面になります!

image.png

※ 初めてHerokuを使う場合は、挙動が少し違う可能性があります。

Herokuへアプリケーションの登録

# 英字の大文字はうまく登録できないようです
$ heroku create <自分のアプリ名>

Herokuとチャネルの連携

管理画面から、Channel Secretアクセストークンをコピーして、設定します。

$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列" --app <自分のアプリ名>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列" --app <自分のアプリ名>

Webhookの設定

下のように設定してください。

管理画面から、Webhookの設定をします。
Webhook送信:利用する
Webhook URL:https://<自分のアプリ名>.herokuapp.com/callback

image.png

デプロイ

commitして、pushしたら、デプロイ完了です。(Herokuって楽\(^o^)/)

$ git init
$ git add .
$ git commit -m "new commit"
$ git push heroku master

これで、デプロイ完了です。
管理画面から、ご自身のQRコードをLINEで友だち追加して、遊んでみてください。

このような感じになれば、成功です。
image.png

つまったところ

デプロイしたのに返信が返ってこない

原因:
エラーの原因は、たくさん考えられます。なので、logを見て判断してください。Herokuのログを見るコマンドは、以下の通りです。

$ heroku logs

参考サイト

PythonでLine botを作ってみた
LINE Messaging APIのテンプレートメッセージをまとめてみる
[python] LINEで画像を送ると商品検索するbotを作ってみた

おまけ

最後までお付き合いいただき、ありがとうございました。
少しでもお役に立てたのであれば、嬉しいです。

今後、プッシュ通知や他の機能に関しても、記事を書いていく予定です。

Renttleというサービスを開発中です。ぜひ、使ってみて、レビューをください。

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