从Node服务器访问Google日历API

13
由于某些原因,我很难访问 Google 日历。我想要能够从我的 Node.js 服务器中添加和删除日历事件。我在文档中找到了非常矛盾的信息。我遵循了 https://developers.google.com/identity/protocols/OAuth2ServiceAccount ,这提供了一个良好的指南来获取访问令牌,但最后似乎只适用于访问 Drive。然后我又参考了 Google Calendar API v3 Access Not Configured,其中说明你只需要一个 API 密钥,但是它似乎是从客户端完成的,所以可能不同?我也看了 https://developers.google.com/google-apps/calendar/quickstart/nodejs,但是这似乎很复杂,只是为了向日历进行简单的 API 调用。示例代码引用了文件,但不清楚它们来自哪里或如何组织它们。例如:var TOKEN_PATH = TOKEN_DIR + 'calendar-nodejs-quickstart.json';。如果有一个简单的指南来实现此目标,将会非常感激。谢谢。
2个回答

27

我和你处在同样的困境之中。Google 没有针对 Node.js 客户端 API 的 server-to-server 身份验证文档,这真是荒谬。最终,我在这里找到了解决方案。基本上,你需要一个服务账号密钥(通常是 JSON 文件)和 google.auth.JWT server-to-server OAuth 2.0 客户端。

let google = require('googleapis');
let privatekey = require("./privatekey.json");
// configure a JWT auth client
let jwtClient = new google.auth.JWT(
       privatekey.client_email,
       null,
       privatekey.private_key,
       ['https://www.googleapis.com/auth/calendar']);
//authenticate request
jwtClient.authorize(function (err, tokens) {
 if (err) {
   console.log(err);
   return;
 } else {
   console.log("Successfully connected!");
 }
});

现在只需像这样调用日历API:

let calendar = google.calendar('v3');
calendar.events.list({
   auth: jwtClient,
   calendarId: 'primary'//whatever
}, function (err, response) {

});

2
哇,通过这个响应更好地理解如何从日历 API 中获取事件的能力比谷歌自己的文档还要出色,非常感谢。 - Josh Valdivieso
你救了我的一天 :) - Timothy Lee
@zuzel,你的应用程序私钥如何能够访问其他人日历(calendarId: 'primary')上的数据?我有什么遗漏吗? - chen

8
我相信你想使用Node.js添加和删除日历事件。
关于使用日历API的quickstart.js,首先,用户必须使用客户端ID、客户端密钥等信息检索client_secret.json,并在API控制台启用日历API。
接下来,必须使用client_secret.json从Google检索访问令牌和刷新令牌。大部分Quickstart中的quickstart.js用于检索它们。var TOKEN_PATH = TOKEN_DIR + 'calendar-nodejs-quickstart.json'; 包括使用client_secret.json检索到的访问令牌和刷新令牌。具有过期时间的访问令牌可以从没有过期时间的刷新令牌中检索。在quickstart.js中,每次运行脚本都会使用刷新令牌检索访问令牌。 quickstart.js中除了listEvents(auth)之外的函数用于授权。在listEvents(auth)中,通过使用授权检索的访问令牌,可以使用日历API。
示例脚本
以下是添加和删除事件的示例脚本。假设快速入门中的步骤1和步骤2已经完成,并且使用了quickstart.js
对于Node.js快速入门示例,它修改了listEvents()。当您使用此示例脚本时,请复制并粘贴Node.js快速入门示例,将listEvents()更改如下,并添加以下addEvents()removeEvents()
function listEvents(auth) {
  var calendar = google.calendar('v3');

  addEvents(auth, calendar); // Add events
  removeEvents(auth, calendar); // Remove events
}

1. 添加事件

详细信息请参考https://developers.google.com/google-apps/calendar/v3/reference/events/insert

function addEvents(auth, calendar){
  calendar.events.insert({
    auth: auth,
    calendarId: 'primary',
    resource: {
      'summary': 'Sample Event',
      'description': 'Sample description',
      'start': {
        'dateTime': '2017-01-01T00:00:00',
        'timeZone': 'GMT',
      },
      'end': {
        'dateTime': '2017-01-01T01:00:00',
        'timeZone': 'GMT',
      },
    },
  }, function(err, res) {
    if (err) {
      console.log('Error: ' + err);
      return;
    }
    console.log(res);
  });
}

2. 删除事件

详细信息请参阅https://developers.google.com/google-apps/calendar/v3/reference/events/delete

function removeEvents(auth, calendar){
  calendar.events.delete({
    auth: auth,
    calendarId: 'primary',
    eventId: "#####",
  }, function(err) {
    if (err) {
      console.log('Error: ' + err);
      return;
    }
    console.log("Removed");
  });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接