我使用 Google 日历 API 在 Node.js 中构建了一个事件调度程序🚀

2025-05-24

我使用 Google 日历 API 在 Node.js 中构建了一个事件调度程序🚀

介绍

自从新冠疫情以来,我的日程表上就排满了站立会议、团队会议和客户电话。

然而,安排活动和邀请客人是一件无聊的事情。一个星期五,在这些事情上花了太多时间后,我突然想到——

我为什么要花这么多时间在这上面?

非常沮丧 GIF

因此,我有了创建一个事件调度程序来简化我的工作的想法!

在本文中,我将向您展示如何创建一个 Nodejs 应用程序,该应用程序可以创建事件并自动发送带有 Google Meet 链接的电子邮件邀请。

兴奋吗?我也是。

所以不要再拖延了!

开始吧!

项目设置:

1.创建Node.js项目:

要启动我们的项目,我们需要设置一个 Node.js 环境。因此,让我们创建一个 Node 项目。在终端中运行以下命令。

npm init -y
Enter fullscreen mode Exit fullscreen mode

这将初始化一个新的 Node.js 项目。

2.安装依赖项:

现在,我们将安装项目所需的依赖项。

npm install express googleapis dotenv
Enter fullscreen mode Exit fullscreen mode

这将安装以下软件包:

  • express:Node.js 的流行 Web 框架

  • dotenv:从.env文件加载环境变量。

  • googleapis:提供对各种 Google API 的访问

3.设置环境变量:

接下来,我们将创建一个.env文件夹来安全地存储我们的敏感信息,例如 API 凭证。

//.env
PORT = YOUR_PORT || 8000
CLIENT_ID = YOUR_CLIENT_ID
CLIENT_SECRET = YOUR_CLIENT_SECRET
REDIRECT_URL = http://localhost:8000/auth/redirect
API_KEY = YOUR_API_KEY
Enter fullscreen mode Exit fullscreen mode

4.创建Express服务器:

现在,我们index.js在根目录中创建一个文件,并设置一个基本的 Express 服务器。请参阅以下代码:

const express = require("express");
const dotenv = require("dotenv");

dotenv.config();

const app = express();

const port = process.env.PORT || 8000;

app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});
Enter fullscreen mode Exit fullscreen mode

在这里,我们使用“dotenv”包从.env文件中访问端口号。

在项目的顶部,我们正在加载环境变量,dotenv.config()以便在整个文件中可以访问它。

设置Google控制台

首先,我们将转到Google Cloud Console

然后我们就能得到这个仪表盘了。(我之前创建过一个项目,所以才得到这个,你可能会得到其他东西)

Google 云端控制台

现在,我们点击“新项目”按钮来开始一个新项目。

新项目页面

接下来我们会看到类似这样的内容。在这里,我们将添加项目名称和组织。

在本项目中,我将其保留为“Mail-integration-Demo”。然后点击“创建”按钮继续。

新项目详情

接下来,在侧边导航栏中,我们会看到“API 和服务”。在此部分中,有一个用于启用 API 和服务的子菜单。我们点击它继续。

API 和服务

接下来,我们将启用我们将在此项目中使用的 API,即 Google Calender API。

Google 日历 API

之后,我们将进入 OAuth 同意屏幕。在这里,我们将用户类型选择为外部。然后按“创建”按钮继续。

OAuth 同意屏幕

然后,我们将进入应用注册页面。

在这里,我们将添加更多关于我们应用的信息。首先,我们需要添加应用名称以及用于用户支持的电子邮件地址。

对于这个项目,我将其命名为“Arindam 的邮件集成”,并使用我自己的电子邮件地址来提供支持。

应用信息页面

接下来,我们必须定义应用程序的范围

范围页面

在范围中,我们将为该项目添加必要的权限,例如userinfo.email和。userinfo.profile

选定范围

之后,我们将向我们的应用程序添加一个测试用户。

测试用户页面

就这样。我们的应用程序已在平台上注册。

现在,我们将创建 OAuth 客户端 ID 密钥。为此,我们将转到“创建凭据”部分。

Google 控制台信息中心

在这里,我们将添加应用程序的类型及其名称。对于这个项目,它是一个 Web 应用程序,名称是 Arindam's Mail Demo。

OAuth 客户端 ID

此外,我们还添加了一个重定向 URL。在本项目中,该 URL 为http://localhost:8000/auth/redirect

重定向 URL

然后我们将获得 OAuth 凭证。

OAuth 客户端已创建

接下来我们将创建 API 密钥。

API 密钥生成页面

完成所有这些后,我们将.env使用之前生成的 API 密钥和 OAuth 凭据更新我们的文件。

至此,我们已经为该项目设置了 Google Cloud 控制台,现在让我们进入下一部分

OAuth 2 身份验证:

到目前为止,我们已经完成了基本的项目设置。现在,我们将把 OAuth2 身份验证集成到我们的项目中。这将使我们的应用程序能够安全地与 Google 服务交互。

为此,首先,我们将所需的软件包导入到index.js文件中。

const express = require('express');
const { google } = require('googleapis');
const dotenv = require('dotenv');
Enter fullscreen mode Exit fullscreen mode

然后我们将定义 Google 日历 API 所需的访问范围。

const scopes = ['https://www.googleapis.com/auth/calendar'];
Enter fullscreen mode Exit fullscreen mode

接下来,我们将使用存储在.env文件中的凭据配置 OAuth 2 客户端。

// OAuth 2 configuration
const oauth2Client = new google.auth.OAuth2
(
    process.env.CLIENT_ID,
    process.env.CLIENT_SECRET,
    process.env.REDIRECT_URL
);
Enter fullscreen mode Exit fullscreen mode

在 OAuth 2 配置之后,我们将创建一个路由来验证我们的用户。

app.get('/auth', (req, res) => {

    const url = oauth2Client.generateAuthUrl
    ({
        access_type: 'offline',
        scope: scopes
    });
    res.redirect(url);
    }
);
Enter fullscreen mode Exit fullscreen mode

当我们的用户访问此路线时,他们将被重定向到 Google 的身份验证页面,该页面将要求向我们的应用程序提供特定的权限。

身份验证成功后,Google 会将用户重定向到我们的重定向 URL(/auth/redirect

app.get("/auth/redirect", async (req, res) => {

    const {tokens} = await oauth2Client.getToken(req.query.code);
    oauth2Client.setCredentials(tokens);
    res.send('Authentication successful! Please return to the console.');
    }

);
Enter fullscreen mode Exit fullscreen mode

这里我们从查询中获取刷新令牌,并将其作为凭证存储在 中oauth2Client。这些凭证将帮助我们向 Google 日历 API 发出请求。

以下是完整的代码index.js

//index.js
const express = require('express');
const { google } = require('googleapis');
const dotenv = require('dotenv');

const app = express();

dotenv.config();

const port = process.env.PORT || 8000;

app.get('/', (req, res) => {
    res.send('Hello World');
    }
);

// Define the scope of access for the Google Calendar API.
const scopes = ['https://www.googleapis.com/auth/calendar'];

// OAuth 2 configuration
const oauth2Client = new google.auth.OAuth2
(
    process.env.CLIENT_ID,
    process.env.CLIENT_SECRET,
    process.env.REDIRECT_URL
); 

app.get('/auth', (req, res) => {

    const url = oauth2Client.generateAuthUrl
    ({
        access_type: 'offline',
        scope: scopes
    });
    res.redirect(url);
    }
);

app.get("/auth/redirect", async (req, res) => {

    const {tokens} = await oauth2Client.getToken(req.query.code);
    oauth2Client.setCredentials(tokens);
    res.send('Authentication successful! Please return to the console.');
    }

);
Enter fullscreen mode Exit fullscreen mode

在 Google 日历上安排活动

最重要的部分来了!在本部分中,我们将在 Google 日历上安排一项活动!

首先,我们将初始化 Google 日历 API 客户端。

const calendar = google.calendar({
    version: 'v3', 
    auth: oauth2Client
});
Enter fullscreen mode Exit fullscreen mode

接下来,我们将创建一个事件对象,其中我们将添加事件的所有详细信息,例如摘要、位置、开始和结束时间等。

const event = {
    summary: 'Tech Talk with Arindam',
    location: 'Google Meet',

    description: "Demo event for Arindam's Blog Post.",
    start: {
        dateTime: "2024-03-14T19:30:00+05:30",
        timeZone: 'Asia/Kolkata'
    },
    end: {
        dateTime: "2024-03-14T20:30:00+05:30",
        timeZone: 'Asia/Kolkata'
    },
};
Enter fullscreen mode Exit fullscreen mode

之后,我们将创建一个路线(/create-event),并在其中创建事件。

这里我们使用该方法在用户的日历中插入一个事件calendar.events.insert()

app.get('/create-event', async (req, res) => {

    try {
        const result = await calendar.events.insert({
                                calendarId: 'primary', 
                                auth:oauth2Client,
                                resource: event
                        });

        res.send({
            status: 200,
            message: 'Event created',
        });
    } catch (err) {
        console.log(err);
        res.send(err);
    }
    }
);
Enter fullscreen mode Exit fullscreen mode

有了它,我们可以在 Google 日历上动态安排事件。

添加 Google Meet 链接:

到目前为止,我们已经探索了如何在 Google 日历上创建一个简单的活动。在本节中,我们将探索如何将 Google Meet 链接添加到该活动!

为此,我们将更新在上一节中创建的事件对象。我们将添加一个conferenceData属性来指定 Google Meet 链接的创建请求。

 conferenceData: {
            createRequest: {
                requestId: uuid(),
            }
        },
Enter fullscreen mode Exit fullscreen mode

我们还将添加一个attendees属性来邀请嘉宾参加活动。以下是一个简单的示例:

attendees: [
            {email: 'arindammajumder2020@gmail.com'},
        ]
Enter fullscreen mode Exit fullscreen mode

现在,Event 对象如下所示:

const event = {
    summary: 'Tech Talk with Arindam',
    location: 'Google Meet',

    description: "Demo event for Arindam's Blog Post.",
    start: {
        dateTime: "2024-03-14T19:30:00+05:30",
        timeZone: 'Asia/Kolkata'
    },
    end: {
        dateTime: "2024-03-14T20:30:00+05:30",
        timeZone: 'Asia/Kolkata'
    },
    colorId: 1,
    conferenceData: {
        createRequest: {
            requestId: uuid(),
        }
    },

    attendees: [
        {email: 'arindammajumder2020@gmail.com'},
    ]

};
Enter fullscreen mode Exit fullscreen mode

接下来,在事件插入步骤中,我们将向conferenceDataVersion其中添加参数。

const result = await calendar.events.insert({
                    calendarId: 'primary', 
                    auth:oauth2Client , 
                    conferenceDataVersion: 1, 
                    resource: event
               });
Enter fullscreen mode Exit fullscreen mode

这将创建一个包含 Google Meet 链接的活动。我们也可以像这样在回复中分享该链接:

        res.send({
            status: 200,
            message: 'Event created',
            link: result.data.hangoutLink
        });
Enter fullscreen mode Exit fullscreen mode

向与会者发送提醒:

好了,我们的项目快完成了,只剩下最后的润色了。现在,我们的项目会直接将活动添加到受邀嘉宾的日历中。

但是,为了通知他们这些事件,我们必须发送一封邮件。为此,我们必须sendUpdates: 'all',在事件创建部分添加一个参数。这样,​​应用程序就会自动向受邀嘉宾发送电子邮件。

const result = await calendar.events.insert({
                    calendarId: 'primary', 
                    auth:oauth2Client , 
                    conferenceDataVersion: 1 , 
                    sendUpdates: 'all', 
                    resource: event
              });
Enter fullscreen mode Exit fullscreen mode

通过这一附加功能,我们的项目现在可以无缝处理事件创建和电子邮件通知。

测试应用程序:

我们项目的编码部分已经完成。现在,让我们看看它是否能正常工作!

为此,我们将启动该项目!

npm run start
Enter fullscreen mode Exit fullscreen mode

我们已经在 8000 端口启动了服务器!

现在,我们将访问http://localhost:8000/auth/路由来验证用户身份。它会将我们重定向到如下页面:

登录页面

它会请求应用程序的一些权限

许可页面

它将重定向到/auth/redirect带有查询参数的路由code

/auth/redirect 路由

成功验证用户身份后,我们将转到http://localhost:8000/create-event路由来安排事件。

http://localhost:8000/create-event 路由

太棒了!这意味着我们的活动是通过 Google Meet 链接创建的。

为了验证事件创建过程是否正常运行,让我们检查一下我们的 Google 日历

Google 日历

太棒了!我们的活动创建成功了,这意味着活动创建路由运行正常!而且我们还收到了一封邀请邮件:

活动邀请邮件。

太棒了!我们的应用程序运行完美!

至此,我们已将 Google 日历集成到我们的 Node.js 应用中。在接下来的文章中,我们将探索更多 Google 日历的用例。

到那时,敬请期待!

结论

如果您觉得这篇博文有用,请考虑分享给其他可能受益的人。您也可以关注我,了解更多关于 JavaScript、React 和其他 Web 开发主题的内容。

对于付费合作,请发送电子邮件至:arindammajumder2020@gmail.com

通过TwitterLinkedInYoutubeGitHub与我联系

感谢您的阅读:)

谢谢

文章来源:https://dev.to/arindam_1729/i-built-an-event-scheduler-in-nodejs-using-google-calendar-api-4c5b
PREV
我发现了一款​​比 v0 更好的工具——它的功能超乎你的想象!🤯
NEXT
9 个开源库助你下一个项目更上一层楼