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

为何服务账号无法访问公开共享日历获取事件?Deno环境求助

解决Deno调用Google公开日历API的401认证错误

问题排查方向

你用服务账号访问公开日历仍触发401错误,主要原因集中在服务账号权限配置不全或认证流程缺失关键步骤,另外公开日历其实可以用更简单的方式访问。

可行解决方案

方案1:用API密钥直接访问(无需服务账号)

公开共享的日历支持通过API密钥匿名访问,步骤如下:

  1. 在Google云控制台创建API密钥,并确保已启用Calendar API
  2. 修改代码如下:
import { Calendar } from "https://googleapis.deno.dev/v1/calendar:v3.ts";

// 用API密钥初始化客户端
const calendar = new Calendar({
  key: Deno.env.get('GOOGLE_API_KEY'),
});

// 调用eventsList获取日历事件列表(注意:eventsGet是获取单个事件的接口)
const events = await calendar.eventsList({
  calendarId: '<my-public-calendar-id-here>',
});
console.log(events);

方案2:修复服务账号认证流程

如果必须使用服务账号,需完成以下修正:

  • 给服务账号添加日历权限:即使日历公开,仍需在目标日历的共享设置中,添加服务账号邮箱为「查看者」
  • 补充认证作用域:修改代码指定Calendar只读权限,确保服务账号获取有效令牌:
import { Calendar, auth } from "https://googleapis.deno.dev/v1/calendar:v3.ts";

const serviceAccountConfig = await Deno.readTextFile(Deno.env.get('GOOGLE_APPLICATION_CREDENTIALS'));
const credentials = auth.fromJSON(JSON.parse(serviceAccountConfig));

// 添加Calendar只读作用域
credentials.scopes = ['https://www.googleapis.com/auth/calendar.readonly'];

const calendar = new Calendar(credentials);

// 使用eventsList接口获取事件
const events = await calendar.eventsList({
  calendarId: '<my-public-calendar-id-here>',
});
console.log(events);

关键注意事项

  • 确认目标日历的共享设置为「公开访问:查看所有事件」
  • 检查Google云控制台中,服务账号所属项目已启用Calendar API
  • 区分eventsGet和eventsList:前者需要单个事件ID,后者用于获取日历下的全部事件列表

内容的提问来源于stack exchange,提问作者Bertuz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:42:44