LINE Botの作り方|PythonでエコーBotからAI応答Botまで実装

Python/FastAPIでLINE Botを作る方法を解説。LINE Developers設定からngrokでのローカル開発、OpenAI API連携、Renderへのデプロイまでの実装手順。

LINEPythonFastAPIAPI連携ChatGPT

LINE Botの作り方|PythonでエコーBotからAI応答Botまで実装

LINE Botを作ってみたいけど、どこから始めればいいかわからない。そんな方のために、Python/FastAPIでLINE Botを作る手順をまとめました。

この記事では、メッセージをそのまま返すエコーBotから始めて、OpenAI APIと連携したAI応答Botまで段階的に実装し、最後にRender(無料)にデプロイするところまで解説します。


🎯 この記事で作るもの

ステップ 内容
Step 1 🔄 エコーBot(送ったメッセージがそのまま返ってくる)
Step 2 🤖 AI応答Bot(ChatGPTが返答してくれる)
Step 3 🚀 Renderにデプロイ(無料で本番公開)

完成すると、LINEでメッセージを送るだけでChatGPTと会話できるBotが手に入ります。


🏗️ アーキテクチャ(全体像)

LINE Botがどのように動くのか、全体像を把握しておきましょう。

📨 メッセージの流れ

送信(ユーザー → Bot)

ユーザー → LINEアプリ → LINEプラットフォーム → FastAPIサーバー → OpenAI API

返信(Bot → ユーザー)

OpenAI API → FastAPIサーバー → LINEプラットフォーム → LINEアプリ → ユーザー

🔄 処理の流れ(詳細)

Step 方向 内容
1 📱→ ユーザーがLINEアプリでメッセージを送信
2 →🌐 LINEプラットフォームがFastAPIサーバーにWebhook送信
3 →🤖 FastAPIがOpenAI APIを呼び出し
4 🤖→ OpenAI APIがAI応答を返す
5 →🌐 FastAPIがLINE Messaging APIで返信
6 →📱 LINEアプリに返信が表示される

📦 各コンポーネントの役割

コンポーネント 役割
LINEアプリ ユーザーが操作するUI(フロントエンド)
LINEプラットフォーム メッセージの中継。Webhookでサーバーに通知
FastAPIサーバー Webhook受信、OpenAI呼び出し、返信送信(バックエンド)
OpenAI API メッセージに対するAI応答を生成

🤔 なぜこの構成が必要?

Q: なぜFastAPIサーバーが必要?

LINEは直接OpenAI APIと連携できません。間に「自分のサーバー」を置いて、以下を処理する必要があります:

  • LINEからのWebhookを受信
  • メッセージ内容を解析
  • 外部API(OpenAI等)を呼び出し
  • LINEに返信を送信

Q: なぜWebhookが必要?

LINEはユーザーからメッセージが届くと、登録されたURL(Webhook URL)にHTTPリクエストを送ります。これにより、サーバー側でリアルタイムにメッセージを受け取れます。

Q: なぜFastAPI?

FastAPIはPythonの高速なWebフレームワークで、以下の特徴があります:

  • 🚀 高速(非同期処理対応)
  • 📝 型ヒントで自動ドキュメント生成
  • ✅ バリデーション機能が充実
  • 📚 学習コストが低い

📋 前提条件

以下の環境・アカウントが必要です:

項目 用途
🐍 Python 3.9以上 プログラム実行環境
💚 LINEアカウント Bot用の公式アカウント作成
🌐 ngrok ローカル環境を外部公開(開発時)
🔑 OpenAI APIキー AI応答Bot化(後半で使用)
🎨 Renderアカウント 無料デプロイ(最後に使用)

💡 Pythonのインストール: まだの方は Python公式サイト からダウンロードしてください。macOSの場合は brew install python でもOK。


1️⃣ LINE Developers設定

📱 1.1 LINE公式アカウントの作成

  1. LINE Official Account Manager にアクセス
  2. LINEアカウントでログイン
  3. 「アカウントを作成」をクリック
  4. アカウント名を入力(例:「My Bot」)
  5. 業種を選択して作成完了

⚙️ 1.2 Messaging APIの有効化

  1. 作成したアカウントの「設定」→「Messaging API」
  2. 「Messaging APIを利用する」をクリック
  3. プロバイダーを選択(なければ新規作成)
  4. 利用規約に同意して有効化

🔐 1.3 認証情報の取得

LINE Developers Console で以下を取得:

🔑 チャンネルシークレット

  • チャンネル基本設定 → 「チャンネルシークレット」

🎫 チャンネルアクセストークン

  • Messaging API設定 → 「チャンネルアクセストークン」→「発行」

💡 この2つは後で環境変数に設定します。メモしておきましょう。

🔧 1.4 応答設定の変更

LINE Official Account Managerで以下を設定:

設定項目
応答メッセージ ❌ オフ
あいさつメッセージ ❌ オフ
Webhook ✅ オン

これでBotからの自動メッセージを無効化し、Webhookで制御できるようになります。


2️⃣ プロジェクトセットアップ

📁 2.1 ディレクトリ構成

line-bot-demo/
├── main.py             # メインアプリケーション
├── requirements.txt    # 依存パッケージ
├── .env                # 環境変数(Git管理外)
├── .gitignore
└── render.yaml         # Renderデプロイ設定

📦 2.2 依存パッケージ

requirements.txt:

fastapi==0.109.0
uvicorn==0.27.0
line-bot-sdk==3.5.0
python-dotenv==1.0.0

インストール:

pip install -r requirements.txt

🔒 2.3 環境変数

.env:

LINE_CHANNEL_SECRET=your_channel_secret
LINE_CHANNEL_ACCESS_TOKEN=your_channel_access_token

.gitignore:

.env
__pycache__/
.venv/

3️⃣ エコーBotの実装

📝 3.1 コード全文

main.py:

import os
from fastapi import FastAPI, Request, HTTPException
from dotenv import load_dotenv

from linebot.v3 import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage
)
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent
)

# 環境変数の読み込み
load_dotenv()

app = FastAPI()

# LINE Bot設定
configuration = Configuration(
    access_token=os.environ.get('LINE_CHANNEL_ACCESS_TOKEN')
)
handler = WebhookHandler(os.environ.get('LINE_CHANNEL_SECRET'))


@app.get("/")
async def root():
    """ヘルスチェック用エンドポイント"""
    return {"status": "ok"}


@app.post("/callback")
async def callback(request: Request):
    """LINE Webhookのエンドポイント"""
    # 署名検証用のヘッダー取得
    signature = request.headers.get('X-Line-Signature', '')

    # リクエストボディ取得
    body = await request.body()
    body_str = body.decode('utf-8')

    # 署名検証 & イベント処理
    try:
        handler.handle(body_str, signature)
    except InvalidSignatureError:
        raise HTTPException(status_code=400, detail="Invalid signature")

    return {"status": "ok"}


@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    """テキストメッセージを受け取った時の処理"""
    with ApiClient(configuration) as api_client:
        line_bot_api = MessagingApi(api_client)

        # 受け取ったメッセージをそのまま返す(エコー)
        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=event.message.text)]
            )
        )


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

🔍 3.2 コード解説

① FastAPIアプリの初期化

app = FastAPI()

FastAPIではFlask(__name__)の代わりにFastAPI()でアプリを作成します。

② Webhookエンドポイント

@app.post("/callback")
async def callback(request: Request):

FastAPIでは@app.route("/callback", methods=['POST'])の代わりに@app.post("/callback")を使います。asyncで非同期処理に対応。

③ リクエストボディの取得

body = await request.body()
body_str = body.decode('utf-8')

FastAPIではrequest.get_data()の代わりにawait request.body()で取得します。

④ メッセージ返信

line_bot_api.reply_message_with_http_info(
    ReplyMessageRequest(
        reply_token=event.reply_token,
        messages=[TextMessage(text=event.message.text)]
    )
)

⚠️ reply_tokenは約30秒で無効になるため、素早く返信する必要があります。


4️⃣ ngrokでローカル環境を公開

LINE WebhookはHTTPSでアクセス可能なURLが必要です。ローカル開発ではngrokを使って一時的に外部公開します。

💻 4.1 ngrokのインストール

# macOS (Homebrew)
brew install ngrok

# または公式サイトからダウンロード
# https://ngrok.com/download

🚀 4.2 FastAPIアプリを起動

python main.py

または:

uvicorn main:app --reload --port 8000

🌐 4.3 ngrokでトンネル作成

別のターミナルで:

ngrok http 8000

出力例:

Forwarding    https://xxxx-xx-xx-xxx-xx.ngrok-free.app -> http://localhost:8000

📝 このhttps://xxxx-xx-xx-xxx-xx.ngrok-free.appがWebhook URLになります。

🔗 4.4 Webhook URLを設定

LINE Developers Consoleで:

  1. Messaging API設定 → Webhook URL
  2. https://xxxx-xx-xx-xxx-xx.ngrok-free.app/callback を入力
  3. 「更新」をクリック
  4. 「検証」をクリックして成功を確認 ✅

✅ 4.5 動作確認

  1. 📱 QRコードからBotを友だち追加
  2. 💬 テキストメッセージを送信
  3. 🔄 同じメッセージが返ってくれば成功!

5️⃣ OpenAI API連携(AI応答Bot化)

エコーBotをChatGPTが応答するBotに拡張します。

📦 5.1 追加パッケージ

requirements.txtに追加:

openai==1.6.0

インストール:

pip install openai

🔑 5.2 OpenAI APIキーの取得

  1. OpenAI Platform にアクセス
  2. API Keys → Create new secret key
  3. キーをコピー

.envに追加:

OPENAI_API_KEY=sk-xxxxxxxxxxxxx

💰 料金について: OpenAI APIは従量課金です。gpt-4o-miniは100万トークンあたり約$0.15(入力)と非常に安価。LINE Botの個人利用なら月$1未満で収まることが多いです。初回登録時に$5分の無料クレジットがもらえる場合もあります。

🤖 5.3 AI応答Botのコード

main.pyを以下のように修正:

import os
from fastapi import FastAPI, Request, HTTPException
from dotenv import load_dotenv
from openai import OpenAI

from linebot.v3 import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage
)
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent
)

# 環境変数の読み込み
load_dotenv()

app = FastAPI()

# LINE Bot設定
configuration = Configuration(
    access_token=os.environ.get('LINE_CHANNEL_ACCESS_TOKEN')
)
handler = WebhookHandler(os.environ.get('LINE_CHANNEL_SECRET'))

# OpenAI設定
openai_client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))


def get_ai_response(user_message: str) -> str:
    """ChatGPTからの応答を取得"""
    try:
        response = openai_client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role": "system",
                    "content": "あなたは親切なアシスタントです。簡潔に日本語で回答してください。"
                },
                {
                    "role": "user",
                    "content": user_message
                }
            ],
            max_tokens=500
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"OpenAI API error: {e}")
        return "申し訳ありません。エラーが発生しました。"


@app.get("/")
async def root():
    """ヘルスチェック用エンドポイント"""
    return {"status": "ok"}


@app.post("/callback")
async def callback(request: Request):
    """LINE Webhookのエンドポイント"""
    signature = request.headers.get('X-Line-Signature', '')
    body = await request.body()
    body_str = body.decode('utf-8')

    try:
        handler.handle(body_str, signature)
    except InvalidSignatureError:
        raise HTTPException(status_code=400, detail="Invalid signature")

    return {"status": "ok"}


@handler.add(MessageEvent, message=TextMessageContent)
def handle_message(event):
    """テキストメッセージを受け取った時の処理"""
    user_message = event.message.text

    # ChatGPTから応答を取得
    ai_response = get_ai_response(user_message)

    with ApiClient(configuration) as api_client:
        line_bot_api = MessagingApi(api_client)

        line_bot_api.reply_message_with_http_info(
            ReplyMessageRequest(
                reply_token=event.reply_token,
                messages=[TextMessage(text=ai_response)]
            )
        )


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

🔍 5.4 変更点の解説

① OpenAIクライアントの初期化

openai_client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))

② ChatGPTへのリクエスト

response = openai_client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[...],
    max_tokens=500
)
パラメータ 説明
gpt-4o-mini 高速で安価なモデル(用途に応じてgpt-4oに変更可)
max_tokens 応答の最大トークン数(LINEメッセージは2000文字制限あり)

6️⃣ Renderにデプロイ(無料)

ローカル開発が完了したら、Renderにデプロイして本番公開します。

🎨 6.1 Renderとは?

Renderは無料枠のあるクラウドプラットフォームです。

特徴 説明
💰 無料枠 月750時間まで無料
🔒 HTTPS自動 SSL証明書が自動発行
🔄 自動デプロイ GitHubプッシュで自動デプロイ
😴 スリープ 15分無通信でスリープ(初回アクセス時に起動)

⚠️ 無料枠ではスリープ後の初回応答に10-30秒かかります。LINE Botでは許容範囲内です。

📁 6.2 デプロイ用ファイルを追加

render.yaml:

services:
  - type: web                # Webサービスとしてデプロイ
    name: line-bot           # サービス名(任意)
    env: python              # Python環境を使用
    buildCommand: pip install -r requirements.txt  # ビルド時に依存関係インストール
    startCommand: uvicorn main:app --host 0.0.0.0 --port $PORT  # 起動コマンド
    envVars:                 # 環境変数(Renderダッシュボードで値を設定)
      - key: LINE_CHANNEL_SECRET
        sync: false          # false = ダッシュボードで手動設定
      - key: LINE_CHANNEL_ACCESS_TOKEN
        sync: false
      - key: OPENAI_API_KEY
        sync: false

📝 sync: falseは「この値はダッシュボードで手動設定する」という意味です。機密情報をGitにコミットしないための設定。

🚀 6.3 デプロイ手順

① GitHubにプッシュ

git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/YOUR_USERNAME/line-bot-demo.git
git push -u origin main

② Renderでプロジェクト作成

  1. Render にログイン
  2. 「New +」→「Web Service」
  3. GitHubリポジトリを選択
  4. 設定を入力:
項目
Name line-bot(任意)
Region Singapore(日本に近い)
Branch main
Runtime Python 3
Build Command pip install -r requirements.txt
Start Command uvicorn main:app --host 0.0.0.0 --port $PORT
Instance Type Free

③ 環境変数を設定

Renderダッシュボードで「Environment」タブを開き、以下を追加:

Key Value
LINE_CHANNEL_SECRET (LINE Developersからコピー)
LINE_CHANNEL_ACCESS_TOKEN (LINE Developersからコピー)
OPENAI_API_KEY (OpenAIからコピー)

④ デプロイ完了を待つ

数分でデプロイが完了し、URLが発行されます:

https://line-bot-xxxx.onrender.com

🔗 6.4 Webhook URLを更新

LINE Developers Consoleで:

  1. Messaging API設定 → Webhook URL
  2. https://line-bot-xxxx.onrender.com/callback を入力
  3. 「更新」→「検証」で成功を確認 ✅

これで本番公開完了です!


7️⃣ よくあるエラーと対処法

❌ Invalid signature エラー

原因: チャンネルシークレットが間違っている

対処:

  1. LINE Developers Consoleでチャンネルシークレットを再確認
  2. Renderの環境変数を更新
  3. 再デプロイ

❌ Webhook検証失敗

原因: URLが到達不能、または/callbackパスが間違い

対処:

  1. Renderのデプロイが完了しているか確認
  2. URLの末尾に/callbackがついているか確認
  3. https://your-app.onrender.com/ にアクセスして{"status": "ok"}が返るか確認

🐢 初回応答が遅い

原因: Renderの無料枠はスリープする

対処:

  • 仕様なので許容する(10-30秒程度)
  • 有料プラン($7/月〜)でスリープ無効化
  • 定期的にヘルスチェックを送る(UptimeRobot等)

🐢 AI応答が遅い

原因: OpenAI APIの応答時間が長い

対処:

  • gpt-4o-miniなど高速なモデルを使用
  • max_tokensを小さくする

8️⃣ 応用アイデア

LINE Botの基本ができたら、以下のような拡張も可能です:

アイデア 説明
📍 位置情報Bot 位置情報を受け取って近くのお店を検索
🖼️ 画像処理Bot 画像を受け取ってOCRや画像認識
📋 リッチメニュー ボタン付きのメニューを表示
💳 Flex Message カード形式のリッチなメッセージ
💾 会話履歴保存 データベースに履歴を保存して文脈を保持

📌 まとめ

この記事では、Python/FastAPIでLINE Botを作成し、Renderにデプロイする方法を解説しました:

ステップ 内容
1️⃣ LINE Developers設定(アカウント作成、Messaging API有効化)
2️⃣ プロジェクトセットアップ(FastAPI + line-bot-sdk)
3️⃣ エコーBot実装(Webhook受信 → 返信)
4️⃣ ngrok設定(ローカル開発環境の外部公開)
5️⃣ AI応答Bot(OpenAI APIとの連携)
6️⃣ Renderにデプロイ(無料で本番公開)

LINE Botは一度作り方を覚えると、様々なサービスに応用できます。ぜひ自分だけのBotを作ってみてください!


💼 生成AI導入のご相談

LINE Bot開発やAI活用でお困りですか?

  • 🤖 ChatGPT/Claude活用の相談
  • ⚙️ 業務自動化ツールの開発
  • 💬 LINE連携システムの構築

お気軽にご相談ください。

👉 サービス詳細を見る | LINEで相談する

💬 生成AI・DX導入のご相談

この記事に関するご質問や、生成AI導入についてお気軽にご相談ください

LINEで相談する

© 2022-2025 infoHiroki. All rights reserved.