【LINExPython】初心者でもカンタン!LINE botを作成しよう

よく企業の公式アカウントである自動応答LINE botですが、実は個人でも意外と簡単に作ることができちゃいます。また個人で利用するくらいであればお金も一切かからずに楽しむことができるので、Pythonの基礎を一通り勉強した人には次のステップとしてオススメです。

この記事ではPython初心者でもわかるようにLINE botの作成手順を説明していきます。
自動応答botではなく、ある特定の条件になったらLINE通知を送ることができるLINE notifyというものもありますが、それについては以下の記事で紹介していますので、気になる方は参考にしてみてください。

【Python】LINE Notifyを活用してお気に入りのサイトの更新をLINEで自動通知させよう!

まずはLINE Developersに登録

LINE Developersに飛んでLINE Notifyに登録しましょう。

登録はLINEアカウントを持っていれば誰でも無料でできます。

すでにLINEアカウントを持っている方は右上のログインからログインしてください。

チャネルを作成する

ログインすると、以下のようなコンソール画面が表示されます。

サービスを提供し、利用者の情報を取得する個人の開発者、企業、または組織の名称を表すプロバイダーというものを作成する必要があります。個人の開発者であれば名称はなんでも構いませんので、お好きな名前のプロバイダーを作成ボタンから作成してください。

プロバイダーを作成するとプロバイダーごとの設定画面が表示されます。

LINE botはMessaging APIというLINEが提供しているAPIを利用することによって実装できますので、チャネル設定からMessaging APIをクリックしてください。

チャネル作成について必要な情報の入力が求められますので、必須項目を入力してください。アイコンやチャネル名は後から変更できますので、気軽に決めていただいて問題ありません。チャネルの説明にはBotが具体的に何をするのかについての説明を入力します。

大業種・小業種は必須項目ですが何かBotに影響を与えるものではないので、適当でも構いません。
プライバシーポリシーURLとサービス利用規約URLがある方は入力しますが、任意ですので特にない方はスキップできます。

必須項目の入力が完了したら利用規約に同意するを選択して作成を完了させます。

チャネルシークレットとアクセストークンを取得する

チャネルの作成が完了するとチャネル設定画面が表示されます。チャネル基本設定タブを下の方にスクロールしていくとチャネルシークレットが表示されています。後で使いますので、メモ帳などにコピーして保存しておいてください。

続いて、上に戻るとMessaging API設定というタブがありますので、クリックして下までスクロールするとチャネルアクセストークンがあります。「発行」ボタンをクリックして発行してください。

こちらもメモ帳などにコピーして保存しておきましょう。

webhookをオンにする

LINE botではユーザーがBotに対してメッセージを送ったときにwebhookURLというものに対してwebhookイベントを送ることで何かしらの処理をします。

簡単にいうと「~さんがこういうメッセージを送信したよー」ということを指定したサーバー(webhookURL)に伝えて、サーバーでは私たちがこれから作成するPythonコードの内容が処理されて、その結果がユーザーに返されるという仕組みです。普通のwebサイトと同じような仕組みですね。完璧に理解する必要はありませんが、そういうものなんだ程度に抑えておいてください。

webhookURLについては後で作成します。

先ほど取得したチャネルアクセストークンの少し上に応答メッセージの欄があります。

右端の編集をクリックしてください。
応答機能のwebhookがデフォルトではオフになっていると思いますので、こちらをクリックしてオンにしてください。応答メッセージはオフにしてください。設定を変更すると自動で変更内容が保存されますので、そのページは閉じていただいて大丈夫です。

(上画像では応答メッセージがオンなっていますが、オフで大丈夫です)

Pythonコードを作成する

いよいよBotの応答内容を支持するPythonコードを作成していきます。

作業用のフォルダを作成し、コードエディターで作業用フォルダを開いてください。名前はなんでも構いませんが、今回はLINE_botというフォルダにしています。

まずは仮想環境を作成します。Python3では標準で仮想環境作成用モジュールがインストールされていますので、ターミナルで以下のコマンドを実行してください。

python -m virtualenv env

続いて以下のコマンドで作成した仮想環境を有効にします。

./env/Scripts/activate.ps1

envという仮想環境名がコマンドラインの先頭に表示されていれば、正常に仮想環境が有効になっています。

必要なパッケージをインストールします。

LINE Bot SDK

pip install line-bot-sdk

flask

pip install flask

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

app = Flask(__name__)

line_bot_api = LineBotApi('アクセストークン')
handler = WebhookHandler('チャネルシークレット')


@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:
        print("Invalid signature. Please check your channel access token/channel secret.")
        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()

アクセストークンとチャネルシークレットの部分に先ほど保存したアクセストークンとチャネルシークレットをペーストしてください。

Pythonコードはこれで完了ですが、先ほど説明したwebhook URLというLINEからユーザーのデータを送るためのURLがないので、これを作成するためにngrokというツールを利用してURLを作成します。

ngrokをダウンロードする

ngrokはhttp://127.0.0.1:5000といったローカルサーバーをグローバルなURLに変換するためのツールです。無料で利用できますので、以下のURLから自分のOSに合った方法でngrokをダウンロードしてください。

ngrok – download

Windowsの場合はzipファイルをダウンロードして解凍します。でてきたngrok.exeを作業用フォルダにコピーしてください
macの場合もほぼ同様の作業でダウンロードしたzipファイルを解凍後、でてきたファイルを作業用フォルダにコピーしてください。

ngrokを使用するためにもトークンが必要になりますので、ngrok – sing upからngrokに登録します。

登録が完了したらログインして、ダッシュボードのGetting started→Your Authtokenをクリックしてください。以下の画面にトークンが表示されます。

以下のコマンドを実行し、取得したトークンを登録します。Your-Authtokenの部分は取得したAuthtokenに置き換えてください。

ngrok config add-authtoken Your-Authtoken

これでngrokの設定が完了したので、main.pyを実行してください。

ここで表示されているhttp://127.0.0.1:5000というローカルサーバーでflaskアプリが起動しましたので、これをngrokを使ってグローバルなURLに変換します。

flaskはこのまま動作した状態にしたいので、もう一つ別にコンソールを開いてください。以下のコマンドを実行してください。5000の部分はポート番号とよばれるもので、http://127.0.0.1:8000の人は8000に置き換えて実行してください。

ngrok http 5000

Forwardingというところにhttp://localhost:5000に対応するURLが表示されます。

そのURLの最後に/callbackを追加してMessagin API設定のWebhook URLに貼り付けてください。

例)https://e986-2001-8004-4420-c3aa-8183-dfdc-4e2f-3d9c.au.ngrok.io/callback

またWebhookの利用も有効にしておいてください。

更新をクリック後、検証をクリックして「成功」が表示されれば設定完了です。エラーが発生した人は何かが間違っているので、上記手順を見直してみてください。ポート番号が違っているか、/callbackをつけ忘れている可能性が高いです。

これでQRコードなどから作成したLINE botを友達に追加して何かテキストを送ってみてください。

オウム返しされるはずです。これは下記の部分のコードによってオウム返しするように設定されているからです。

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

ユーザーが何かメッセージを送信すると、handle_messageが呼び出され、この関数に渡されたeventにはユーザーが送ったメッセージなどが含まれています。event.message.textがユーザーが送った内容で、その内容をそのままTextSendMessage関数に渡すことでオウム返ししています。

ですので、TextSendMessageに渡す内容を以下のように変更してみると、ユーザーが送った内容に関係なく「自動応答です」が返されるようになります。(変更を反映させるには一度flaskアプリを再起動する必要があるので、flaskを実行しているコンソール上でCtrl+Cをおして終了してから、再度main.pyを実行してください。)

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text="自動応答です"))

あとはこのTextSendMessageの内容をif文などで分岐させてあげればユーザーが送った内容に対応して応答メッセージを変更させることができます。

例えばユーザーが「現在時刻」と送った場合に時間を返したい場合、

import datetime
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    if event.message.text == '現在時刻':
        reply_message = datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%Sです')
    else:
        reply_message = "「現在時刻」と送信してください。"
    line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=reply_message))

とすると以下のような結果になります。

if文でevent.message.text(ユーザーが送った内容)が「現在時刻」かを確認し、そうである場合には現在時刻を、そうでない場合は定型文で返すようにしています。

あとはあなたのアイデア次第でどんなBotでも作成できます。

まとめ

いかがでしたか?今回はLINE Messaging APIを使ってLINE botを作成する方法について解説しました。

Webhookなど、少しサーバー関連の小難しい話もありましたが、手順に従えばカンタンに実装できてしまいます。TextSendMessage()関数の中身を変更することで、応答内容を変更することができます。

ぜひあなたのアイデアで面白いBotを作成してみてください!