基于Dialogflow开发Telegram机器人:如何响应联系人分享请求?
当然可以实现!Dialogflow虽然没有原生支持Telegram的联系人/位置事件,但我们有两种可靠的方案来搞定这个需求,下面我一步步给你讲清楚:
方案一:创建自定义事件触发Dialogflow意图
这种方式更贴合Dialogflow的事件驱动模型,适合需要把联系人分享作为对话触发点的场景:
在Dialogflow中创建自定义事件
打开你的Dialogflow代理,进入「Events」页面,新建一个事件(比如命名为telegram_contact_shared),可以给它添加参数(比如phone_number、first_name)来存储联系人信息。在Telegram机器人中间层/Webhook监听联系人分享
当用户在Telegram里分享联系人时,Telegram会向你的机器人发送一个包含contact类型的更新。你需要在接收Telegram请求的代码里,判断是否是联系人分享:- 如果是,就调用Dialogflow的
detectIntentAPI,把刚才创建的telegram_contact_shared事件作为触发条件,同时把联系人的姓名、电话等信息作为事件参数传进去。
- 如果是,就调用Dialogflow的
在Dialogflow中配置对应意图
新建一个意图,把telegram_contact_shared事件设为触发条件,然后就可以在意图里配置回复话术,或者调用Webhook做进一步处理(比如把联系人信息存入数据库)。
方案二:直接在Webhook中解析Telegram联系人数据
如果不需要通过事件触发,而是想直接处理联系人数据并返回响应,这种方法更直接:
确保Webhook已启用并正确配置
先确认你的Dialogflow代理已经完成Telegram集成,并且开启了Webhook(在「Fulfillment」页面设置)。在Webhook中提取联系人信息
当用户分享联系人时,Telegram的请求payload会包含在Dialogflow的originalDetectIntentRequest.payload字段里。你可以在Webhook代码里直接解析这个payload:// 示例Node.js代码(Express框架) app.post('/dialogflow-webhook', async (req, res) => { const telegramPayload = req.body.originalDetectIntentRequest?.payload; // 判断是否是联系人分享请求 if (telegramPayload?.contact) { const { first_name, phone_number, last_name } = telegramPayload.contact; // 根据联系人信息生成回复 const fulfillmentResponse = { fulfillmentMessages: [ { text: { text: [ `已收到你的联系人:${first_name}${last_name ? ' ' + last_name : ''},电话:${phone_number}` ] } } ] }; return res.json(fulfillmentResponse); } // 处理其他类型请求 res.json({ fulfillmentMessages: [{ text: { text: ['请分享联系人信息哦~'] } }] }); });灵活扩展逻辑
你可以在Webhook里把联系人信息存入数据库,或者根据电话号码做后续的业务处理(比如查询用户信息),然后返回对应的响应给用户。
注意事项
- 确保你的Webhook服务使用HTTPS协议,Telegram要求Webhook必须是HTTPS才能接收请求。
- 如果用自定义事件,要保证传递的参数名称和Dialogflow事件里定义的参数名一致,这样才能在意图中引用这些参数。
- 可以结合Dialogflow的上下文(Context),把联系人信息存储到上下文中,方便后续对话流程使用。
内容的提问来源于stack exchange,提问作者naveera

