Google calendar api 为什么尝试提取事件列表时总是返回404错误?

Google calendar api 为什么尝试提取事件列表时总是返回404错误?,google-calendar-api,google-api-php-client,Google Calendar Api,Google Api Php Client,就我所知,以下几点应该是可行的。它是从示例代码中提取的,类似的请求可以很好地解决。是的,设置了范围;是的,所讨论的日历是专门共享的。下面是代码--您会注意到,我只是想在这一点上让事情正常工作,但错误数据并没有太大帮助: error_reporting(E_ALL); session_start(); require_once 'google_settings.php'; require_once 'google-api-php-client/autoload.php'; $client_id

就我所知,以下几点应该是可行的。它是从示例代码中提取的,类似的请求可以很好地解决。是的,设置了范围;是的,所讨论的日历是专门共享的。下面是代码--您会注意到,我只是想在这一点上让事情正常工作,但错误数据并没有太大帮助:

error_reporting(E_ALL);
session_start();

require_once 'google_settings.php';
require_once 'google-api-php-client/autoload.php';

$client_id = GA_CLIENT_ID; //Client ID
$service_account_name = GA_SERVICE_EMAIL; //Email Address
$key_file_location = GA_KEY_FILE_LOCATION; //key.p12
if ($client_id == '<YOUR_CLIENT_ID>' || !strlen($service_account_name) || !strlen($key_file_location)) {
    echo missingServiceAccountDetailsWarning();
}
try {
    $client = new Google_Client();
    $client->setApplicationName("Just Testing");
    $client->setDeveloperKey(GA_API_KEY);
    $service = new Google_Service_Calendar($client);
    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();
    $optParams = array();
    $results = $service->events->listEvents('xyzxyz', $optParams);
    echo "<h3>Results Of Call:</h3>\n<pre>";
    if (is_array($results)) {
        foreach ($results as $item) {
            var_dump($item);
            echo "\n\n";
        }
    } else var_dump($results);
    echo "\n</pre>";
}
catch (Exception $e) {
    echo $e->getMessage();
}
错误报告(E_ALL);
会话_start();
需要一次“google_settings.php”;
需要一次“GoogleAPI php客户端/autoload.php”;
$client_id=GA_client_id//客户端ID
$service\u account\u name=GA\u service\u EMAIL//电子邮件地址
$key\u file\u location=GA\u key\u file\u location//图例1.p12
如果($client_id=''||!strlen($service_account_name)| |!strlen($key_file_location)){
echo missingServiceAccountDetailsWarning();
}
试一试{
$client=新的Google_客户端();
$client->setApplicationName(“仅测试”);
$client->setDeveloperKey(GA_API_密钥);
$service=新谷歌服务日历($client);
如果(isset($_会话['service_token'])){
$client->setAccessToken($_会话['service_token']);
}
$key=file\u get\u contents($key\u file\u location);
$cred=新的谷歌认证断言(
$service\u account\u name,
数组('https://www.googleapis.com/auth/calendar'),
$key
);
$client->setAssertionCredentials($cred);
如果($client->getAuth()->isAccessTokenExpired()){
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$\会话['service\u token']=$client->getAccessToken();
$optParams=array();
$results=$service->events->listEvents('xyzxyz',$optrams);
回显“调用结果:\n”;
if(is_数组($results)){
foreach($结果作为$项){
var_dump(项目);
回显“\n\n”;
}
}其他变量转储(结果);
回音“\n”;
}
捕获(例外$e){
echo$e->getMessage();
}
我经常遇到的错误如下所示(无论我使用哪个测试日历——是的,我已经启用了单独共享):

调用GET时出错https://www.googleapis.com/calendar/v3/calendars/xyzxyz?key=: (404)未找到

这样行吗?我只是没看到什么吗


谢谢

经过进一步的挖掘,我发现了。我跟着那条路走;但是CalendarAPI已经在开发人员的控制台中显示为已启用,所以我不确定这是否有任何作用然而,我从未进入同意屏幕信息,如第2部分第1步中所述,当我在那一点上测试代码时,没有进一步修改,它工作了


由于我的应用程序仅使用公共API访问,因此我将同意屏幕信息留空,但无论您是否打算使用,似乎都必须输入同意屏幕数据。

是否为“xyzxyz”是您要从中列出事件的日历id?您是否向您的服务帐户授予了允许访问用户数据的域范围的委派()权限?另外,您可以在GoogleAPI浏览器中尝试您的请求是,“xyzxyz”是日历id(当然,实际的不同)。是的,我向我的服务帐户授予了域范围的授权。我的请求在API浏览器中工作——很抱歉没有提到我也尝试过——当我在页面上查看后台时,它甚至使用相同的URL与google通信。我完全不知所措。在再次查看之后,我认为可能需要指定一个我模拟的用户:
$cred->sub=name@domain.com';,但这没有帮助。有什么想法吗?在PHP客户端库中,您可以通过在您创建的Google_AssertionCredentials对象上设置子字段来模拟用户$auth->sub=$userEmail@我不明白你刚才说的和我之前的评论有什么不同。。。