搭建 LINE 或 KakaoTalk AI 客服机器人,最实用的方式是把 Webhook 部署在自己的 VPS 上:面向 LINE 选日本东京(Tokyo, Japan),面向 KakaoTalk 选韩国首尔(Seoul, South Korea),再由服务器调用 OpenAI、Claude 或 Gemini 等大模型 API 生成回复。JUSTG 提供东京、首尔云服务器,配本地原生 IP,$19.99/月起,含 1 个 IPv4 + 免费 IPv6,付款后自动开通,一台服务器就能同时承载 HTTPS 接口、自动化工具和对话数据库。本文给出两种方案:自建 n8n(低代码)和轻量 Python Webhook,并讲清 HTTPS、延迟、速率限制、日本 APPI 与韩国 PIPA 下的本地日志,以及人工客服转接。
- 机房:日本东京(靠近 LINE 用户)、韩国首尔(KT 网络,靠近 KakaoTalk 用户)。
- IP 类型:日本或韩国原生 IPv4 + 免费 IPv6,可作为固定出口 IP 加入白名单。
- AI API:OpenAI、Claude、Gemini 在日韩均官方可用;JUSTG 于 2026 年 10 月用东京、首尔 IP 实测三者均可使用。
- 价格:JUSTG Tokyo Cloud VPS、JUSTG Seoul Cloud VPS $19.99/月起,最高 7 核 / 24 GB,$169.99/月。
- 俄罗斯莫斯科(Moscow, Russia)不适合调用这些 AI API 的机器人(俄罗斯不在支持范围内)。
LINE / KakaoTalk AI 机器人的工作原理
即时通讯平台把每条用户消息推送到你的 HTTPS Webhook,服务器向大模型要回复,再经平台 API 发回给用户。
- 客户给你的 LINE 官方账号或 Kakao Talk 频道发消息。
- LINE(Messaging API)或 Kakao(Kakao i Open Builder 技能)向你的地址 POST JSON,例如
https://api.example.com/line。 - 服务器校验请求、保存消息、补充 FAQ 或商品信息,然后调用大模型 API。
- 回复发回:LINE 通过回复 API 并使用短时有效的 reply token;Kakao 要求直接在 HTTP 响应里返回答案。
- 命中关键词或置信度低时,转给人工客服。
| 项目 | LINE(日本) | KakaoTalk(韩国) |
|---|---|---|
| 机器人框架 | LINE Messaging API、LINE 官方账号 | Kakao i Open Builder 技能服务器、Kakao Talk 频道 |
| 回复方式 | 先立即返回 HTTP 200,再用 reply token 调用回复 API | 在 Webhook 响应中直接返回答案(技能 JSON 2.0 版) |
| 时间要求 | reply token 很快过期,模型生成完立即回复 | 每次技能请求约 5 秒;较长回答需使用 Kakao 提供的回调功能(如已开通) |
| 请求校验 | X-Line-Signature 中的 HMAC-SHA256 签名 | 限制路径、增加密钥请求头或 token、校验 bot ID |
| 推荐 JUSTG 机房 | JUSTG Tokyo Cloud VPS | JUSTG Seoul Cloud VPS |
为什么把机器人放在东京或首尔
部署在通讯平台和用户附近能缩短往返时间,而且日韩都是主流大模型 API 的支持地区。
- 延迟预算。大模型调用通常要 1-4 秒,每一跳到 LINE 或 Kakao 服务器省下 100-200 毫秒都很关键,在 Kakao 约 5 秒的限制下尤其如此。
- AI API 可用性。OpenAI、Anthropic、Google 都支持日本和韩国;莫斯科不适合这个机器人,因为这些 API 不对俄罗斯开放。服务商政策随时可能变化,账号与付款检查依然适用。
- 固定原生 IP。VPS 有稳定的日本或韩国 IP,可以加入你自己的 CRM、订单系统或数据库防火墙白名单。
- 数据就近存放。对话日志存放在与客户同一国家的服务器上,隐私声明更好写。
方案 A:用 Docker Compose 自建 n8n
如果需要让非开发人员在可视化编辑器里修改流程、提示词和集成,n8n 是很好的选择。
在已安装 Docker 的 JUSTG 东京或首尔云服务器上,把 bot.example.com 解析到服务器 IP(例如 203.0.113.20),然后执行:
mkdir -p /opt/n8n && cd /opt/n8n
echo "N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)" > .env && chmod 600 .env
cat > docker-compose.yml <<'YML'
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
env_file: .env
environment:
- N8N_HOST=bot.example.com
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://bot.example.com/
- GENERIC_TIMEZONE=Asia/Tokyo
- TZ=Asia/Tokyo
ports: ["127.0.0.1:5678:5678"]
volumes: ["n8n_data:/home/node/.n8n"]
restart: unless-stopped
volumes:
n8n_data:
YML
docker compose up -d
再用 Caddy 给 n8n 和 Python 应用(方案 B)做反向代理,它会自动申请 Let's Encrypt 证书:
apt install -y caddy
cat > /etc/caddy/Caddyfile <<'CFG'
bot.example.com {
reverse_proxy 127.0.0.1:5678
}
api.example.com {
reverse_proxy 127.0.0.1:8000
}
CFG
systemctl reload caddy
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable
在 n8n 编辑器中搭建流程:Webhook 节点(POST,路径 line)→ Code 节点校验 LINE 签名 → IF 节点判断转人工关键词 → OpenAI 或 Anthropic 对话节点(写入系统提示词)→ HTTP Request 节点请求 https://api.line.me/v2/bot/message/reply。把 Webhook 节点设为立即响应,让 LINE 马上收到 HTTP 200。Kakao 则在流程末尾用 "Respond to Webhook" 返回技能 JSON。API 密钥只保存在 n8n 凭证中,凭证会用 N8N_ENCRYPTION_KEY 加密。
方案 B:轻量 Python Webhook 骨架
约 70 行的 FastAPI 应用更便于版本管理和测试,同时支持 LINE 与 Kakao。
# app.py - pip install fastapi uvicorn httpx openai
import base64, hashlib, hmac, os, sqlite3, time
import httpx
from fastapi import FastAPI, Request, BackgroundTasks, HTTPException
from openai import OpenAI
LINE_SECRET = os.environ["LINE_CHANNEL_SECRET"].encode()
LINE_TOKEN = os.environ["LINE_CHANNEL_TOKEN"]
llm = OpenAI() # reads OPENAI_API_KEY
db = sqlite3.connect("/data/chat.db", check_same_thread=False)
db.execute("CREATE TABLE IF NOT EXISTS log(ts, channel, user_id, role, text)")
SYSTEM = "You are the support assistant of Example Shop. Answer briefly in the user's language. If unsure, say a staff member will follow up."
HANDOFF = ("担当者", "オペレーター", "상담원", "human", "staff")
app = FastAPI()
def log(ch, uid, role, text):
db.execute("INSERT INTO log VALUES (?,?,?,?,?)", (time.time(), ch, uid, role, text)); db.commit()
def answer(text):
r = llm.chat.completions.create(model="gpt-4o-mini", max_tokens=400,
messages=[{"role": "system", "content": SYSTEM}, {"role": "user", "content": text}])
return r.choices[0].message.content
def handle_line(event):
uid, text = event["source"]["userId"], event["message"]["text"]
log("line", uid, "user", text)
if any(k in text for k in HANDOFF):
reply = "スタッフにおつなぎします。少々お待ちください。"
else:
reply = answer(text)
log("line", uid, "bot", reply)
httpx.post("https://api.line.me/v2/bot/message/reply", timeout=10,
headers={"Authorization": f"Bearer {LINE_TOKEN}"},
json={"replyToken": event["replyToken"], "messages": [{"type": "text", "text": reply[:4900]}]})
@app.post("/line")
async def line_webhook(req: Request, bg: BackgroundTasks):
body = await req.body()
sig = base64.b64encode(hmac.new(LINE_SECRET, body, hashlib.sha256).digest()).decode()
if not hmac.compare_digest(sig, req.headers.get("x-line-signature", "")):
raise HTTPException(403)
for ev in (await req.json()).get("events", []):
if ev.get("type") == "message" and ev["message"].get("type") == "text":
bg.add_task(handle_line, ev) # return 200 at once, work in background
return "OK"
@app.post("/kakao")
async def kakao_skill(req: Request):
data = await req.json()
uid = data["userRequest"]["user"]["id"]; text = data["userRequest"]["utterance"]
log("kakao", uid, "user", text)
reply = answer(text) # must finish within Kakao's ~5 s skill timeout
log("kakao", uid, "bot", reply)
return {"version": "2.0", "template": {"outputs": [{"simpleText": {"text": reply[:1000]}}]}}
用 systemd 运行,只监听本机地址:
mkdir -p /data && chmod 700 /data
python3 -m venv /opt/bot/venv && /opt/bot/venv/bin/pip install fastapi uvicorn httpx openai
# put LINE_CHANNEL_SECRET, LINE_CHANNEL_TOKEN, OPENAI_API_KEY in /opt/bot/.env (chmod 600)
cat > /etc/systemd/system/bot.service <<'UNIT'
[Unit]
Description=LINE/Kakao AI bot
After=network-online.target
[Service]
WorkingDirectory=/opt/bot
EnvironmentFile=/opt/bot/.env
ExecStart=/opt/bot/venv/bin/uvicorn app:app --host 127.0.0.1 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload && systemctl enable --now bot
在 LINE Developers 控制台把 Webhook URL 设为 https://api.example.com/line 并点击 Verify;在 Kakao i Open Builder 中把 https://api.example.com/kakao 注册为技能并关联到兜底块。确认错误签名会被快速拒绝:
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" -X POST https://api.example.com/line \
-H "x-line-signature: invalid" -d '{"events":[]}'
# expected: 403 and a time well under 1 s
journalctl -u bot -fHTTPS、延迟与速率限制
两个平台都要求公网 HTTPS 地址和有效证书,也都对慢响应不友好。
- 证书:使用真实域名和受信任证书(Caddy 自动申请 Let's Encrypt),自签证书和裸 IP 不能作为 Webhook 地址。
- 快速应答:LINE Webhook 要立即确认,大模型处理放到后台;Kakao 要选响应快的模型、限制
max_tokens、精简提示词,确保在时限内返回。 - 平台限制:LINE Messaging API 各接口有速率限制,主动推送(push)会计入方案的月度消息额度,而回复用户消息不计入,因此尽量用回复而不是推送。
- 大模型限制:遇到 HTTP 429 时返回礼貌的兜底文案并指数退避重试,同时在厂商后台设置预算和告警。
- 防滥用:在代码里限制每个用户每分钟的消息数,调用大模型前截断过长输入。
对话日志本地保存:APPI 与 PIPA 基础
聊天记录包含个人信息,应存放在自己的服务器上、只保留必要期限,并告知客户 AI 的使用方式。
- 日本 APPI(个人信息保护法):明确利用目的、做好安全管理;向境外服务商(例如美国的大模型 API)提供个人数据时,需履行额外的告知或取得同意等义务。
- 韩国 PIPA(个人信息保护法):只收集必要信息并清楚告知或取得同意,披露境外传输和受托处理方,保存期满后删除。
- 尽量在发送给大模型前对手机号、邮箱、订单号做脱敏。
- 加密磁盘备份、限制 SSH,SQLite 或 Postgres 数据库不要暴露在公网。
- 以上为一般信息,不构成法律意见,具体情况请咨询当地律师。
让客户满意的人工转接
好的机器人知道何时停下:客户要求、投诉、涉及金钱或账号的问题,都应转给真人。
- 触发条件:出现 "担当者"、"オペレーター"、"상담원"、"人工" 等关键词,连续多次答不上来,或涉及退款、支付。
- 在数据库中把该用户标记为 "人工模式",机器人停止回答,并通过邮件、Slack 或 LINE WORKS 通知客服。
- 客服在 LINE Official Account Manager 的聊天功能或 Kakao 频道的咨询聊天中回复,处理完再切回机器人模式。
- 在转接消息中告诉客户服务时间和预计等待时长。
选哪个 JUSTG 方案
客服机器人对 CPU 要求不高,内存取决于是否同时运行 n8n 和数据库。
| 部署方式 | 建议内存 | 机房 |
|---|---|---|
| Python Webhook + SQLite,单个渠道 | 1-2 GB | LINE 选东京,Kakao 选首尔 |
| n8n + Webhook + Postgres | 2-4 GB | 与多数客户同一国家 |
| LINE 与 Kakao 同时接入,并基于商品文档做 RAG | 4-8 GB | 每个国家一台,或统一放东京 |
面向日本 LINE 用户可从 JUSTG 东京云服务器 起步,面向韩国 KakaoTalk 用户可选 JUSTG 首尔云服务器;两者均为亚洲优化线路,之后也可以在服务页面的升级选项中随时添加 IP。支持定制配置(更多 CPU、内存、硬盘、带宽或 IP),请通过工单联系销售获取报价。更多 AI 部署场景见 AI VPS 专题页。
常见问题
LINE 聊天机器人的服务器放在哪里最好?
首选日本东京:LINE 的主要用户在日本,而且主流大模型 API 在日本官方可用。JUSTG 东京云服务器提供日本原生 IP,$19.99/月起,足够运行 Webhook 加 n8n。
KakaoTalk 聊天机器人能接入 ChatGPT 或 Claude 吗?
可以。Kakao i Open Builder 的技能服务器可以调用 OpenAI、Claude 或 Gemini API,并在 Kakao 约 5 秒的时限内返回答案。部署在 JUSTG 首尔云服务器上,到 Kakao 的往返更短。
LINE Webhook 必须使用 HTTPS 吗?
是的。LINE 只接受带有效证书的 HTTPS Webhook 地址。在 VPS 上配好域名,用 Caddy 或 Nginx 申请免费的 Let's Encrypt 证书即可。
可以把机器人放在莫斯科 VPS 上吗?
如果要调用 OpenAI、Claude 或 Gemini 就不行,这些 API 不对俄罗斯开放。机器人请放在 JUSTG 东京或首尔;JUSTG 莫斯科云服务器更适合不依赖这些 API 的俄罗斯市场业务。
上线你的机器人
一台小型 VPS 就能 7×24 小时接待 LINE 和 KakaoTalk 客户,日志也完全掌握在自己手里。订购 JUSTG 东京云服务器 或 JUSTG 首尔云服务器,按上面的步骤部署,遇到问题可随时通过工单联系 7×24 小时技术支持。