本ページには PR が含まれます。
PythonでLINE botを作ってみたいけどどうやればいいの…??
今回はLINEのWeb APIを使ったbotの作り方を紹介します。
サンプルコードと実際の画面を見ながら、サクサク処理を試せるのでぜひ参考にしてみてください!!
- Pythonの基礎も身についたし、なにかアプリケーションを作ってみたい方
- LINEでのくり返し連絡作業を自動化したい方
Messaging APIの公式ドキュメントに倣って、Pythonで実際にコーディングしていきましょう。
この記事のサンプルコードをコピペしてすぐに動かせますよ!!
あなたのPC(ローカル)上で開発したアプリケーションはプログラムを回しっぱなしにしないと、LINE botが機能しません。そこで、HerokuというWebアプリケーションの構築から保守、スケールの拡張などの運用作業をサポートするサービスを利用します。
LINE Developersに登録
はじめにLINE Developersにアクセスして、あなたのLINEアカウントにログインします。
ログインできたら、もう一度LINE Developersのホーム画面に戻って「Messaging API」をクリック。
そのまま「今すぐはじめよう」をクリックして進みます。
すると、以降のアプリ作成画面に移ります。引き続き画面にならって進めていきましょう。
アプリケーションの作成
以降では、アプリケーション作成画面に必要事項を入れていきます。
続けて下にスクロールしましょう。
さらに続けて下にスクロール。
残り最後の確認項目にチェックを入れて完了です!!
アクセストークンの発行
アクセストークンを発行しましょう。
コンソール画面から先ほど作成したチャネルをクリックします。
続いて「Messaging API設定」タブを選択。
画面を下にスクロールして、「発行」ボタンをクリック。
チャネルアクセストークンは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を使っている方
cd
cd Desktop\LINE_bot_venv\Scripts
.\activate
cd ..
macOSを使っている方
cd
cd Desktop/LINE_bot_venv/bin
source activate
cd ..
するとコンソールの先頭に(LINE_bot_venv)が表示され、仮想環境に切り替わったことを確認できます。
deactivate
以降の開発は仮想環境「LINE_bot_venv」内で進めます!!
ライブラリのインストール
LINE botでは下表の用途に適したライブラリを使用します。
ライブラリ名 | 用途 |
---|---|
flask | 簡易Webアプリ開発をサポートしてくれる |
line-bot-sdk | LINE bot開発をカンタンに行える |
requests | PythonからWebへのアクセスをカンタンに行える |
pillow | LINE botで画像の送受信を可能にしてくれる |
psycopg2 | LINEアカウントを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内でアプリケーションを作成します。
ダッシュボード画面の「Create new app」ボタンをクリック。
続けてアプリ名を入力します。
入力できたら「Create app」ボタンをクリック。
データベース(PostgreSQL)のアドオン
今回は開発するLINE botではユーザIDをHeroku内のデータベースで管理します。
Webアプリで使用するPostgreSQLデータベースをアドオンしましょう。
続いてAdd-ons入力欄に「postgres」と入力し、検索候補から「Heroku Postgres」をクリック。
確認画面でプランが「Hobby Dev-Free」であることを確認できたら、「Submit Order Form」をクリック。
データベースURLの取得
LINE bot Webアプリがデータベースにアクセスできるよう、データベースURLを確認しておきましょう。
アドオンした「Heroku Postgres」をクリック。
続いてDatastoreに移動できたら、「Setting」タブをクリック。
管理画面で「View Credentials…」ボタンをクリック。
資格情報の画面からURIの行をメモ帳ツールなどにコピペしておきましょう。
環境変数を設定
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)
を追加しましょう。
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にログイン
はじめにコマンドプロンプト(Windows)もしくはターミナル(macOS)で下記を実行してHerokuにログインします。
heroku login
heroku: 任意のキーを押してブラウザーを開いてログインするか、q を押して終了します。
と表示されるので、適当なキーボードを押しましょう。しばらくするとWebブラウザが起動します。
「Log In」ボタンをクリックしたらログインは完了です。
runtime.txtの設定
アプリをデプロイする際にPythonのバージョンを指定するため「runtime.txt」というテキストファイルが必要です。
あらかじめ仮想環境のPythonバージョンを確認しておきましょう。
コマンドプロンプト(Windows)またはターミナル(macOS)で以下を実行します。
python -V
バージョンを確認できたらデプロイ時に使用する「runtime.txt」ファイルを仮想環境の中に作成しましょう。
先ほど確認したPythonバージョンを、作成した「runtime.txt」に以下のフォーマットで入力して保存します。
python-○.○.○
# 例
python-3.10.5
Procfileファイルの設定
Heroku上で動作させるコマンドをProcfileファイルで設定します。
このProcfileファイルもHerokuにデプロイする際に必要です。
Procfileには拡張子はありません。不要な拡張子をつけるとデプロイに失敗します。
テキストエディタなどでProcfileに以下を入力して保存しましょう。
web: python main.py
requirements.txtの用意
Heroku上で動作させるプログラムのパッケージ管理に「requirements.txt」というテキストファイルが必要です。
コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行します。
pip freeze > requirements.txt
ちなみにrequirements.txtには仮想環境内のすべてのライブラリがバージョンごと出力されています。
gitを初期化
デプロイする仮想環境リポジトリを初期化します。
まず、作成したソースコード(main.py)を仮想環境内に保存し、画像を管理する「static」フォルダを作成しましょう。
「static」フォルダ内にさらに「images」フォルダを作って、その中に適当な画像ファイルを格納しておきます。
最終的なディレクリ構造は以下のとおりです。
続いてコマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行。
git init
gitリポジトリにherokuリモートを追加
gitリポジトリをherokuコマンドで操作できるようリモートを追加します。
まず、Herokuのアプリ管理画面で「Deploy」タブをクリックし、画面を下にスクロール。
画面の一番下のherokuコマンドをコピーします。
コマンドプロンプト(Windows)あるいはターミナル(macOS)でコピーしたherokuコマンドを実行します。
heroku git:remote -a アプリ名
# 例
heroku git:remote -a sample-app-python1
Herokuにアプリをデプロイ
いよいよLINE botアプリをHerokuにデプロイします。
コマンドプロンプト(Windows)もしくはターミナル(macOS)で以下を実行します。
git add .
git commit -m 'make it better'
git push heroku master
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を友達追加してメッセージを送ってみましょう!!
botにメッセージや画像を送ると、そっくりそのまま返してくれますよ。
まとめ
今回はLINE botをMessaging APIを使って開発する方法をご紹介しました!!
他にもWeb APIを活用したツール開発を紹介しているので、ぜひ参考にしてみてください。