LINE公式アカウント、作ったまま放置してませんか?
「白米元気」というLINE公式アカウント、実はずっと眠らせていました。
作ったのはいいけど、手動で返信するのも面倒だし、かといって活用できるアイデアもなくて……。そんな状態がしばらく続いていたんですが、n8n × Claude Haiku × LINE Messaging APIの組み合わせで、ついにチャットボット化することができました。
今回はその構築の流れと、地味にハマったポイント3つを正直に書いていきます。非エンジニアでも再現できるように書くので、ぜひ最後まで読んでみてください。
全体の構成をざっくり説明
今回作ったチャットボットの仕組みはこんな感じです。
- ユーザーがLINEでメッセージを送る
- LINE Messaging APIがn8nのWebhookに転送する
- n8nがClaude Haikuに投げて返答を生成する
- 生成された返答をLINEのReply APIで返す
加えて、リッチメニュー(画面下部に出るボタンメニュー)もPythonで画像を自動生成してAPIでアップロードしました。友だち追加したときのウェルカムメッセージも設定済みです。
使ったツール・サービスはこちら:
- n8n(ワークフロー自動化ツール)
- Claude Haiku(Anthropicの軽量・高速LLM)
- LINE Messaging API(LINE公式アカウントのAPI)
- Python + Pillow(リッチメニュー画像の自動生成)
n8nワークフローの中身
n8nのワークフローはシンプルに3ステップです。
① Webhookノードでメッセージを受け取る
LINEからのイベントをn8nのWebhookで受け取ります。POSTリクエストで届くJSONの中に、ユーザーのメッセージや返信トークンが入っています。
// LINE WebhookのリクエストBody(抜粋)
{
"events": [
{
"type": "message",
"replyToken": "xxxxxxxxxxxxxxxx",
"message": {
"type": "text",
"text": "こんにちは!"
}
}
]
}
② Claude Haikuで返答を生成する
受け取ったテキストをClaude Haikuに渡して、返答を生成します。プロンプトには「150文字以内で返答してください」という制約を入れました。LINEでの会話なので、長すぎない方が自然ですよね。
③ LINE Reply APIで返信する
Claudeが生成した返答を、LINEのReply APIで送り返します。replyTokenを使うので、対象のユーザーだけに返信が届きます。
// Reply APIのリクエスト(抜粋)
POST https://api.line.me/v2/bot/message/reply
{
"replyToken": "xxxxxxxxxxxxxxxx",
"messages": [
{
"type": "text",
"text": "Claudeからの返答テキスト"
}
]
}
リッチメニューはPython×Pillowで自動生成
リッチメニューの画像(2500×1686px)をデザインツールで作るのが面倒だったので、PythonのPillowライブラリで自動生成することにしました。
ボタンを3つ配置して、それぞれに色と文字を入れるだけのシンプルなコードです。生成した画像はLINEのAPIでアップロードして、リッチメニューのIDと紐付けるだけでOK。
from PIL import Image, ImageDraw, ImageFont
# キャンバス作成(2500×1686px)
img = Image.new("RGB", (2500, 1686), color=(255, 255, 255))
draw = ImageDraw.Draw(img)
# ボタン1:AI相談
draw.rectangle([0, 0, 833, 1686], fill=(52, 152, 219))
draw.text((416, 843), "AI相談", fill="white", anchor="mm")
# ボタン2:副業情報
draw.rectangle([833, 0, 1666, 1686], fill=(46, 204, 113))
draw.text((1249, 843), "副業情報", fill="white", anchor="mm")
# ボタン3:お問い合わせ
draw.rectangle([1666, 0, 2500, 1686], fill=(231, 76, 60))
draw.text((2083, 843), "お問い合わせ", fill="white", anchor="mm")
img.save("richmenu.png")
フォントや色を変えるだけでオリジナルのリッチメニューが作れるので、非エンジニアでもコピペで対応できます。
ここが地味にハマった!3つのポイント
ここからが本番です。公式ドキュメントを読んでいてもなかなかわからなかった、実際にハマったポイントを正直に書きます。
ハマり① チャットモードの切り替え場所が違う
「Webhookを有効にしてもボットが反応しない……」と30分くらい悩みました。
原因はチャットモードの切り替え場所。てっきりLINE Developers(developers.line.biz)で設定するものだと思っていたんですが、実際は別のサイトで設定する必要があります。
✅ 正しい設定場所:manager.line.biz(LINE公式アカウントマネージャー)
「応答設定」→「応答モード」を「Bot」に切り替える
LINE DevelopersとLINEマネージャーは別サービスで、設定が分散しているんです。最初からここを知っていれば……と思いました。
ハマり② 「自動応答メッセージ」がONのままだと競合する
Webhookを有効にして、ようやくn8nが動いた!と思ったら、ユーザーに2通のメッセージが届くという謎の現象が起きました。
1通はClaudeからのちゃんとした返答、もう1通はLINEの標準自動応答メッセージ。
これも「応答設定」の問題でした。
✅ 解決策:manager.line.biz の「応答設定」で
「自動応答メッセージ」をOFFにする
Webhookを有効にしても、自動応答メッセージはデフォルトでONのままなんです。この2つは独立して動くので、両方ONだと競合して2重送信になります。地味に気づきにくいポイントでした。
ハマり③ Webhook URL設定APIのフィールド名が「endpoint」
APIでWebhook URLをプログラムから設定しようとしたとき、こんなリクエストを書きました。
// ❌ うまくいかなかった書き方
{
"webhookUrl": "https://example.com/webhook"
}
エラーにはならないのに、URLが反映されない……。ドキュメントをよく読んだら、正しいフィールド名は endpoint でした。
// ✅ 正しい書き方
{
"endpoint": "https://example.com/webhook"
}
LINE Messaging APIのWebhook設定エンドポイントでは、URLのフィールド名は
webhookUrlではなくendpointです。
こういう「エラーは出ないけど動かない」系のバグは本当に時間を取られます……。同じところでハマった方の参考になれば嬉しいです。
完成したチャットボットの動作まとめ
ハマりポイントを乗り越えて、最終的にできたものはこちらです。
- 🎉 友だち追加時:ウェルカムメッセージを自動送信
- 💬 テキストメッセージ送信時:Claude Haikuが150文字で返答
- 📋 リッチメニュー:3ボタン(AI相談 / 副業情報 / お問い合わせ)
n8nのワークフロー自体はとてもシンプルで、慣れれば1〜2時間で組めます。一番時間がかかったのは、ハマりポイントの調査でした(笑)。
Claude Haikuを選んだ理由は速さとコストです。LINEのチャットは即レスが大事なので、重いモデルより軽量なHaikuの方が体験がいい。コストも格安なので、個人運用にはぴったりです。
まとめ:眠ってたアカウントが24時間働く仕組みに変わった
LINE公式アカウントって、作るのは簡単なんですが「作った後どうするか」で詰まりがちですよね。手動運用は続かないし、放置するのももったいない。
でも今回のようにn8nとClaudeを組み合わせれば、寝ていても24時間自動で返答してくれるボットが作れます。しかもコードをゴリゴリ書く必要はなくて、n8nのノードを繋いでいくだけ。
非エンジニアでも十分挑戦できる構成なので、LINE公式アカウントを持て余している方はぜひ試してみてください。
次回は、リッチメニューのボタンに応じて返答を分岐させる方法や、会話の文脈を保持する仕組みについても書いていく予定です。
🎁 実際に試してみてください!
今回作ったチャットボット「白米元気」に話しかけてみると、Claudeが返答してくれます。ウェルカムメッセージとリッチメニューも確認できますよ。
👇 友だち追加して、実際のボットを体験してみてね!
➡ LINE公式「白米元気」を友だち追加する(@421fcjbg)
感想や質問はLINEで気軽に送ってみてください。Claudeが(たぶん)いい感じに答えてくれます 😄
この記事が参考になったら、ブログのブックマークやシェアもぜひよろしくお願いします!
