2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django × LINE Messaging API で簡単なBotを作る

Last updated at Posted at 2025-08-28

目標

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 の準備

  1. LINE Developers コンソールMessaging API チャネルを作成
  2. 「基本設定」タブから チャネルシークレット を取得
  3. 「Messaging API設定」タブから チャネルアクセストークン(長期) を発行
  4. プロジェクト直下に .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側で手動で再設定する必要がある

「接続確認」で成功すれば準備完了。


動作確認

  1. LINEでBotを友だち追加
    Official Account Manager → 友達追加ガイド → 友達追加QRコードを作成 → スマホLINEでQRを読み取る

  2. トークで適当なメッセージを送る
    Official Account Manager → メッセージ配信 → メッセージを作成
    「追加ありがとう🥰」
    image.png

  3. スマホから適当なメッセージを送る
    「こんにちは!」
    image.png
    →「あなたは『〜~~』と送りました」と返ってくれば成功!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?