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

Posted

技术标签:

【中文标题】我想知道如何获取与链接日历关联的电子邮件地址【英文标题】:I would like to know how to get the email address associated with the linked calendar 【发布时间】:2021-12-28 03:59:09 【问题描述】:

我正在开发的应用程序是一个谷歌日历 api,它可以集成谷歌日历。

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

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

【问题讨论】:

【参考方案1】:

日历没有电子邮件地址。他们有日历 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 此方法将返回给您日历的所有规则

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.');
    
  );

【讨论】:

【参考方案2】:

正如@DalmTo 所说,谷歌日历与一个不对应于电子邮件地址的 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)

文档

Members Resource Calendar API Reference NodeJS Calendar API Reference

【讨论】:

以上是关于我想知道如何获取与链接日历关联的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

无论如何要获取与 UWP 中的购买相关联的 Microsoft Store 帐户电子邮件地址吗?

使用 Python 检查电子邮件是不是真实 [关闭]

根据不同的变量执行2个脚本

现在值得在网络上混淆电子邮件地址吗?

如何在没有通知和确认过程的情况下更改 WordPress 中的主管理员电子邮件地址

如何使用 Facebook API 获取用户的辅助电子邮件地址