当前位置: 首页 > 知识库问答 >
问题:

带有PHP和服务帐户的谷歌日历API将不再工作

危飞跃
2023-03-14

我有一个网站,大约有15个日历,我使用带有PHP和服务号的Google日历API连接到Google日历。我只使用一个普通的旧gmail帐户,而不是gSuite帐户。我使用我的网站在这些日历上添加、编辑和删除事件。

    function Google_Calendar_Connect(){
$client = new Google_Client();
putenv('GOOGLE_APPLICATION_CREDENTIALS=Private_Key.json');
$client->useApplicationDefaultCredentials();
$client->setApplicationName("Mical");
$client->setScopes(Google_Service_Calendar::CALENDAR);
$client->setAccessType('offline');

$service = new Google_Service_Calendar($client);
return $service;
}
$service = Google_Calendar_Connect();
$event = $service->events->get($calendarId, $Array["google_id"]);
$event->setSummary($Array2['fullName']);
$event->setLocation($Array['job_address']);
$event->setDescription($Array['description']);
try{
$updatedEvent = $service->events->update($calendarId, $event->getId(), $event);
}catch (Exception $ex)
        {echo $ex;
            // Event was not found on Google Calendar.
        } finally {
//if it worked, do something
}

通常我会将服务号电子邮件添加到具有“更改事件”权限的日历“与他人共享”设置中,这允许上面的脚本编辑日历事件。最近,当我在Google上添加新日历并尝试将服务号电子邮件添加到“与他人共享”设置时,它不允许我这样做。

我在服务帐户上读到,不再接受自动共享日历,这是谷歌的修复,因为服务帐户无法验证或批准自己。无论如何,这意味着我不能在这个新日历或我创建的任何新日历中添加、编辑或删除事件。它仍然适用于与服务帐户共享的旧日历,因为它们仍然是共享的。

任何人都可以推荐一种修复或不同的方式来连接到日历而无需用户交互并且无需在GSuite中重新创建新日历吗?

共有1个答案

公孙黎昕
2023-03-14

我希望您检查问题不仅仅是您正在寻找的日历没有出现在您的日历列表中,服务帐户不再自动插入日历列表是正确的,但这并不意味着您无权访问日历。

尝试执行类似操作以将日历添加到日历列表。您应该能够从Google calendar web应用程序中找到日历id。

$calendarListEntry = new Google_Service_Calendar_CalendarListEntry();
$calendarListEntry->setId("calendarId");

$createdCalendarListEntry = $service->calendarList->insert($calendarListEntry);

echo $createdCalendarListEntry->getSummary();

如果正如你所说,你真的没有访问日历了,问题不仅仅是它没有自动添加到日历列表中。

唯一的解决方法是创建一个虚拟谷歌用户,然后使用Oauth2使用离线访问对用户进行身份验证,这将为您提供一个刷新令牌。

然后,您可以在需要时使用刷新令牌来请求新的访问令牌。使用

$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());

这不是一个理想的解决方案,因为刷新令牌可能会停止工作,尽管这种情况极为罕见,因此您需要照看代码,并让它通知您其刷新令牌是否有任何问题,以便您可以创建一个新的

 类似资料:
  • 我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效

  • 我收到了这个错误 已经跟踪了https://developers.google.com/admin-sdk/directory/v1/guides/delegation 我使用这个库,并在laravel 5.7:https://github.com/spatie/laravel-google-calendar上运行它 有什么办法可以解决这个问题。请帮忙。

  • 因此,我已将服务号设置为域范围的授权,如本文所述执行谷歌办公套件域范围的授权。在谷歌办公套件管理控制台中,我已授权服务号使用OAuth 2.0范围: 每次我试图创建一个事件,最终都会出现这个错误 这建立了google凭据,不使用模拟,日历与服务号共享。

  • 我能够使用服务帐户和谷歌日历API在谷歌日历中创建一个事件,其中项目和服务帐户是在谷歌工作区管理员帐户中创建的,在同一个帐户中,我启用了域范围的委派属性。我还没有创建单独的日历,也没有授予访问服务帐户的权限。如果我在CreateDelegate()中使用我的工作区google帐户,则此事件将在'abc@myworkspace.com对于我添加的每个与会者,“日历”和“创建人”属性也是相同的。 所以

  • 我正在使用一个服务帐户访问我们的域名用户的谷歌驱动器,这工作像一个魅力!然而,我现在正在尝试使用相同的服务帐户获得用户的activity在谷歌驱动器。 我已授予服务帐户API访问https://www.googleapis.com/auth/activity和https://www.googleapis.com/auth/drive的权限 并启用API! 然而我总是得到错误403,禁止! 可能需要

  • 我为我的帐户name@steelkiwi.com(谷歌应用程序)创建了服务帐户,我的应用程序运行良好。然后我为我的个人帐户name@gmail.com创建了服务帐户,为我的应用程序使用这个新的凭据,现在当我试图插入文件时,我得到错误500和下一个文本: HttpError 500请求https://www.googleapis.com/upload/drive/v2/files时?quotause