如何捕获Dialogflow接收的超256字符消息并引导至人工客服?
当然可行!我之前帮好几个开发者处理过类似的场景,核心思路就是在请求到达Dialogflow之前加一层拦截,把超长消息提前过滤出来单独处理,不让它们进入Dialogflow的流程,这样就不会触发它的字符长度报错了。
具体实现方法
1. 在Facebook Webhook中转层做前置拦截
如果你的机器人之前是通过Facebook Webhook直接对接Dialogflow的,现在需要改成用自己的后端服务做中转:
- 让Facebook把用户消息先发送到你的后端接口
- 在后端里先解析请求体,提取用户输入的
message.text内容 - 判断这个文本的字符长度是否超过256:
- 如果超过,直接调用Facebook的消息API给用户返回引导转人工的回复,不用把请求传给Dialogflow
- 如果长度正常,再把请求转发给Dialogflow,拿到Dialogflow的回复后再返回给Facebook
给你一个Node.js/Express的简单示例代码:
const express = require('express'); const fetch = require('node-fetch'); const app = express(); app.use(express.json()); app.post('/facebook-webhook', async (req, res) => { // 提取用户消息和发送者ID const messagingEvent = req.body.entry[0].messaging[0]; const userId = messagingEvent.sender.id; const userMessage = messagingEvent.message?.text; // 检查消息长度是否超限 if (userMessage && userMessage.length > 256) { // 直接回复引导转人工 await sendFacebookMessage(userId, "抱歉,你的消息过长啦,我暂时无法处理,请联系在线人工客服哦~"); return res.sendStatus(200); } // 消息正常,转发给Dialogflow处理 const dialogflowRes = await fetch(`https://dialogflow.googleapis.com/v2/projects/${YOUR_PROJECT_ID}/agent/sessions/${userId}:detectIntent`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${YOUR_DIALOGFLOW_TOKEN}` }, body: JSON.stringify({ queryInput: { text: { text: userMessage, languageCode: 'zh-CN' } } }) }); const dialogflowData = await dialogflowRes.json(); const botReply = dialogflowData.queryResult.fulfillmentText; // 把Dialogflow的回复发给用户 await sendFacebookMessage(userId, botReply); res.sendStatus(200); }); // 封装发送消息到Facebook的函数 async function sendFacebookMessage(userId, text) { const fbToken = process.env.FACEBOOK_PAGE_ACCESS_TOKEN; await fetch(`https://graph.facebook.com/v18.0/me/messages?access_token=${fbToken}`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ recipient: { id: userId }, message: { text } }) }); } app.listen(3000, () => console.log('Server running on port 3000'));
2. 兜底方案:Dialogflow错误处理配置
如果担心前置拦截有漏网之鱼,可以在Dialogflow里配置错误处理作为补充:
- 进入Dialogflow控制台,点击左侧菜单的设置 → 错误处理
- 添加一个新的错误处理规则,选择触发条件为“输入长度超过限制”
- 设置对应的回复内容为引导转人工的话术
不过要注意:Dialogflow对超长输入可能直接拒绝请求,不会进入错误处理流程,所以这个只能作为补充,核心还是靠前置拦截。
3. 关键注意点
- 务必确保Facebook Webhook的接收地址是你的后端接口,而不是Dialogflow的直接集成地址。如果之前是直接用Dialogflow绑定Facebook,需要解绑后重新配置到你的后端。
- 处理Facebook请求时要验证签名,避免恶意请求(可以参考Facebook官方文档的签名验证方法)。
- 测试时要覆盖边界情况:比如刚好256字符、257字符、空消息等,确保拦截逻辑稳定。
内容的提问来源于stack exchange,提问作者chocolate cake
相关产品推荐
相关产品推荐

