目標
Django と LINE Messaging API を連携させ、LINEトーク上で動くシンプルなBotを構築する。
前提
LINE Developers アカウント作成済
環境構築
プロジェクトディレクトリの作成と仮想環境
mkdir my_line_bot
cd my_line_bot
python -m venv .venv
.\.venv\Scripts\Activate.ps1 # PowerShell利用
Django と LINE SDK のインストール
python -m pip install django python-dotenv
Django プロジェクトとアプリ作成
プロジェクト作成
django-admin startproject my_line_bot .
アプリ作成
python manage.py startapp line_bot
settings.py
にアプリを登録
INSTALLED_APPS = [
...,
"line_bot",
]
(この時点でのディレクトリ構成)
my_line_bot/
├─ .venv # 仮想環境
├─ manage.py
├─ line_bot/ # アプリ
│ ├─ __init__.py
│ ├─ admin.py
│ ├─ apps.py
│ ├─ models.py
│ ├─ tests.py
│ ├─ views.py # Webhook処理 & コマンド処理
│ └─ ...
└─ my_line_app/ # プロジェクト設定フォルダ
├─ __init__.py
├─ asgi.py
├─ settings.py # .env 読み込み設定を追加
├─ urls.py # /callback をルーティング
└─ wsgi.py
LINE Messaging API の準備
- LINE Developers コンソール で Messaging API チャネルを作成
- 「基本設定」タブから チャネルシークレット を取得
- 「Messaging API設定」タブから チャネルアクセストークン(長期) を発行
- プロジェクト直下に
.env
ファイルを作成して保存
.env
LINE_CHANNEL_ACCESS_TOKEN=xxxxxxxxxxxxxxxx
LINE_CHANNEL_SECRET=yyyyyyyyyyyyyyyyyyyy
settings.py
from pathlib import Path
import os
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(BASE_DIR / ".env")
LINE_CHANNEL_ACCESS_TOKEN = os.getenv("LINE_CHANNEL_ACCESS_TOKEN")
LINE_CHANNEL_SECRET = os.getenv("LINE_CHANNEL_SECRET")
Webhook エンドポイントの作成
まずはオウム返しだけ。
events/views.py
import os
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from linebot import LineBotApi, WebhookParser
from linebot.models import TextMessage, TextSendMessage
from linebot.exceptions import InvalidSignatureError
def get_line_clients():
return (
LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN),
WebhookParser(settings.LINE_CHANNEL_SECRET)
)
@csrf_exempt
def callback(request):
#LINEプラットフォームから送られるWebhookを受け取るエンドポイント
line_bot_api, parser = get_line_clients()
signature = request.headers.get("X-Line-Signature", "")
body = request.body.decode("utf-8")
try:
events = parser.parse(body, signature)
except InvalidSignatureError:
return HttpResponse(status=400)
for event in events:
if isinstance(event, MessageEvent) and isinstance(event.message, TextMessage):
# 単純にオウム返し
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=f"あなたは「{event.message.text}」と送りました")
)
return HttpResponse(status=200)
Webhookとは
- あるサービスでイベントが発生したときに、別のサービスに「通知」を送る仕組み
- 通常のAPIが「こちらから相手に問い合わせに行く(pull型)」なのに対し、Webhookは「相手から通知が飛んでくる(push型)」
- LINE Botでは、ユーザーの操作イベントがLINEサーバーからWebhook経由でDjangoにPOSTされる
→ Botを作るときは/callback
のようなWebhookエンドポイントを必ず用意する必要がある
ルーティング
my_line_bot/urls.py
from django.contrib import admin
from django.urls import path
from events.views import callback
urlpatterns = [
path("admin/", admin.site.urls),
path("callback", callback),
]
サーバーを動かしてみよう
Django
python manage.py runserver
ngrok で外部公開 & Webhook 設定
※別ターミナル上で
ngrok http 8000
発行されたURLに /callback
を付けて、LINE Developers の Webhook URL に設定。
ngrok(無料版)は再起動するとURLが変わるので、LINE Developers側で手動で再設定する必要がある
「接続確認」で成功すれば準備完了。