2026-10-10 · 原文发布日
n8n模板:LINE与Slack互通的多语言客服翻译桥
该n8n模板把LINE客户消息接进Slack供日语客服处理:Claude识别语言并翻成日语进线程,客服回复再译回客户语言,发送前用代码核对数字、网址、邮箱未被改动,另做一次盲回译供人工检查,最后经LINE Messaging API推送并回写Data Table状态。语言识别不确定时按日语原文发送,作者公开了自测样本与局限。
原文要点
来源是n8n官方模板第20728号(免费,作者久保田卓磨):LINE客户消息经webhook进n8n,校验签名、去重重投事件、只留文本;Claude识别语言并译成日语,连同原文发到Slack客户线程,线程号与语言存入n8n Data Table;Slack线程里人工回复(排除机器人与//前缀消息)触发反向翻译;发送前用代码核对日语原稿中的数字、网址、邮箱在译文中出现,失败则Slack告警停止;通过后另起一次看不到日语原文的盲回译供人工阅读;最终经LINE Messaging API推送并更新状态。作者自测84句中盲回译与原日语一致仅3例(4%),非盲达43%;数字守卫不识别汉字数字如“三千円”,会把15:00改写成3 PM的译文拦下;语言不确定时按日语原文发送。免费LINE套餐推送月配额200条。
这次做成什么
照着模板逻辑搭一个练习版翻译桥:用n8n Data Table记录客户线程,演练“客服日语回复→翻译→数字/网址守卫→盲回译→推送”的完整校验链,重点掌握守卫代码和盲回译这两个可独立复用的校验件。
准备什么
- n8n实例可通过HTTPS被LINE和Slack访问(webhook需要)
- LINE官方账号的Messaging API频道访问令牌与频道密钥
- Slack工作区及具有chat:write、channels:read、channels:history、reactions:write权限的应用
- Anthropic API Key,以及按指定列建好的n8n Data Table
具体怎么做
建Data Table与凭据
在n8n新建Data Table,命名如line_slack_threads,建字符串列line_user_id、slack_ts、status、last_inquiry、language、language_name,并在所有Data Table节点选中它。分别添加Slack、Anthropic凭据,LINE用Header Auth凭据(Authorization: Bearer 加频道令牌),频道密钥单独保存给签名HMAC步骤用。
接入站方向(LINE→Slack)
webhook节点接收LINE事件后先做签名校验与事件去重,过滤只留文本消息;调Claude识别语言并译成日语,同时生成一句客户语言的确认语;用LINE回复接口发确认语,把原文加日语译文发到Slack(已有线程则回线程,否则新建线程),把线程时间戳和语言写入Data Table。
接出站方向与两道校验
Slack Trigger监听消息,只处理客户线程内的人工回复(排除机器人消息和//开头)。按slack_ts查Data Table找到客户记录;若客户语言非日语,调Claude把客服日语回复译成客户语言。随后运行守卫代码:从日语原稿提取数字、URL、邮箱,逐一检查是否出现在译文中,缺失则发Slack告警并停止。通过后另起一次Claude调用做盲回译(译文→日语,不提供原稿),把译文与回译都贴回Slack线程供人工过目。
推送与收尾
用LINE Messaging API的push接口把译文发给客户,给Slack回复加✅表情,把Data Table的status更新为replied;发送失败时把错误也写回Slack线程。练习阶段可先把push节点换成写日志,确认链路后再接真实推送。
可直接复制的材料
数字/网址/邮箱守卫(独立JavaScript示例,用于Code节点)
本站独立编写的练习守卫,与作者描述的数字/网址/邮箱三类检查一致;同样不识别汉字数字,时间格式改写(15:00→3 PM)会按设计被拦。
// 输入:items[0].json.sourceText(日语原稿)与 items[0].json.translation(译文)
const src = $input.first().json.sourceText;
const dst = $input.first().json.translation;
const patterns = {
numbers: /\d+(?:\.\d+)?/g,
urls: /https?:\/\/[^\s))]+/g,
emails: /[\w.+-]+@[\w-]+\.[\w.]+/g
};
const missing = [];
for (const [kind, re] of Object.entries(patterns)) {
for (const m of (src.match(re) || [])) {
if (!dst.includes(m)) missing.push(kind + ':' + m);
}
}
return [{ json: { ok: missing.length === 0, missing, sourceText: src, translation: dst } }];盲回译提示词(本站重写版)
本站独立撰写;关键设计是这次调用不传入日语原稿,避免回译照着原文写——原作者测试显示同一次调用内做回译有43%与原文一致,盲回译仅4%,说明只有盲测才有校验价值。
你是翻译员。把下面的{customer_language}文本逐句译成日语。只输出日语译文,不要解释、不要加注释、不要改动数字、网址和邮箱。
文本:
{translation}输入与输出示例
本站虚构演示,未调用任何真实API;数字对应关系为示意设计。
输入
客服在Slack线程回复日语:「交換用フィルターは2枚同梱です。到着予定は15:00以降、詳細は https://shop.example.com/tracking?id=88213 で確認できます。」客户语言为英语。对应输出
守卫提取原稿关键项:[2, 15:00, https://shop.example.com/tracking?id=88213];若译文为“The kit includes 2 filters. Expected after 3 PM, see https://shop.example.com/tracking?id=88213”,守卫返回 ok=false、missing=["numbers:15:00"],Slack线程收到告警“译文缺失原稿中的 15:00”,流程停止不推送;人工把译文改为“after 15:00”后重发,守卫ok=true,盲回译结果“交換用フィルター2枚同梱、15:00以降到着予定”贴回线程供人工比对。做完检查这些
- 构造含数字、网址、邮箱的日语回复,译文完整保留时守卫返回ok=true且不告警
- 把译文中的数字改掉或删掉,守卫必须在Slack线程告警并停止推送
- 盲回译调用中提示词不含日语原稿,回译文本出现在Slack线程供人工阅读
- 语言识别为unknown时按设计直接发送日语原文,确认语以日语和英语发出
容易卡住的地方
- 守卫只查数字、网址、邮箱三类,汉字数字(三千円)和语义错误检不出来,盲回译仍需人工读
- Slack Trigger也会被机器人自己的发帖触发,一条客户消息可能消耗多次执行,测试时注意执行计数
- 只处理文本消息,图片和贴纸被忽略;客户消息会发给Anthropic,注意隐私告知
- 原文发布时作者称LINE免费套餐推送月配额200条,当前配额须在账号核对,练习时优先用回复接口或写日志代替push
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Route and translate LINE chats between Slack and LINE with Claude
- 原作者
- 久保田 卓磨
- 原始发布日期
- 2026-10-10T07:29:36.146Z
- 来源
- https://n8n.io/workflows/20728