我正在尝试使用服务帐户在Google日历上创建条目。我真的很接近,但是最后一行是行不通的。我500 Internal Service Error
让它运行时得到提示。否则,程序将毫无错误地运行,无论花费多少。
该Calendar.php
文件的内容可以发现在这里。在insert()
我试图调用方法开始在该文件上的1455线。
<?php
function calendarize ($title, $desc, $ev_date, $cal_id) {
session_start();
/************************************************
Make an API request authenticated with a service
account.
************************************************/
set_include_path( '../google-api-php-client/src/');
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';
// (not real keys)
$client_id = '843319906820-jarm3f5ctbtjj9b7lp5qdcqal54p1he6.apps.googleusercontent.com';
$service_account_name = '843319906820-jarm3f5ctbtjj7b7lp5qdcqal54p1he6@developer.gserviceaccount.com';
$key_file_location = '../google-api-php-client/calendar-249226a7a27a.p12';
// echo pageHeader("Service Account Access");
if (!strlen($service_account_name) || !strlen($key_file_location))
echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("xxxx Add Google Calendar Entries");
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$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()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();
// Prior to this, the code has mostly come from Google's example
// google-api-php-client / examples / service-account.php
// and relates to getting the access tokens.
// The rest of this is about setting up the calendar entry.
//Set the Event data
$event = new Google_Service_Calendar_Event();
$event->setSummary($title);
$event->setDescription($desc);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDate($ev_date);
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDate($ev_date);
$event->setEnd($end);
$calendarService = new Google_Service_Calendar($client);
$calendarList = $calendarService->calendarList;
$events = $calendarService->events;
// if I leave this line, my code won't crash (but it won't do anything, either)
//echo "here"; die();
$events.insert($cal_id, $event, false);
}
?>
我想通了。由于我看不到将服务帐户与API v3一起使用的完整示例,因此我将发布完整的解决方案以供参考。但是,除了实现代码外,还需要做一些事情:
1)您需要转到Google
Developer的控制台,
并将您的帐户标记为“服务帐户”。这会将其与Web应用程序区分开。重要的区别在于,添加事件之前不会提示任何人登录其帐户,因为该帐户属于您的应用程序,而不是最终用户。有关更多信息,请参阅从第5页开始的本文。
2)您需要创建一个公钥/私钥对。在开发人员的控制台中,单击“凭据”。在您的服务帐户下,单击“生成新的P12密钥”。您需要将其存储在某个地方。该文件位置$key_file_location
在下面的代码中成为变量字符串。
3)同样,从开发人员的控制台中,您需要启用Calendar
API。在您的项目中,您会在最左边看到APIs
。选择它并找到Calendar
API。单击它,接受服务条款,并确认它现在显示在Enabled APIs
状态为On
4)在您要向其添加事件的Google日历中,在“设置”下,单击“日历设置”,然后在顶部的“共享此日历”上。在“人员”字段中的“与特定的人共享”下,粘贴服务帐户凭据中的电子邮件地址。将权限设置更改为“对事件进行更改”。不要忘记保存更改。
然后,在某处实现此代码。
如果有混淆或遗漏之处,请发表评论。祝好运!
<?php
function calendarize ($title, $desc, $ev_date, $cal_id) {
session_start();
/************************************************
Make an API request authenticated with a service
account.
************************************************/
set_include_path( '../google-api-php-client/src/');
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';
//obviously, insert your own credentials from the service account in the Google Developer's console
$client_id = '843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6.apps.googleusercontent.com';
$service_account_name = '843319906820-xxxxxxxxxxxxxxxxxxxdcqal54p1he6@developer.gserviceaccount.com';
$key_file_location = '../google-api-php-client/calendar-xxxxxxxxxxxx.p12';
if (!strlen($service_account_name) || !strlen($key_file_location))
echo missingServiceAccountDetailsWarning();
$client = new Google_Client();
$client->setApplicationName("Whatever the name of your app is");
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$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()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$_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);
$start = new Google_Service_Calendar_EventDateTime();
$start->setDateTime($ev_date);
$event->setStart($start);
$end = new Google_Service_Calendar_EventDateTime();
$end->setDateTime($ev_date);
$event->setEnd($end);
$createdEvent = $calendarService->events->insert($cal_id, $event);
echo $createdEvent->getId();
}
?>
一些有用的资源:
服务帐户的Github示例
Google Developers Console,用于在API
v3中插入事件
使用OAuth 2.0访问Google API
我需要在日历上创建谷歌日历活动,并将其他用户添加为该活动的参与者。其目的是向应用程序用户发送日历事件,而无需征得他们的同意(O-Auth)。 在阅读了谷歌的留档后,我发现我需要一个服务号。所以我从我们的G-Suite的一个电子邮件地址创建了一个项目和一个服务号,noreply@xxxxx.com并为其启用了日历应用编程接口。 我创建并下载了一个密钥对(JSON),其内容是, 根据文档,我开始编写身
我正在尝试使用JavaGoogleCalendarAPI连接到日历。java应用程序使用服务帐户。 我有以下代码: 在最后一行,我得到一个IOException消息: ex = (com.google.api.client.auth.oauth2.TokenResponseException) com.google.api.client.auth.oauth2.TokenResponseExcep
我无法使用服务帐户插入google drive。相反,我可以使用相同的服务帐户从google drive下载和更新文件,而不会出现任何问题。我通过转到[我的项目]从特定用户(我们称之为用户“X”)的帐户中创建了服务帐户- 然后,我专门转到用户“X”的MyDrive上的一个文件夹,并将该文件夹与OAuth2的“创建新客户端ID”步骤生成的服务帐户电子邮件地址共享。我确保指定该文件夹的服务帐户权限为“
问题内容: 我想通过服务帐户在Google日历上创建新活动。我可以正确访问并打印我所有日历的列表。但是,当我想创建一个新事件时,响应为403 Forbidden。 我的代码: 和服务器响应: 有任何想法吗?可能是其他作用域,或允许编辑事件(我不知道在哪里可以配置它,并且已经搜索了,保证) 当然,我的日历是公共日历。 任何帮助都将受到欢迎:) 谢谢! 问题答案: 我解决了,问题不是代码,它工作正常。
我正在使用Google. net客户端库来访问谷歌日历应用编程接口。我需要研发创建日历事件并将其发布给用户的应用程序。 这是一个服务器到服务器的应用程序,所以我创建了一个服务帐户,并用它来发送邀请。当从web浏览器提交响应时,创建的与会者对这些事件的响应将被更新,但当来自outlook等任何邮件客户端的响应时,响应将以电子邮件的形式发送给服务帐户电子邮件id(这是一个虚拟电子邮件id)。如何将有效
我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没