我想知道如何获取与链接日历关联的电子邮件地址

I would like to know how to get the email address associated with the linked calendar

我正在开发的应用程序是 google 日历 api,它执行 google 日历集成。

我想获取与链接日历关联的电子邮件地址,但我无法通过查看以下内容来弄清楚如何做到这一点 url。

https://developers.google.com/calendar/api/v3/reference/calendars

日历没有电子邮件地址。他们有日历 ID,例如这将是一个日历 ID

v205qep4g260mm7fgq8vtgp18@group.calendar.google.com

它可能看起来像电子邮件地址,但实际上不是。您不能在那里发送电子邮件,因为它不是电子邮件地址。

如果您在主日历上calendar.get

curl \  'https://www.googleapis.com/calendar/v3/calendars/pramary?key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --compressed

该日历的日历 ID 实际上是当前已验证用户的电子邮件地址

{
 "kind": "calendar#calendar",
 "etag": "\"j32ipQvsbvz0_YlxYi3Ml2Fd7A\"",
 "id": "xxxxx@gmail.com",
 "summary": "Linda Lawton ",
 "description": "test",
 "timeZone": "Europe/Copenhagen",
 "conferenceProperties": {
  "allowedConferenceSolutionTypes": [
   "hangoutsMeet"
  ]
 }
}

但这不适用于其他日历,上面的日历是我的家居清洁日历。

如果您实际上想要做的是获取日历所有者的电子邮件地址,那么您应该使用 acl.list 此方法将为您 return 日历的所有规则

curl \
  'https://www.googleapis.com/calendar/v3/calendars/p4g260mm7fgq8vtgp18%40group.calendar.google.com/acl?key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --compressed

其中一个规则是所有者电子邮件

 {
   "kind": "calendar#aclRule",
   "etag": "\"00001501683456631000\"",
   "id": "user:XXXXX@gmail.com",
   "scope": {
    "type": "user",
    "value": "XXXXX@gmail.com"
   },
   "role": "owner"
  },

我稍微改动了 node quickstart 以展示如何使用此方法

/**
 * Lists the next 10 events on the user's primary calendar.
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function listEvents(auth) {
  const calendar = google.calendar({version: 'v3', auth});
  calendar.acl.list({
    calendarId: 'primary',   
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    const rules = res.data.items;
    if (rules .length) {
      
      rules .map((rule, i) => {        
        console.log(`User ${rule.id} with the role ${rule.role}`)
      });
    } else {
      console.log('No upcoming rules found.');
    }
  });
}

正如@DalmTo 所说Google 日历与不对应电子邮件地址的 ID 相关联,但您的主日历除外。

作为@DalmTo 在 ACL 上提供的内容的 NodeJS 实现:

async function getCalendarACL(auth) {
  // call the service                  
  const calendar = google.calendar({ version: 'v3', auth });
  console.log(Object.keys(calendar))
  // get all the calendars in the current user
  let res = await calendar.calendarList.list({})
  let calendars = await res.data.items
  for (let calendar_i of calendars) {
    let calendar_acl = await calendar.acl.list({ calendarId: calendar_i.id })
    let acl_rules = await calendar_acl.data.items
    console.log(`Calendar ${calendar_i.id}`)
    for (rule of acl_rules) {
      console.log(`User ${rule.id} with the role ${rule.role}`)
    }
  }
} 

如果您在 scope.type 字段中得到 group,您需要使用 Directory API,以获取具有访问权限的用户的电子邮件。

const directory = google.admin({version: 'directory_v1', auth});
const usersInGroup = await directory.members.list({groupKey:groupID})

文档