Viber机器人传入无文本附件消息时如何触发Dialogflow ES对应意图
Dialogflow ES对接Viber机器人触发位置类消息对应意图解决方案
问题背景
对接Dialogflow ES与Viber机器人时,收到用户发送的无文本位置共享类附件消息,无法通过常规训练短语匹配触发对应意图,传入请求结构示例如下:
"payload": { "attachments": [ { "payload": { "long": ##.####, "address": "xxxxxxxx", "lat": ##.##### }, "type": "location" } ], "source": "viber", "body": { "sender": { "language": "en-GB", "api_version": 10, "country": "xx", "id": "xxxxxx", "name": "xxxx xxxx" }, "silent": false, "event": "message", "message_token": xxxx, "chat_hostname": "xxxxx", "message": { "location": { "lat": ##.#####, "lon": ##.##### }, "type": "location" }, "timestamp": xxxxx }, "contact": { "channelId": xxxx, "cId": "########", "contactId": ####### } }
解决方案
推荐优先使用事件触发意图方案,无需构造虚拟文本,避免和普通文本意图冲突,实现逻辑如下:
- 第一步:消息预处理拦截
在将Viber请求转发给Dialogflow ES之前,先做消息类型判断:读取payload.attachments[0].type或者payload.body.message.type字段,判断是否为location类型的位置消息,同时提取经纬度、地址等位置参数。 - 第二步:调用Dialogflow接口指定事件
调用Dialogflow的detectIntent接口时,不使用文本输入类型,直接传入事件类型参数,示例请求结构如下:
{ "query_input": { "event": { "name": "VIBER_LOCATION_RECEIVED", "parameters": { "lat": 提取到的纬度值, "lon": 提取到的经度值, "address": "提取到的地址信息" }, "language_code": "对应你使用的语言编码,比如en-GB" } }, // 其他必要参数比如session等按正常填写即可 }
- 第三步:Dialogflow控制台配置意图
在Dialogflow ES控制台新建对应意图,在意图的「事件」配置项中填入你自定义的事件名VIBER_LOCATION_RECEIVED,无需添加任何训练短语,保存即可。
后续只要你转发的位置消息触发了对应事件,就会自动匹配到该意图,同时你传入的位置参数也会自动带入到意图的参数列表中,可直接用于后续回复逻辑。
备选方案(构造虚拟文本匹配)
如果不想用事件触发,也可以采用构造虚拟文本的方案:
- 预处理判断为位置消息后,给Dialogflow传入固定的虚拟文本,比如
USER_SHARE_LOCATION - 在对应意图的训练短语中添加该固定字符串即可匹配,位置参数同样可以放入请求的payload中传递
内容的提问来源于stack exchange,提问作者MBMSOFT
相关产品推荐
相关产品推荐

