title: "LINE Bot × Claude AI — ゼロから30分でデプロイした記録"
date: 2026-02-22
tags: [LINE, chatbot, Claude, AI, deploy]
LINE Bot × Claude AI — ゼロから30分でデプロイした記録
LINE Messaging APIとClaude AIを組み合わせたチャットボットを作り、ゼロからデプロイまで約30分で完了した。技術的に難しいことは何もなかったが、LINE側の設定周りにいくつかハマりポイントがあったので記録しておく。
なぜLINE Botなのか
日本で生活していると、LINEは避けて通れない。友人も取引先もLINEで連絡してくる。そこに自前のAIボットがいれば、ちょっとした質問への自動応答や、将来的には予約管理・顧客対応など、ビジネス用途にも展開できる。
まずはミニマムで始める。テキストを送ったらClaudeが返答する。画像を送ったらVisionで描写する。それだけ。
技術構成
LINE App → LINE Platform → Webhook → Nginx → Express (port 3400) → Claude API → Reply
- サーバー: 宝塔(192.168.3.11)
- フレームワーク: Express.js
- AI: Claude API(Anthropic)
- SSL: Let's Encrypt(linebot.techsfree.com)
- プロセス管理: PM2
LINE Messaging APIはWebhookでイベントを受け取る仕組みなので、公開URLとSSLが必須。宝塔にNginxリバースプロキシとLet's Encryptを設定済みの環境があったので、ここはスムーズだった。
LINE側の設定
LINE Developers Consoleでの設定が一番時間がかかった部分だ:
1. プロバイダー作成: Techsfreeという名前で作成
2. Messaging APIチャネル作成: Channel ID、Secret、Tokenを取得
3. Webhook URL設定: https://linebot.techsfree.com/webhook
4. 自動応答メッセージ: OFF(Claudeが応答するので不要)
5. あいさつメッセージ: OFF(同上)
特に注意すべきは、自動応答メッセージとあいさつメッセージのOFF設定。これをONのままにすると、Claudeの応答とLINE公式の定型文が二重に送信される。LINE Official Account Managerの「応答設定」から変更する必要があり、Developers Consoleからは変更できない。この導線の分かりにくさはLINEの伝統芸。
コード
コア部分は驚くほどシンプルだ:
app.post('/webhook', async (req, res) => {
res.status(200).end(); // まず200を返す(3秒ルール)
for (const event of req.body.events) {
if (event.type === 'message') {
if (event.message.type === 'text') {
const reply = await askClaude(event.message.text);
await replyMessage(event.replyToken, reply);
} else if (event.message.type === 'image') {
const imageData = await getImageContent(event.message.id);
const description = await describeImage(imageData);
await replyMessage(event.replyToken, description);
}
}
}
});
ポイントはres.status(200).end()を最初に実行すること。LINE PlatformはWebhookの応答を3秒以内に期待しており、Claude APIの応答を待ってからレスポンスを返すとタイムアウトする。非同期で処理して、replyTokenで後から返信する設計が正解。
画像処理はLINE APIから画像バイナリを取得し、Base64エンコードしてClaude Vision APIに投げる。Claudeのマルチモーダル機能のおかげで、画像認識のために別のサービスを用意する必要がない。
/helpと/reset
最低限のコマンドとして/help(使い方表示)と/reset(会話履歴リセット)を実装した。会話履歴はインメモリで保持しているので、PM2が再起動すれば自動的にリセットされる。永続化は将来の課題。
デプロイ
先ほど構築したdeploy.shにlinebot.confを追加:
APP_NAME=linebot
LOCAL_DIR=/home/linou/shared/99_Projects/linebot/
DEPLOY_TARGET=/www/apps/linebot/
PM2_NAME=linebot
PORT=3400
DOMAIN=linebot.techsfree.com
NO_DELETE=true
deploy linebot一発でデプロイ完了。標準化の恩恵を早速受けている。
Webhook検証
LINE Developers Consoleの「Verify」ボタンを押して、Webhookの疎通を確認。ステータスコード200が返ってくれば成功。ここで失敗する場合は、大抵SSLの問題かNginxの設定ミス。
実際にLINEアプリから友だち追加(@982pfmjz)してメッセージを送信。Claudeからの応答が返ってきた瞬間は、毎回やっても嬉しいものがある。
今後の展開
現時点ではシンプルなQ&Aボットだが、いくつかの方向性が見えている:
30分で動くものが作れる時代だからこそ、「作ってから考える」アプローチが有効だ。完璧な設計を先にするより、動くプロトタイプを出して、使いながら育てる。LINE Botはその実験台として最適だった。
友だち追加はこちら: @982pfmjz