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公式アカウントの作成
- LINE Official Account Manager にアクセス
- LINEアカウントでログイン
- 「アカウントを作成」をクリック
- アカウント名を入力(例:「My Bot」)
- 業種を選択して作成完了
⚙️ 1.2 Messaging APIの有効化
- 作成したアカウントの「設定」→「Messaging API」
- 「Messaging APIを利用する」をクリック
- プロバイダーを選択(なければ新規作成)
- 利用規約に同意して有効化
🔐 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で:
- Messaging API設定 → Webhook URL
https://xxxx-xx-xx-xxx-xx.ngrok-free.app/callbackを入力- 「更新」をクリック
- 「検証」をクリックして成功を確認 ✅
✅ 4.5 動作確認
- 📱 QRコードからBotを友だち追加
- 💬 テキストメッセージを送信
- 🔄 同じメッセージが返ってくれば成功!
5️⃣ OpenAI API連携(AI応答Bot化)
エコーBotをChatGPTが応答するBotに拡張します。
📦 5.1 追加パッケージ
requirements.txtに追加:
openai==1.6.0
インストール:
pip install openai
🔑 5.2 OpenAI APIキーの取得
- OpenAI Platform にアクセス
- API Keys → Create new secret key
- キーをコピー
.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でプロジェクト作成
- Render にログイン
- 「New +」→「Web Service」
- GitHubリポジトリを選択
- 設定を入力:
| 項目 | 値 |
|---|---|
| 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で:
- Messaging API設定 → Webhook URL
https://line-bot-xxxx.onrender.com/callbackを入力- 「更新」→「検証」で成功を確認 ✅
これで本番公開完了です!
7️⃣ よくあるエラーと対処法
❌ Invalid signature エラー
原因: チャンネルシークレットが間違っている
対処:
- LINE Developers Consoleでチャンネルシークレットを再確認
- Renderの環境変数を更新
- 再デプロイ
❌ Webhook検証失敗
原因: URLが到達不能、または/callbackパスが間違い
対処:
- Renderのデプロイが完了しているか確認
- URLの末尾に
/callbackがついているか確認 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連携システムの構築
お気軽にご相談ください。