如何通过DirectLine API捕获用户typing事件?Facebook Messenger是否支持?
捕获DirectLine API(REST)中的用户Typing事件
我来帮你梳理下通过DirectLine API(REST)处理用户typing事件的具体方案,还有你提到的渠道兼容性问题——确实这部分容易让人混淆,咱们一步步来:
一、客户端给机器人发送Typing事件
如果是要从用户端把typing状态传给机器人,你需要构造一个符合DirectLine规范的POST请求:
- 接口地址:
https://directline.botframework.com/v3/directline/conversations/{conversationId}/activities - 请求头必须带上你的DirectLine密钥:
Authorization: Bearer YOUR_DIRECTLINE_SECRET - 请求体要严格按照这个格式来:
{ "type": "typing", "from": { "id": "你的用户ID", "name": "你的用户名" }, "conversation": { "id": "当前对话ID" } }
发送成功后,机器人端就能监听到ActivityTypes.Typing类型的活动,你可以在机器人代码里针对这个事件做相应处理。
二、客户端接收机器人的Typing事件
要是你需要在客户端捕获机器人正在输入的状态,有两种方式:
- WebSocket流式方式:连接这个地址
wss://directline.botframework.com/v3/directline/conversations/{conversationId}/stream,机器人发送的typing事件会实时推送到客户端,这种方式延迟最低。 - 轮询方式:定期调用
GET https://directline.botframework.com/v3/directline/conversations/{conversationId}/activities?watermark={上次返回的水印值},然后在返回的活动列表里筛选type为typing的条目即可。
三、关于渠道兼容性的关键说明
你提到的2017年的答复其实现在依然适用:Bot Framework本身是支持typing事件的,但能不能在具体渠道生效,完全取决于渠道自身的API支持:
- 支持的渠道:Slack、Skype、Teams,还有直接用DirectLine连接的Web Chat,这些渠道能正常传递typing事件,用户和机器人都能收到状态。
- 不支持的渠道:Facebook Messenger(截至目前还是不支持双向的typing事件传递),这类渠道会直接忽略typing事件,不管是用户还是机器人发的,都不会展示出来。
四、常见坑点排查
- 要是客户端发了typing事件但机器人没收到,先检查请求格式:
type字段必须是小写的"typing",还有请求头的授权密钥有没有过期或者写错。 - 要是机器人发了typing事件但客户端收不到,先确认你用的渠道是不是支持这个功能——如果是Facebook Messenger这类不支持的渠道,就算DirectLine传了事件,渠道也不会把它展示给用户。
内容的提问来源于stack exchange,提问作者Francisco Carriedo Scher
相关产品推荐
相关产品推荐

