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

如何使用Google Calendar API v3/Google API客户端库显示*所有*可用日历的列表?

华宪
2023-03-14

我一直在尝试使用PHP访问Google Calendar API v3。最初,我只想列出调用API时可以访问的用户日历。

为此,我下载了Google API PHP客户端库,并尝试使用以下代码(经过我的改编,源于https://mytechscraps.wordpress.com/2014/05/15/accessing-google-calendar-using-the-php-api/ ):

<?php

//error_reporting(0);
//@ini_set('display_errors', 0);

// If you've used composer to include the library, remove the following line
// and make sure to follow the standard composer autoloading.
// https://getcomposer.org/doc/01-basic-usage.md#autoloading
require_once './google-api-php-client-master/autoload.php';

// Service Account info
$client_id = '754612121864-pmdfssdfakqiqblg6lt9a.apps.googleusercontent.com';
$service_account_name = '754674507864-pm1dsgdsgsdfsdfsdfdflg6lt9a@developer.gserviceaccount.com';
$key_file_location = 'Calendar-7dsfsdgsdfsda953d68dgdsgdsff88a.p12';


$client = new Google_Client();
$client->setApplicationName("Calendar");

$service = new Google_Service_Calendar($client);

$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
 $service_account_name,
 array('https://www.googleapis.com/auth/calendar.readonly'),
 $key
);

$client->setAssertionCredentials($cred);

$cals = $service->calendarList->listCalendarList();
print_r($cals);

?>

我在Google Developers控制台中创建了一个服务号,并生成了OAuth详细信息,我使用这些信息来设置适当的变量,从代码中可以看出。

此代码返回以下内容:

Google_Service_Calendar_CalendarList Object ( [collection_key:protected] => items [internal_gapi_mappings:protected] => Array ( ) [etag] => "14171313334000" [itemsType:protected] => Google_Service_Calendar_CalendarListEntry [itemsDataType:protected] => array [kind] => calendar#calendarList [nextPageToken] => [nextSyncToken] => 000014121268327000 [modelData:protected] => Array ( [items] => Array ( [0] => Array ( [kind] => calendar#calendarListEntry [etag] => "1417721316542000" [id] => bots@madeupcompany.co.uk [summary] => bots@madeupcompany.co.uk [timeZone] => Europe/London [colorId] => 23 [backgroundColor] => #cd74e6 [foregroundColor] => #000000 [selected] => 1 [accessRole] => reader [defaultReminders] => Array ( ) ) ) ) [processed:protected] => Array ( ) )

问题是,这似乎只返回一个日历的详细信息。也就是说bots@madeupcompany.co.uk(这是我唯一明确与我的服务共享的)。

然而,我知道这个google帐户对许多其他用户的日历具有只读访问权限(当我以这个用户的身份登录google日历时,我可以看到它们)。

此外,如果我在此页面上使用Google Apps Explorer:https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list#auth,同时以bots@madeupcompany.co.uk,我得到了所有其他日历的详细信息。

所以我想弄明白,为什么应用浏览器会向我显示所有其他日历,而PHP代码却没有?

共有1个答案

拓拔奇
2023-03-14

服务号不需要提示用户访问,因为您必须对其进行设置。转到Google日历网站。找到日历设置,然后转到日历选项卡,找到您要访问的日历,然后单击“共享:编辑设置”添加服务号电子邮件地址,就像您添加个人电子邮件地址一样。这将为服务号提供与与任何其他用户共享相同的访问权限。

<?php
session_start();        
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';     
/************************************************   
 The following 3 values an befound in the setting   
 for the application you created on Google      
 Developers console.         Developers console.
 The Key file should be placed in a location     
 that is not accessable from the web. outside of 
 web root.   

 In order to access your GA account you must    
 Add the Email address as a user at the     
 ACCOUNT Level in the GA admin.         
 ************************************************/
$client_id = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp.apps.googleusercontent.com';
$Email_address = '1046123799103-nk421gjc2v8mlr2qnmmqaak04ntb1dbp@developer.gserviceaccount.com';     
$key_file_location = '629751513db09cd21a941399389f33e5abd633c9-privatekey.p12';     
$client = new Google_Client();      
$client->setApplicationName("Client_Library_Examples");
$key = file_get_contents($key_file_location);    
// seproate additional scopes with a comma   
$scopes ="https://www.googleapis.com/auth/calendar.readonly";   
$cred = new Google_Auth_AssertionCredentials(    
    $Email_address,      
    array($scopes),     
    $key         
    );      
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {        
    $client->getAuth()->refreshTokenWithAssertion($cred);       
}       
$service = new Google_Service_Calendar($client);    

?>

<html><body>

<?php
$calendarList  = $service->calendarList->listCalendarList();
print_r($calendarList);
while(true) {
    foreach ($calendarList->getItems() as $calendarListEntry) {
        echo "<a href='Oauth2.php?type=event&id=".$calendarListEntry->id." '>".$calendarListEntry->getSummary()."</a><br>\n";
    }
    $pageToken = $calendarList->getNextPageToken();
    if ($pageToken) {
        $optParams = array('pageToken' => $pageToken);
        $calendarList = $service->calendarList->listCalendarList($optParams);
    } else {
        break;
    }
}    

?>
</html> 

使用PHP–服务帐户从教程Google日历API中提取的代码

 类似资料:
  • 问题内容: 我经常被要求解决struts.xml配置错误。现在,在更新到更高版本的Struts2之后,我自己遇到了这种不匹配的情况。导致以下错误: 好吧,我猜是可以解决的。但是,有没有一种聪明的方法来html打印所有可用的URL路径? 感谢这个社区的猜测 问题答案: 您可以使用config-browser插件来实现。检查参考文档。该插件的功能之一是 显示所有可访问的操作URL

  • 问题内容: 我想知道系统上的可执行文件使用了哪些库。更具体地说,我想对使用最多的库以及使用它们的二进制文件进行排名。我怎样才能做到这一点? 问题答案: 使用到列表共享为每个可执行文件库。 清理输出 排序,计算计数,按计数排序 要在“ / bin”目录中找到所有可执行文件的答案: 将上面的“ / bin”更改为“ /”以搜索所有目录。 输出(仅针对/ bin目录)将如下所示: 编辑-删除了“ gre

  • 问题内容: 是否可以强制所有客户端使用socket.io更新?我尝试了以下操作,但是当新客户端连接时,它似乎没有更新其他客户端: 服务器端JavaScript: 我正在尝试向所有客户端发送一条消息,其中包含当前已连接的用户数,它可以正确发送用户数量…。但是,客户端本身似乎不会更新,直到刷新页面为止。我希望这是实时发生的。 客户端JavaScript: 问题答案: 实际上,它根本没有向其他客户端发送

  • 我希望使用calendar对象显示日期。 ...和... 我面临的问题是,为什么以下输出中的出生日期会给我一条未知的、荒谬的长线: ID员工编号:123 员工姓名:明武 出生日期:java.util.GregorianCalendar[time=?, areFieldsSet=false, areAllFieldsSet=true, lenient=true, zone=sun.util.cale

  • 如果勾选星期一,日历中所有星期一的值底色变亮,

  • 我正在从V2-V3迁移谷歌日历API的过程中。我需要更新另一个用户日历列表。在V2中,通过重写OAuth令牌上的requestor_id字段,这是可能的。但是现在我也在使用OAuth2,这个技术不起作用了。 列出日历列表的请求是: 使用Calendar API V3可以实现此功能吗?