Самый практичный способ сделать AI-бота поддержки для LINE или KakaoTalk — разместить вебхук на собственном VPS в Токио (Tokyo, Japan) для LINE или в Сеуле (Seoul, South Korea) для KakaoTalk и вызывать из него LLM API — OpenAI, Claude или Gemini — для подготовки ответов. JUSTG предлагает облачные VPS в Токио и Сеуле с родными местными IP от $19.99/мес: 1 IPv4 + бесплатный IPv6, автоматическое развёртывание после оплаты. На одном сервере помещаются HTTPS-эндпоинт, инструмент автоматизации и база диалогов. В статье два варианта — self-hosted n8n (low-code) и компактный Python-вебхук, а также HTTPS, задержки, лимиты, хранение логов по японскому APPI и корейскому PIPA и передача диалога живому оператору.
- Площадки: Токио, Япония (рядом с пользователями LINE) и Сеул, Южная Корея, сеть KT (рядом с пользователями KakaoTalk).
- Тип IP: родной японский или корейский IPv4 + бесплатный IPv6; удобен как фиксированный адрес для белых списков.
- AI API: OpenAI, Claude и Gemini официально доступны в Японии и Корее; JUSTG проверила свои IP в Токио и Сеуле со всеми тремя в октябре 2026 года.
- Цена: JUSTG Tokyo Cloud VPS и JUSTG Seoul Cloud VPS от $19.99/мес, до 7 ядер / 24 ГБ за $169.99/мес.
- Москва (Moscow, Russia) не подходит для ботов, вызывающих эти AI API: в России они недоступны.
Как устроен AI-бот для LINE или KakaoTalk
Мессенджер отправляет каждое сообщение пользователя на ваш HTTPS-вебхук, сервер запрашивает ответ у LLM и возвращает его через API платформы.
- Клиент пишет в ваш LINE Official Account или канал Kakao Talk Channel.
- LINE (Messaging API) или Kakao (скилл Kakao i Open Builder) отправляет POST с JSON на ваш адрес, например
https://api.example.com/line. - Сервер проверяет запрос, сохраняет сообщение, добавляет контекст из FAQ или каталога и вызывает LLM API.
- Ответ уходит обратно: в LINE — через reply API с краткоживущим reply token, в Kakao — прямо в HTTP-ответе.
- Ключевые слова или неуверенный ответ запускают передачу оператору.
| Параметр | LINE (Япония) | KakaoTalk (Корея) |
|---|---|---|
| Платформа бота | LINE Messaging API, LINE Official Account | Скилл-сервер Kakao i Open Builder, Kakao Talk Channel |
| Как отвечать | Сразу вернуть HTTP 200, затем вызвать reply API с reply token | Вернуть ответ в теле ответа вебхука (skill JSON, версия 2.0) |
| Ограничение по времени | Reply token быстро истекает — отвечайте сразу после LLM | Около 5 секунд на запрос скилла; для длинных ответов — callback Kakao, если он подключён |
| Проверка запроса | Подпись HMAC-SHA256 в X-Line-Signature | Ограничить путь, секретный заголовок или токен, проверка ID бота |
| Рекомендуемая площадка JUSTG | JUSTG Tokyo Cloud VPS | JUSTG Seoul Cloud VPS |
Почему бота стоит размещать в Токио или Сеуле
Размещение рядом с мессенджером и пользователями сокращает задержки, а обе страны входят в регионы, где работают крупные LLM API.
- Бюджет задержки. Вызов LLM обычно занимает 1-4 секунды; экономия 100-200 мс на каждом обмене с серверами LINE или Kakao важна, особенно при лимите Kakao около 5 секунд.
- Доступность AI API. OpenAI, Anthropic и Google поддерживают Японию и Корею. Москва для такого бота не подходит: эти API в России недоступны. Политика провайдеров может меняться, проверки аккаунта и оплаты сохраняются.
- Фиксированный родной IP. Стабильный японский или корейский IP легко добавить в белые списки вашей CRM, системы заказов или файрвола базы данных.
- Хранение данных в стране клиентов. Логи диалогов лежат на сервере в той же стране, что и клиенты, — проще оформить уведомление о конфиденциальности.
Вариант A: self-hosted n8n в Docker Compose
n8n удобен, когда схему бота, промпты и интеграции должны править не только разработчики, а в визуальном редакторе.
На JUSTG Tokyo или Seoul Cloud VPS с установленным Docker направьте 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
Затем опубликуйте n8n и Python-приложение (вариант B) через Caddy — он сам получит сертификаты 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» со skill JSON. Ключи API храните только в Credentials n8n — они шифруются ключом N8N_ENCRYPTION_KEY.
Вариант B: каркас Python-вебхука
Приложение на FastAPI примерно из 70 строк проще хранить в Git и тестировать; оно обслуживает и 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, слушающий только localhost:
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 укажите вебхук https://api.example.com/line и нажмите Verify; в Kakao i Open Builder зарегистрируйте скилл https://api.example.com/kakao и привяжите его к fallback-блоку. Убедитесь, что неверные подписи отклоняются быстро:
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-адрес с валидным сертификатом и плохо переносят медленные ответы.
- Сертификаты: нужен реальный домен и доверенный сертификат (Let's Encrypt через Caddy). Самоподписанные сертификаты и голые IP в качестве вебхука не принимаются.
- Быстрый ответ: вебхуки LINE подтверждайте сразу, а работу с LLM выполняйте в фоне. Для Kakao берите быструю модель, ограничивайте
max_tokensи сокращайте промпты. - Лимиты мессенджера: у LINE Messaging API есть ограничения частоты по эндпоинтам, а push-сообщения расходуют месячную квоту тарифа, тогда как ответы на сообщения пользователей — нет. Предпочитайте reply, а не push.
- Лимиты LLM: на HTTP 429 отвечайте вежливым запасным текстом и повторяйте запрос с экспоненциальной паузой; задайте бюджеты и оповещения у провайдера.
- Защита от злоупотреблений: ограничьте число сообщений от одного пользователя в минуту и длину входного текста перед вызовом LLM.
Локальное хранение логов: основы APPI и PIPA
Логи чатов содержат персональные данные, поэтому храните их на своём сервере, только необходимый срок, и сообщайте клиентам об использовании AI.
- Япония, APPI (Закон о защите персональной информации): укажите цель использования, обеспечьте защиту данных; передача персональных данных провайдеру в другой стране (например, LLM API в США) требует дополнительного раскрытия или согласия.
- Корея, PIPA (Закон о защите персональной информации): собирайте только необходимое с понятным уведомлением или согласием, раскрывайте зарубежную передачу и обработчиков, удаляйте данные по истечении срока хранения.
- По возможности маскируйте телефоны, e-mail и номера заказов перед отправкой текста в LLM.
- Шифруйте резервные копии, ограничьте SSH и не открывайте SQLite или Postgres в интернет.
- Это общая информация, а не юридическая консультация; уточните детали у местного юриста.
Передача оператору, которая нравится клиентам
Хороший бот знает, когда остановиться: по просьбе клиента, при жалобах и во всём, что касается денег и аккаунтов, нужен человек.
- Триггеры: слова «担当者», «オペレーター», «상담원», «оператор», несколько неудачных ответов подряд, темы возврата и оплаты.
- Пометьте пользователя в базе как «режим оператора», чтобы бот замолчал, и уведомите сотрудников по e-mail, в Slack или LINE WORKS.
- Сотрудники отвечают из чата LINE Official Account Manager или консультационного чата канала Kakao, затем возвращают пользователя в режим бота.
- В сообщении о передаче укажите часы работы и ожидаемое время ответа.
Какой тариф JUSTG выбрать
Бот поддержки почти не нагружает CPU; объём RAM зависит от того, запускаете ли вы рядом n8n и базу данных.
| Конфигурация | Рекомендуемая RAM | Площадка |
|---|---|---|
| Python-вебхук + SQLite, один канал | 1-2 ГБ | Токио для LINE, Сеул для Kakao |
| n8n + вебхук + Postgres | 2-4 ГБ | Страна большинства клиентов |
| LINE и Kakao вместе, RAG по документации товаров | 4-8 ГБ | По VPS на страну или Токио для обоих |
Для LINE в Японии начните с JUSTG Tokyo Cloud VPS, для KakaoTalk в Корее — с JUSTG Seoul Cloud VPS; обе площадки с маршрутами, оптимизированными для Азии, а дополнительные IP можно добавить позже через Upgrade на странице услуги. Индивидуальные конфигурации (больше CPU, RAM, диска, трафика или IP) доступны по запросу — напишите в отдел продаж через тикет. Другие AI-сценарии — на странице AI VPS.
Частые вопросы
Где лучше разместить сервер для чат-бота LINE?
В Токио: основная аудитория LINE — в Японии, и крупные LLM API там официально доступны. JUSTG Tokyo Cloud VPS даёт родной японский IP от $19.99/мес — этого хватает для вебхука и n8n.
Может ли чат-бот KakaoTalk использовать ChatGPT или Claude?
Да. Скилл-сервер Kakao i Open Builder может вызывать API OpenAI, Claude или Gemini и возвращать ответ в пределах примерно 5 секунд. Размещение на JUSTG Seoul Cloud VPS сокращает путь до Kakao.
Нужен ли HTTPS для вебхука LINE?
Да. LINE принимает только HTTPS-адреса с валидным сертификатом. Привяжите домен к VPS и получите бесплатный сертификат Let's Encrypt через Caddy или Nginx.
Можно ли разместить бота на VPS в Москве?
Нет, если он вызывает OpenAI, Claude или Gemini — эти API в России недоступны. Бота размещайте в Токио или Сеуле, а JUSTG Moscow Cloud VPS лучше подходит для задач российского рынка, не зависящих от этих API.
Запустите своего бота
Один небольшой VPS позволяет круглосуточно отвечать клиентам в LINE и KakaoTalk и держать логи под своим контролем. Закажите JUSTG Tokyo Cloud VPS или JUSTG Seoul Cloud VPS, повторите шаги из статьи, а поддержка 24/7 поможет через тикет.