You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:09:55