DialogFlow代理扩展需求:实现Google Calendar提醒设置功能(OAuth2)
老哥,我来一步步给你捋清楚怎么实现DialogFlow代理调用Google Calendar设置提醒的功能——核心就是靠Google Actions的OAuth2授权拿到用户的Calendar权限,再在Webhook里调用官方API完成事件创建,咱们一步步来:
第一步:搞定Google Cloud项目的OAuth2授权配置
你的DialogFlow代理肯定绑定了一个Google Cloud项目,先去这个项目里做OAuth2的基础配置:
- 打开Google Cloud Console,找到你的项目,进入「API和服务」→「OAuth同意屏幕」,先填好应用名称、支持邮箱这些必填项,然后在「范围」里添加Google Calendar的权限,推荐用
https://www.googleapis.com/auth/calendar.events(只需要创建事件的话,这个最小权限足够,别请求多余权限,用户会反感)。如果你的应用还没发布,记得添加测试用户,只有测试用户能授权。 - 接着去「凭据」页面,创建「OAuth客户端ID」,应用类型选「Web应用」,在「已授权的重定向URI」里填Google Actions的回调地址:
https://oauth-redirect.googleusercontent.com/r/[你的项目ID],把[你的项目ID]换成你自己的Google Cloud项目ID。创建完成后,把客户端ID和客户端密钥存好,后面要用。
第二步:在DialogFlow里启用账号链接(OAuth2)
回到DialogFlow控制台,找到你的代理:
- 进入「集成」→「Google Actions」,点击「管理Google Actions」跳转到Actions Console。
- 在Actions Console里,进入「设置」→「账号链接」,选择「OAuth 2.0」作为链接类型:
- 把刚才存的「客户端ID」和「客户端密钥」填进去。
- 授权范围填之前选的
https://www.googleapis.com/auth/calendar.events。 - 授权流程选「授权码流程」,因为咱们需要在Webhook里拿到访问令牌来调用Calendar API。
- 保存设置后,用户第一次用提醒功能时,就会自动触发授权流程。
第三步:在Webhook里处理授权+调用Calendar API
现在你的Webhook要处理两种情况:用户还没授权,以及已授权后创建事件:
- 处理未授权场景:当用户请求设置提醒时,先检查DialogFlow请求里的
originalDetectIntentRequest.payload.user.accessToken有没有值。如果没有,就返回一个要求授权的响应。比如用Node.js的话,可以这么写:
function handleReminderRequest(agent) { const accessToken = agent.originalDetectIntentRequest.payload.user?.accessToken; if (!accessToken) { // 触发授权弹窗 agent.add(new SignIn('请授权访问你的Google日历,我才能帮你设置提醒哦')); return; } // 已授权,继续创建事件 }
- 调用Calendar API创建事件:拿到有效的accessToken后,就可以用Google官方的客户端库或者直接调用REST API来创建事件。比如用Node.js的
googleapis库:
const { google } = require('googleapis'); const calendar = google.calendar({ version: 'v3' }); async function createCalendarEvent(accessToken, eventInfo) { try { await calendar.events.insert({ auth: new google.auth.OAuth2(null, null, accessToken), calendarId: 'primary', // 操作用户的主日历 resource: { summary: eventInfo.title, // 提醒标题,比如"下午3点开会" description: eventInfo.note, // 提醒备注 start: { dateTime: eventInfo.startTime, // 要转成ISO 8601格式,比如"2024-05-20T15:00:00+08:00" timeZone: 'Asia/Shanghai' // 根据用户所在时区调整 }, end: { dateTime: eventInfo.endTime, // 提醒结束时间,比如会议持续1小时就设成16:00 timeZone: 'Asia/Shanghai' }, reminders: { useDefault: false, overrides: [ { method: 'popup', minutes: 15 } // 提前15分钟弹窗提醒 ] } } }); return '提醒已经帮你设好啦,去Google日历看看吧~'; } catch (err) { console.error('创建日历事件出错:', err); return '抱歉,设置提醒失败了,再试一次吧?'; } }
- 提取用户请求参数:别忘了先从DialogFlow的意图里提取用户要设置的提醒标题、时间这些信息,比如通过
agent.parameters.title、agent.parameters.datetime获取,然后转换成Calendar API需要的格式(比如把用户说的“明天下午3点”转成ISO时间字符串)。
第四步:测试验证
- 用Google Actions模拟器或者你的Android设备测试:第一次触发设置提醒的意图时,会弹出授权登录的提示,用户登录授权后,就能正常创建日历事件了。
- 去Google Calendar里看看有没有对应的事件,确认功能正常。
一些要注意的细节
- 权限最小化:就用
calendar.events权限就行,别请求calendar.readonly或者更宽的权限,用户会不信任。 - 处理令牌过期:如果accessToken过期,可以用refreshToken刷新(需要在OAuth配置时额外请求
offline_access范围,这样授权时会返回refreshToken)。 - 错误处理:调用API时一定要捕获错误,比如权限不足、时间格式错误这些,给用户返回友好的提示,别直接抛技术错误。
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

