プログラミング

LineボットをPythonで使ってみよう!

こんにちは、MSKです。
今回は、Lineボットを使うための登録から解説して、PythonとFlaskを使ってよくあるオウム返しを作ります。

使用する環境

  • サーバーサイドはPython+Flask
  • サーバーは無料で使えるのでHeroku

Line Developerに登録

Line Botを使うためにLine Developerに登録します。
Line Developerに登録するとLineを使用した開発を行うことができるみたいです。

Line Developerのページを開き、ログインボタンをクリックします。

LINEアカウントでログインします。
普段使っているアカウントのメールアドレスとパスワードで、ログインします。
ログインできましたら、開発者名とメールアドレスを登録するとLine Developerへの登録は完了です。

プロバイダーとチャンネルの作成

Line Developerへの登録が終わるとプロバイダー(作成するLine Botの提供元)を作成します。
提供元の名前を入力します。

1つのLine Botに対応するチャンネルを作成します。
新規チャンネル作成ボタンを押します。

今回はBotを作成するのでMessaging APIを使用します。
Messaging APIは以下のことができます。(公式サイト参考)

  • 応答メッセージを送る
  • プッシュメッセージを送る
  • テキストやスタンプなどのメッセージを送る
  • ラインビーコンを使う(個人的には興味ある内容です) 
  • ユーザーが送ったコンテンツを取得する 

チャンネル名やチャンネル説明を入力し、大業種・小業種を選択、メールアドレスを入力します。
利用規約に同意できるのでしたら、利用規約にチェックを入れて作成ボタンを押します。

Herokuへの登録とアプリの作成

Herokuへの登録

Herokuに登録を行います。
次の画面になりますので必要な項目を入力してCREATE FREE ACCOUNTをクリックします。

Herokuから「Confirm your account on Heroku」というメールが来ますので、メール本文にあるURLをクリックします。
クリックすると次の画面になりますので、パスワードを入力します。

パスワードを設定すると登録は完了です。

アプリの登録

トップページから「Create new app」をクリックします。
次の画面が出てきますので、小文字・数字・ハイフンを使って名前を付けます。

「Create app」をクリックするとアプリの登録ができます。

Heroku Cliのインストール

このページからHeroku Cliのインストーラーをダウンロードします。
インストーラーを起動したらデフォルトの設定のままインストールを行います。
インストールが終わったら次のコマンドを打ってバージョンが返ってきたら正常にインストールができています。

heroku --version

PythonでLineBotプログラムを書く

プログラムを書く

app.pyを作成します。
ソースは公式のSDKを参考にします。

# ライブラリをインポート
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

#Flaskを準備
app = Flask(__name__)

#環境変数からLINE Access Tokenを設定
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
#環境変数からLINE Channel Secretを設定
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

#LineBotApiのインスタンスを生成
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
#WebhookHandlerのインスタンスを生成
webhook_handler = WebhookHandler(LINE_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    # HTTPリクエストヘッダからX-Line-Signatureを取り出す
    signature = request.headers['X-Line-Signature']

    #テキストでpostされたデータを取得
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # webhookのbodyを解析する
 #この結果はadd関数で受け取る
 #なお、Signatureが一致していない時はInvalidSignatureError例外が発生する
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

# MessageEvent
@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()

設定ファイルを準備する

必要な設定ファイルを準備します。
必要なファイルは以下になります。

  • runtime.txt : 使用するPythonのバージョンを記入します。
  • requirements.txt : インストールするライブラリを記入します。
  • Procfile : プログラムの実行方法を記入します。

※僕はProcfileの先頭のPを小文字にしていたので、正しく動かず、かなり悩みました・・・

runtime.txtは以下のように記入します。

python-3.7.6

requirements.txtは以下のように記入しました。

click==7.1.1
Flask==1.1.1
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.1
MarkupSafe==1.1.1
Werkzeug==1.0.0
line-bot-sdk==1.8.0

Procfileは以下のように記入しています。

web: gunicorn app:app --log-file=-

runtime.txt、requirements.txt、Procfileはapp.pyと同じディレクトリに入れます。

Herokuにデプロイする

Heroku Cliでherokuにログインします。

heroku login

次のように聞かれるのでq以外のキーを押します。

heroku: Press any key to open up the browser to login or q to exit: 

キーを押すとブラウザが立ち上がって、次の画面になりますので「Log In」を押します。

次の画面になり、コマンドプロンプト上に「Logged in as xxxxxx@xxxxx」となっていたらログイン成功です。

デプロイはgit経由で行うので、gitへの登録を行います。
リモートリポジトリはHerokuで登録したアプリのsettingタブのApp Informationから確認できます。

git init

git remote add heroku https://git.heroku.com/xxxxxxxxxx.git

git add .

git commit -m "first commit"

git push heroku master

登録したHerokuのアプリのOverviewの画面で「build successed」が確認できればデプロイ成功です。

実際に作成したbotで動作確認をしてみます。

おわりに

作成してみてLineBotはUIを作る必要がないため、簡単に面白いことができそうだと感じました。
今回はオウム返しなので、あまり面白くはないですね。
次はLineBotでできることをもう少し増やしてみたいと思います。

以上、「LineボットをPythonで使ってみよう!」でした。
最後までご覧頂き、ありがとうございました。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近Webプログラミングと曲面結び目理論にはまっています。