【python】LINE botの作り方(Messaging API)

本ページには PR が含まれます。

PythonでLINE botを作ってみたいけどどうやればいいの…??

今回はLINEのWeb APIを使ったbotの作り方を紹介します。


サンプルコードと実際の画面を見ながら、サクサク処理を試せるのでぜひ参考にしてみてください!!


こんな方におすすめ
  • Pythonの基礎も身についたし、なにかアプリケーションを作ってみたい方
  • LINEでのくり返し連絡作業を自動化したい方


STEP
LINE Developersに登録

LINEのMessaging APIを利用するため、LINE Developersへの登録が必要です。

登録後、APIキーやアクセストークンなどセキュリティキーを取得します。


STEP
PythonでLINE botの機能を実装

Messaging APIの公式ドキュメントに倣って、Pythonで実際にコーディングしていきましょう。

この記事のサンプルコードをコピペしてすぐに動かせますよ!!


STEP
Herokuにアプリをデプロイ(アプリの公開)

あなたのPC(ローカル)上で開発したアプリケーションはプログラムを回しっぱなしにしないと、LINE botが機能しません。そこで、HerokuというWebアプリケーションの構築から保守、スケールの拡張などの運用作業をサポートするサービスを利用します。


それではさっそくLINE bot開発を始めましょう!!


目次

LINE Developersに登録

はじめにLINE Developersにアクセスして、あなたのLINEアカウントにログインします。

ログインできたら、もう一度LINE Developersのホーム画面に戻って「Messaging API」をクリック。

LINE Developersホーム画面

そのまま「今すぐはじめよう」をクリックして進みます。

すると、以降のアプリ作成画面に移ります。引き続き画面にならって進めていきましょう。

アプリケーションの作成

以降では、アプリケーション作成画面に必要事項を入れていきます。

続けて下にスクロールしましょう。

さらに続けて下にスクロール。

残り最後の確認項目にチェックを入れて完了です!!


アクセストークンの発行

アクセストークンを発行しましょう。

コンソール画面から先ほど作成したチャネルをクリックします。

続いて「Messaging API設定」タブを選択。

画面を下にスクロールして、「発行」ボタンをクリック。

チャネルアクセストークンはbot実装に使用します。他人に見られないところに保存しておきましょう。

チャネルシークレットの発行

LINEのMessaging APIの利用にはアクセストークンの他にチャネルシークレットが必要です。

さっそくチャネルシークレットを取得していきましょう。

再度、LINE Developersのコンソール画面に移動します。

LINE Developersコンソール画面

続いてチャネル基本設定タブを下にスクロールします。

画面下の方にチャネルシークレットが記載されています。

チャネルシークレットはbot実装に使用します。他人に見られないところに保存しておきましょう。


デフォルト応答を無効化

LINE Developersで作成したbotは、友達追加やメッセージ受信時に定型文で応答する設定がされています。

定型文での応答機能は無効にしておきましょう。コンソール画面で「Messaging API設定」タブをクリック。

画面を下にスクロールして、応答メッセージの「編集」をクリック。

あいさつメッセージと応答メッセージを「オフ」にしておきましょう。


Pythonでbot実装

それでは次にbot実装のコーディングをしていきます。

Webアプリ開発用の仮想環境を構築

今回はあなたのPC(ローカル)で作成したLINE botをHerokuというプラットフォームにデプロイします。

デプロイする開発環境をローカル内で個別の仮想環境として構築しておきましょう。

じゅんぺー

「仮想環境」と聞くと難しそうですが、
構築自体はとてもカンタンですよ!!


Pythonのvenv(仮想環境)コマンドを使ってデスクトップに「LINE_bot_venv」という名前の仮想環境を構築します。

コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行。

cd
python -m venv LINE_bot_venv

するとデスクトップ上に「LINE_bot_venv」というディレクトリが作成されるはずです。

仮想環境のディレクトリ構造を確認しておきましょう。

Windows
macOS

続いて仮想環境を稼働させます。

Windowsを使っている方

cd
cd Desktop\LINE_bot_venv\Scripts
.\activate
cd ..

macOSを使っている方

cd
cd Desktop/LINE_bot_venv/bin
source activate
cd ..

するとコンソールの先頭に(LINE_bot_venv)が表示され、仮想環境に切り替わったことを確認できます。

Windows
macOS

ちなみに仮想環境を抜けるにはコマンドプロンプトかターミナルで「deactivate」を実行すればOKです

deactivate

以降の開発は仮想環境「LINE_bot_venv」内で進めます!!


ライブラリのインストール

LINE botでは下表の用途に適したライブラリを使用します。

ライブラリ名用途
flask簡易Webアプリ開発をサポートしてくれる
line-bot-sdkLINE bot開発をカンタンに行える
requestsPythonからWebへのアクセスをカンタンに行える
pillowLINE botで画像の送受信を可能にしてくれる
psycopg2LINEアカウントをPostgreSQLデータベースで管理できる

コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行して、まとめてインストールしましょう。

pip install flask
pip install line-bot-sdk
pip install requests
pip install pillow
pip install psycopg2

コンソールに「Successfuly installed ~~~」と表示されればインストールはOKです。


bot実装(サンプルコード)

今回実装するbotアプリの機能は以下のとおりです。

  • メッセージのオウム返し
  • 画像メッセージのオウム返し
  • botをフォローするアカウントにランダムでプッシュ通知
  • フォローアカウントのデータベース管理

サンプルコード

from flask import Flask, request, abort
import requests, os
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, FollowEvent, UnfollowEvent
from PIL import Image
from io import BytesIO
import psycopg2


LINE_CHANNEL_ACCESS_TOKEN = "~~~~~あなたのチャネルアクセストークン~~~~~"
LINE_CHANNEL_SECRET = "~~~~~あなたのチャネルシークレット~~~~~"
DATABASE_URL = "~~~~~あなたのデータベースURL~~~~~" # 後ほどHerokuでPostgreSQLデータベースURLを取得
HEROKU_APP_NAME = "~~~~~あなたのHerokuアプリ名~~~~~" # 後ほど作成するHerokuアプリ名

app = Flask(__name__)
Heroku = "https://{}.herokuapp.com/".format(HEROKU_APP_NAME)

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

header = {
    "Content_Type": "application/json",
    "Authorization": "Bearer " + LINE_CHANNEL_ACCESS_TOKEN
}

@app.route("/")
def hello_world():
    return "hello world!"


# アプリにPOSTがあったときの処理
@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"


# botにメッセージを送ったときの処理
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))
    print("返信完了!!\ntext:", event.message.text)


# botに画像を送ったときの処理
@handler.add(MessageEvent, message=ImageMessage)
def handle_image(event):
    print("画像を受信")
    message_id = event.message.id
    image_path = getImageLine(message_id)
    line_bot_api.reply_message(
        event.reply_token,
        ImageSendMessage(
            original_content_url = Heroku + image_path["main"],
            preview_image_url = Heroku + image_path["preview"]
        )
    )
    print("画像の送信完了!!")


# 受信メッセージに添付された画像ファイルを取得
def getImageLine(id):
    line_url = f"https://api-data.line.me/v2/bot/message/{id}/content"
    result = requests.get(line_url, headers=header)
    print(result)

    img = Image.open(BytesIO(result.content))
    w, h = img.size
    if w >= h:
        ratio_main, ratio_preview = w / 1024, w / 240
    else:
        ratio_main, ratio_preview = h / 1024, h / 240

    width_main, width_preview = int(w // ratio_main), int(w // ratio_preview)
    height_main, height_preview = int(h // ratio_main), int(h // ratio_preview)

    img_main = img.resize((width_main, height_main))
    img_preview = img.resize((width_preview, height_preview))
    image_path = {
        "main": f"static/images/image_{id}_main.jpg",
        "preview": f"static/images/image_{id}_preview.jpg"
    }
    img_main.save(image_path["main"])
    img_preview.save(image_path["preview"])
    return image_path


# データベース接続
def get_connection():
    return psycopg2.connect(DATABASE_URL, sslmode="require")


# botがフォローされたときの処理
@handler.add(FollowEvent)
def handle_follow(event):
    profile = line_bot_api.get_profile(event.source.user_id)
    with get_connection() as conn:
        with conn.cursor() as cur:
            conn.autocommit = True
            cur.execute('CREATE TABLE IF NOT EXISTS users(user_id TEXT)')
            cur.execute('INSERT INTO users (user_id) VALUES (%s)', [profile.user_id])
            print('userIdの挿入OK!!')
            cur.execute('SELECT * FROM users')
            db = cur.fetchall()
    print("< データベース一覧 >")
    for db_check in db:
        print(db_check)


# botがアンフォロー(ブロック)されたときの処理
@handler.add(UnfollowEvent)
def handle_unfollow(event):
    with get_connection() as conn:
        with conn.cursor() as cur:
            conn.autocommit = True
            cur.execute('DELETE FROM users WHERE user_id = %s', [event.source.user_id])
    print("userIdの削除OK!!")


# データベースに登録されたLINEアカウントからランダムでひとりにプッシュ通知
def push():
    with get_connection() as conn:
        with conn.cursor() as cur:
            cur.execute('SELECT * FROM users ORDER BY random() LIMIT 1')
            (to_user,) = cur.fetchone()
    line_bot_api.multicast([to_user], TextSendMessage(text="今日もお疲れさん!!"))


# アプリの起動
if __name__ == "__main__":
    # 初回のみデータベースのテーブル作成
    with get_connection() as conn:
        with conn.cursor() as cur:
            conn.autocommit = True
            cur.execute('CREATE TABLE IF NOT EXISTS users(user_id TEXT)')
    
    # LINE botをフォローしているアカウントのうちランダムで一人にプッシュ通知
    push()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
### End

Herokuの事前準備

ここではHerokuというアプリ開発支援プラットフォームを活用します。


アカウント登録

はじめにHerokuにアクセスしてアカウント登録しましょう。

続いて必要項目を記入し、「無料アカウント作成」ボタンをクリックします。

指定したメールアドレスに確認メールが届くはずです。

メールを確認して、メール本文内のリンクをクリック

続いてパスワードを設定して、アカウントにログインします。

最後に利用規約画面で「Accept」ボタンをクリックして、アカウント作成は完了です!!

これでHerokuアカウントの作成は完了しました!!


アプリケーションの作成

Heroku内でアプリケーションを作成します。

ダッシュボード画面「Create new app」ボタンをクリック。

続けてアプリ名を入力します。

他のユーザとかぶらない「アプリ名」を登録する必要があります。
「地域」はアメリカか欧州のどちらかのサーバーを選択します。

入力できたら「Create app」ボタンをクリック。


これでHerokuのアプリケーション作成は完了です!!

データベース(PostgreSQL)のアドオン

今回は開発するLINE botではユーザIDをHeroku内のデータベースで管理します。

Webアプリで使用するPostgreSQLデータベースをアドオンしましょう。

続いてAdd-ons入力欄に「postgres」と入力し、検索候補から「Heroku Postgres」をクリック。

確認画面でプランが「Hobby Dev-Free」であることを確認できたら、「Submit Order Form」をクリック。

これでPostgreSQLデータベースのアドオンは完了です!!

データベースURLの取得

LINE bot Webアプリがデータベースにアクセスできるよう、データベースURLを確認しておきましょう。

アドオンした「Heroku Postgres」をクリック。

続いてDatastoreに移動できたら、「Setting」タブをクリック。

管理画面で「View Credentials…」ボタンをクリック。

資格情報の画面からURIの行をメモ帳ツールなどにコピペしておきましょう。

これでデータベースURLの取得は完了です!!


環境変数を設定

Herokuで作成したアプリ内の環境変数を設定しましょう。

Webアプリをデプロイ(公開)するにあたって、

  • チャネルアクセストークン(LINE Deverlopersで発行)
  • チャネルシークレット(LINE Deverlopersで発行)
  • データベースURL(Heroku PostgreSQLのデータベースURL)

といった機密情報はソースコードに直接書かず、アプリケーションの環境変数に設定しておくのが基本です。

ソースコードからセキュリティキーなどの機密情報が漏洩するリスクがあります。
くれぐれも機密情報を直書きしたソースコードをデプロイしないようにしてください!!

また、ここでは

  • Herokuアプリ名(Herokuで作成したアプリ名)

も環境変数に設定していきます。


あらかじめ、サンプルコードの以下の部分を環境変数を読み込むかたちに書き換えましょう。

# サンプルコードの11~14行目を以下のように書き換え
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]
DATABASE_URL = os.environ["DATABASE_URL"]
HEROKU_APP_NAME = os.environ["HEROKU_APP_NAME"]

ソースコードを変更したらWebアプリ側の環境変数を設定します。


Herokuで作成したアプリ管理画面で「Settings」タブをクリック。

続いて「Reveal Config Vars」をクリックします。

ウィンドウが展開されるので、使用する環境変数

  • チャネルアクセストークン(LINE Deverlopersで発行)
  • Herokuアプリ名(Herokuで作成したアプリ名)
  • チャネルシークレット(LINE Deverlopersで発行)
  • データベースURL(Heroku PostgreSQLのデータベースURL)

を追加しましょう。

「DATABASE_URL」はHeroku PostgreSQLのアドオン時に自動入力される場合があります。
入力済みとなっていれば追記は不要です。


Herokuへデプロイ

ここからはHerokuを使ってアプリケーションをデプロイする準備を進めていきます。

実際の画面を見ながらスムーズに進められますよ!!

Heroku CLIのインストール

Herokuプラットフォームへのデプロイは、コマンドプロンプト(Windows)やターミナル(macOS)から実行します。

コマンドプロンプトやターミナルでherokuコマンドを使用できるようHeroku CLIをインストールしましょう。

macOSを使用している方

ターミナルで下記を実行

brew tap heroku/brew && brew install heroku

Windowsを使用している方

Heroku CLIインストール公式ページからインストーラをダウンロードします。

ダウンロードフォルダ内のインストーラーを起動します。

インストーラー起動後、特に指定箇所はなく「Next」と「Install」ボタンをクリック。

最後に「Close」ボタンをクリックしてインストールは完了です。

これでHeroku CLIのインストールは完了しました!!

コンソールでHerokuにログイン

はじめにコマンドプロンプト(Windows)もしくはターミナル(macOS)で下記を実行してHerokuにログインします。

heroku login
日本語訳

heroku: 任意のキーを押してブラウザーを開いてログインするか、q を押して終了します。

と表示されるので、適当なキーボードを押しましょう。しばらくするとWebブラウザが起動します。

「Log In」ボタンをクリックしたらログインは完了です。


runtime.txtの設定

アプリをデプロイする際にPythonのバージョンを指定するため「runtime.txt」というテキストファイルが必要です。

あらかじめ仮想環境のPythonバージョンを確認しておきましょう。

コマンドプロンプト(Windows)またはターミナル(macOS)で以下を実行します。

python -V

バージョンを確認できたらデプロイ時に使用する「runtime.txt」ファイルを仮想環境の中に作成しましょう。

Windows
macOS

先ほど確認したPythonバージョンを、作成した「runtime.txt」に以下のフォーマットで入力して保存します。

python-○.○.○
# 例
python-3.10.5

これでデプロイするPythonのバージョン指定は完了です!!

Procfileファイルの設定

Heroku上で動作させるコマンドをProcfileファイルで設定します。

このProcfileファイルもHerokuにデプロイする際に必要です。

Windows
macOS

Procfileには拡張子はありません。不要な拡張子をつけるとデプロイに失敗します。

テキストエディタなどでProcfileに以下を入力して保存しましょう。

web: python main.py

requirements.txtの用意

Heroku上で動作させるプログラムのパッケージ管理に「requirements.txt」というテキストファイルが必要です。

仮想環境でインストールした各種ライブラリを一括で「requirements.txt」に書き起こしましょう。

コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行します。

pip freeze > requirements.txt
Windows
macOS

ちなみにrequirements.txtには仮想環境内のすべてのライブラリがバージョンごと出力されています。


gitを初期化

デプロイする仮想環境リポジトリを初期化します。

まず、作成したソースコード(main.py)を仮想環境内に保存し、画像を管理する「static」フォルダを作成しましょう。

Windows
macOS

「static」フォルダ内にさらに「images」フォルダを作って、その中に適当な画像ファイルを格納しておきます。

最終的なディレクリ構造は以下のとおりです。

続いてコマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行。

git init

これでgitリポジトリの初期化は完了です!!


gitリポジトリにherokuリモートを追加

gitリポジトリをherokuコマンドで操作できるようリモートを追加します。

まず、Herokuのアプリ管理画面で「Deploy」タブをクリックし、画面を下にスクロール。

画面の一番下のherokuコマンドをコピーします。

コマンドプロンプト(Windows)あるいはターミナル(macOS)でコピーしたherokuコマンドを実行します。

heroku git:remote -a アプリ名
# 例
heroku git:remote -a sample-app-python1

これでgitリポジトリのherokuリモート追加は完了です!!


Herokuにアプリをデプロイ

いよいよLINE botアプリをHerokuにデプロイします。

コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行します。

git add .
git commit -m 'make it better'
git push heroku master

これでHerokuへのデプロイが完了しました!!


LINE DevelopersのWebhook URLを設定

LINE DevelopersのWebhook設定にHerokuアプリのURLを設定します。

まず、HerokuアプリのURLを確認しましょう。


Herokuアプリ管理画面で「Settings」タブをクリックして、下にスクロール。

Domainsの行に記載されたHerokuアプリのURLをコピーします。

続いてLINE Developersのアプリコンソール画面に移動します。

「Messaging API設定」タブをクリックして、下にスクロール。

Webhook設定の「編集」ボタンをクリック。

展開された「Webhook URL」にHerokuアプリのURL+callbackを入力して、「更新」ボタンをクリック。

HerokuアプリURLのうしろに「callback」を付けるのを忘れないように注意!!


以上でLINE botアプリ開発はすべて完了です!! おつかれまでした!!

動作チェック

最後に作ったLINE botを友達追加してメッセージを送ってみましょう!!

botにメッセージや画像を送ると、そっくりそのまま返してくれますよ。

まとめ

今回はLINE botをMessaging APIを使って開発する方法をご紹介しました!!


他にもWeb APIを活用したツール開発を紹介しているので、ぜひ参考にしてみてください。

よかったらシェアしてね!
目次