Dialogflow集成Skype/Facebook Messenger未返回自定义Fulfillment响应问题
问题分析与解决方案
我帮你梳理下这个问题的核心原因,以及对应的解决办法:
为啥Skype和Messenger只返回默认响应?
你当前的代码用了actions-on-google这个库来生成响应,但这个库是专门给Google Assistant定制的——它输出的响应格式只符合Google生态的规范,Skype、Facebook Messenger这类第三方集成根本看不懂这种格式,所以它们会直接忽略你的Webhook返回内容,转而用你在Intent里设置的默认静态文本。而Dialogflow模拟器和Google Actions模拟器能正常工作,正是因为它们本身就是适配Google Assistant格式的。
解决办法:改用Dialogflow标准Webhook响应格式
要让第三方集成也能正确获取你的自定义响应,你需要抛弃actions-on-google,直接按照Dialogflow的通用Webhook规范来返回响应。核心是用fulfillmentText(通用文本)或者fulfillmentMessages(多平台自定义消息)字段来传递内容。
修改后的完整代码
const express = require('express') const bodyParser = require('body-parser') const app = express() app.use(bodyParser.json()) app.set('port', (process.env.PORT || 5000)) const LANGUAGE_INTENT = 'Languages'; const LANGUAGE_TYPE_ENTITY = 'LanguageType'; app.post('/webhook', (req, res) => { console.log(req.body); const intentName = req.body.queryResult.intent.displayName; // 处理Languages意图 if (intentName === LANGUAGE_INTENT) { const quote_type = req.body.queryResult.parameters[LANGUAGE_TYPE_ENTITY]?.toLowerCase(); let responseText = ""; switch(quote_type) { case "telugu": responseText = "Telugu, This response is for telugu"; break; case "english": responseText = "English, this is response is for english"; break; case "hindi": responseText = "Hindi, this response is for Hindi"; break; default: responseText = "Can't understand bro"; } // 返回Dialogflow标准响应格式 res.json({ fulfillmentText: responseText // 如果需要给不同平台做定制,可以用fulfillmentMessages // 示例:给Skype单独设置消息 // fulfillmentMessages: [ // { // platform: "SKYPE", // text: { // text: [responseText] // } // }, // { // platform: "FACEBOOK", // text: { // text: [responseText] // } // } // ] }); } // 处理其他未匹配的意图 else { res.json({ fulfillmentText: "Sorry, I didn't get that." }); } }); app.listen(app.get('port'), function () { console.log('* Webhook service is listening on port:' + app.get('port')); });
关键细节说明
- 移除了
actions-on-google相关的所有依赖和代码,直接处理Dialogflow的原始请求。 fulfillmentText是所有集成平台都能识别的通用字段,用它返回的文本会被Skype、Messenger等平台直接展示。- 如果需要给特定平台做样式或内容定制,可以用
fulfillmentMessages字段,指定platform参数来区分不同集成,不过fulfillmentText已经能满足基础的文本响应需求。
最后再检查两个点
- 打开你的Intent配置页面,在「响应」标签下,确保Webhook调用的优先级高于默认静态响应,不要让默认响应覆盖了Webhook的内容。
- 重新部署修改后的Webhook,然后在Dialogflow的「Fulfillment」页面测试一下URL的连通性,确保服务正常运行。
内容的提问来源于stack exchange,提问作者Baji shaik
相关产品推荐
相关产品推荐

