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

在默认日历中通过PHP创建Google日历事件,而不是服务帐户日历

满言
2023-03-14

要在Google日历中添加事件,我创建了一个Google服务号,从中我获得了客户端ID、服务帐户名称和p12密钥。现在从我的代码中,它正在创建一个事件,但它创建了自己的新日历以插入具有服务号名称的事件。我想在我的Google帐户的默认日历中添加事件。下面是服务号事件插入的工作代码。

function calendarize ($title, $desc, $start_datetime, $end_datetime, $gmail_id, $location) 
{
  $start_ev_datetime = new DateTime($start_datetime, new DateTimeZone('America/Chicago'));
  $start_ev_datetime = $start_ev_datetime->format('c');
  $end_ev_datetime = new DateTime($end_datetime, new DateTimeZone('America/Chicago'));
  $end_ev_datetime = $end_ev_datetime->format('c');


  //Google credentials
  $client_id = '**********.apps.googleusercontent.com';
  $service_account_name = '*******.iam.gserviceaccount.com';
  $key_file_location = '**************.p12';
  if (!strlen($service_account_name) || !strlen($key_file_location))
    echo missingServiceAccountDetailsWarning();
  $client = new Google_Client();
  $client->setApplicationName("App Name");

  if (isset($_SESSION['token']) && $_SESSION['token']) {
    $client->setAccessToken($_SESSION['token']);
    if ($client->isAccessTokenExpired()) {
      $access_token= json_decode($_SESSION['token']);
      $client->refreshToken($access_token->refresh_token);
      unset($_SESSION['token']);
      $_SESSION['token'] = $client->getAccessToken();
    }
  }


$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
  $service_account_name,
  array('https://www.googleapis.com/auth/calendar'),
  $key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
  try {
    $client->getAuth()->refreshTokenWithAssertion($cred);
  } catch (Exception $e) {
    var_dump($e->getMessage());
  }
}
$_SESSION['service_token'] = $client->getAccessToken();
$calendarService = new Google_Service_Calendar($client);
$calendarList = $calendarService->calendarList;


//Set the Event data
$event = new Google_Service_Calendar_Event();
$event->setSummary($title);
$event->setDescription($desc);
$event->setLocation($location);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime($start_ev_datetime);
$start->setTimeZone('America/Chicago');
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime($end_ev_datetime);
$end->setTimeZone('America/Chicago');
$event->setEnd($end);
try {
 $createdEvent = $calendarService->events->insert('primary', $event);
} catch (Exception $e) {
 var_dump($e->getMessage());
}

$acl = $calendarService->acl->listAcl('primary');
$userExistFlag = false;

foreach ($acl->getItems() as $rule) {
  if($rule->getId() == 'user:'.$gmail_id){
    $userExistFlag = true;
  }
}

if(!$userExistFlag){
  $scope = new Google_Service_Calendar_AclRuleScope();
  $scope->setType('user');
  $scope->setValue( $gmail_id );

  $rule = new Google_Service_Calendar_AclRule();
  $rule->setRole( 'owner' );
  $rule->setScope( $scope );

  $result = $calendarService->acl->insert('primary', $rule);
}

echo 'Event Successfully Added with ID: '.$createdEvent->getId();
}

共有1个答案

羊昊苍
2023-03-14

记住服务号不是你。服务号是它自己的虚拟用户。它有自己的谷歌日历帐户,这就是为什么它在日历上创建事件而不是你的。

获取服务号电子邮件地址并与服务号共享您的个人日历,就像您与Web应用程序中的任何其他用户共享一样。一旦您与服务号共享了日历,它就可以访问它。请注意日历ID,您将能够使用它来更新您的日历。

背景信息

$createdEvent = $calendarService->events->insert('primary', $event);

primary提供当前经过身份验证的用户的主日历。这是服务帐户主日历。

 类似资料:
  • 我需要在日历上创建谷歌日历活动,并将其他用户添加为该活动的参与者。其目的是向应用程序用户发送日历事件,而无需征得他们的同意(O-Auth)。 在阅读了谷歌的留档后,我发现我需要一个服务号。所以我从我们的G-Suite的一个电子邮件地址创建了一个项目和一个服务号,noreply@xxxxx.com并为其启用了日历应用编程接口。 我创建并下载了一个密钥对(JSON),其内容是, 根据文档,我开始编写身

  • 我试图实现与谷歌服务号的用户模拟,一直有一段时间的问题,这是我在Java使用的代码: 当我尝试从共享日历中读取事件时,我收到以下身份验证错误: com.google.api.client.auth.oauth2.TokenResponseException: 401未经授权的邮政https://oauth2.googleapis.com/token 如果我不使用模拟,我可以读取事件,但不能邀请与会

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

  • 问题内容: 我想通过服务帐户在Google日历上创建新活动。我可以正确访问并打印我所有日历的列表。但是,当我想创建一个新事件时,响应为403 Forbidden。 我的代码: 和服务器响应: 有任何想法吗?可能是其他作用域,或允许编辑事件(我不知道在哪里可以配置它,并且已经搜索了,保证) 当然,我的日历是公共日历。 任何帮助都将受到欢迎:) 谢谢! 问题答案: 我解决了,问题不是代码,它工作正常。

  • 我从快速入门开始(https://developers.google.com/google-apps/calendar/quickstart/python)而且效果很好。然后我尝试用这个指南插入事件(https://developers.google.com/google-apps/calendar/create-events)。我将此代码添加到quickstart的代码中,但出现错误。如何查看我

  • 我正在通过Google calendar API v3创建一系列活动(学校时间表)。我正在通过通过API控制台获得的OAuth凭据验证我的程序。除了所有活动都有我的Google帐户作为其创建者,并且程序创建的所有日历都显示在我的“其他日历”列表中之外,所有活动都运行良好。有没有办法改变这种行为? 我唯一能想到的是使用服务号(例如timetable@mydomain.com)登录API控制台并从中创