こんにちは。キャスレーコンサルティングLS(リーディング・サービス)部の後藤です。

AIが気になり、Pythonの勉強始めたことがきっかけで、何かを作りたくて仕方がない今日此の頃。

LINEのBotが初心者でも簡単に作れると聞き、勉強を兼ねて
送信したメッセージをオウム返しする、LINE Botを作ってみました。

ゴール

これが、今回の完成目標のお友達「キャス・レイ」さんです。
LINEメッセージの受け取りと送信ができることが確認できます。

開発環境

・OS Mac 10.11.6
・Python 3.6.6
・Heroku

開発手順

下記の流れで、開発を進めていきます。

1.LINE Developers 登録&設定
2.Heroku 登録&設定
3.Pythonで実装
LINE Developersの登録&設定、およびHerokuの登録&設定については下記URLを参照ください。
参考サイト:https://developers.line.me/ja/docs/messaging-api/getting-started/

LINE BOTの仕組みについて

実装を始める前に、大まかなしくみと手順を説明します。
今回は、勉強も兼ねてHerokuを使ってLINE BOTを作成します。

【LINE BOTの仕組み】

1:ユーザーがボットにメッセージを送ると、Webhookを利用し、
 Messaging APIを通して、Herokuへリクエストを送信します。
2:Herokuが受け取ったリクエストを、Pythonで実装したソースコードが処理し、値をHerokuへ返します。
3:Herokuが受け取った応答リクエストを、Messaging APIへ送ります。
 (応答リクエストは、JSON形式でHTTPSを使って送信されます。)
4.LINEが受け取り、データが表示されます。

という流れで、データの授受が行われています。

【参考URL】
MessagingAPIとは…
https://developers.line.me/ja/services/messaging-api/

Herokuとは…
https://jp.heroku.com/

開発準備

Heroku CLIインストール

下記の参考サイトで、Download the Heroku CLI for MacOSをインストールすると
コマンドラインが使えるようになります。
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

Download the Installerをクリックして、ダウンロードします。
ダウンロードしたファイルを、ダブルクリックしてインストールを進めます。

Herokuにログイン

インストールが完了しましたら、Herokuにログインしてみましょう。
ターミナルを起動し、ホームディレクトリで以下のコマンドを実行します。

$ heroku login

コマンドを実行後、
登録したEmailとパスワードを、入力してください。

Enter your Heroku credentials:
Email: XXX@XXX
Password: *********

無事にログイン成功しました!

アプリケーション登録

次に、アプリケーションを登録します。
(あとの手順で、https://<アプリケーション名>.herokuapp.comをWebhookで使います。)

以下のコマンドが自動的に、リモートリポジトリ”heroku”という名前で
git@heroku.com:<アプリケーション名>.git を登録してくれます。

$ heroku create &amp;amp;amp;amp;lt;アプリケーション名&amp;amp;amp;amp;gt;

※好きなアプリケーション名を、入力してください。

環境変数の設定

次に、環境変数の設定をします。
Messaging API にアクセスする為に必要な、Channel Secretとアクセストークンを設定します。

$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="アクセストークンの欄の文字列" --app &amp;amp;amp;amp;lt;アプリケーション名&amp;amp;amp;amp;gt;
$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secretの欄の文字列" --app &amp;amp;amp;amp;lt;アプリケーション名&amp;amp;amp;amp;gt;

以下のサイトから、作成したアプリのチャンネル基本設定を選択し、
Channel Secretの欄の文字列をコピーしてコマンドを実行する。

https://developers.line.me/console/


Channel Secretも、同様に設定します。


設定ファイル

今回は軽量で分かりやすいとのことだったので、flask(Webフレームワーク)を使っていきます。
また、LINE BOT開発用のline-bot-sdkをインストールします。

$ pip3 install flask
$ pip3 install line-bot-sdk

flaskとは…
http://flask.pocoo.org/

line-bot-sdkとは…
https://developers.line.me/ja/docs/messaging-api/line-bot-sdk/

続いて、以下の通り、4つのファイルを新規で作成します。
ファイルは、以下のディレクトリ構成になるように作成しました。
lineBot
├── Procfile
├── main.py
├── runtime.txt
└── requirements.txt

Pythonのバージョンを記載する設定ファイル

ファイル名:runtime.txt
内容:
python-3.6.6

インストールするライブラリを記載する設定ファイル

ファイル名:requirements.txt
内容:
Flask==0.12.2
line-bot-sdk==1.5.0

プログラムの実行方法を定義する設定ファイル

ファイル名:Procfile
内容:
web: python main.py

メインのプログラム

ファイル名:main.py

実装

メインのプログラム

ファイル名:main.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__)

#環境変数取得
# LINE Developersで設定されているアクセストークンとChannel Secretをを取得し、設定します。
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)


## 1 ##
#Webhookからのリクエストをチェックします。
@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)

    # handle webhook body
 # 署名を検証し、問題なければhandleに定義されている関数を呼び出す。
    try:
        handler.handle(body, signature)
 # 署名検証で失敗した場合、例外を出す。
    except InvalidSignatureError:
        abort(400)
 # handleの処理を終えればOK
    return 'OK'

## 2 ##
###############################################
#LINEのメッセージの取得と返信内容の設定(オウム返し)
###############################################

#LINEでMessageEvent(普通のメッセージを送信された場合)が起こった場合に、
#def以下の関数を実行します。
#reply_messageの第一引数のevent.reply_tokenは、イベントの応答に用いるトークンです。 
#第二引数には、linebot.modelsに定義されている返信用のTextSendMessageオブジェクトを渡しています。

@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()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

デプロイ

$ git init
$ git add  &amp;amp;amp;amp;lt;ファイルの配置場所&amp;amp;amp;amp;gt;
$ git commit -m "new commit"
$ git push heroku master

リモートリポジトリが登録されているか、確認をしてみましょう。

$ git branch -a

Webhookの設定

https://developers.line.me/console/ に戻り、Webhookの設定をします。

Webhookとは

アプリケーションの更新情報を、他のアプリケーションへリアルタイム提供する仕組みや概念のことです。
イベント(リポジトリにプッシュなど)発生時、指定したURLにPOSTリクエストします。

LINE BOTのイベントを、リアルタイムで通知する為に使います。

今回は、LINEにメッセージが届いたときにオウム返しをさせたいので、
LINE Developers上で以下の様に設定します。

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

完成

さっそく、メッセージをLINEから送ってみましょう!
作成したBotからオウム返しで、同じメッセージが返ってきたら成功です!!
みなさん、お友達ができたでしょうか?

最後に…

LINEやMessaging API、Heroku使うの難しそう…と勝手に思い込んでいましたが
オウム返しのBotを作るのは、とても簡単にできました!

LINEのMessaging APIには、他にも音声情報や位置情報の取得や
画像付きのメニューの作成といった機能があり、
アイデア次第で面白いものが自分で作ることができますね。

他のブログサイトでは、別のAPIを連携して使い、人の画像認識し、
自動検索して人の名前を表示するようなBotを、作成しているなんて方もいました。

次回は、ちゃんと会話ができるLINE Bot(お友達)を作りたいと思います!
ぜひ皆さんも挑戦してみてください!!

最後までお読みいただき、ありがとうございました。

後藤貴志
CSVIT事業部 LS(リーディング・サービス)部 後藤貴志
2017年新卒入社。現在は証券システムの案件に配属。