【问题标题】:Google Cal API - Script to Check EventsGoogle Cal API - 检查事件的脚本
【发布时间】:2016-02-24 00:47:27
【问题描述】:

我想构建一个脚本,通过 Google 日历 PHP 客户端检查经过身份验证的用户的 Google 日历。我能够构建一个简单的页面,让用户进行身份验证并授予日历事件的权限。我收到一个令牌,然后通过以下方式获取 15 个即将发生的事件:

$googleCal = new Google_Service_Calendar($googleClient);
$results = $googleCal->events->listEvents($calendarId, $optParams);

但我正在苦苦挣扎的是如何保存它,这样我就可以让脚本每天检查它以查看是否添加了新事件。我认为我所拥有的只是努力越过终点线。

谢谢!

--

更新,我正在尝试使用刷新令牌,这是我的代码:

public function checkRedirectCode()
  {
        if(isset($_GET['code']))
        {
              $this->client->authenticate($_GET['code']);

        //    $this->setToken($this->client->getRefreshToken());
              $this->setToken($this->client->getAccessToken());

              $this->storeUser($this->getPayload());

              return true;
        }

        return false;
  }

  public function setToken($token)
  {
              $_SESSION['access_token'] = $token;
              $this->client->setAccessToken($token);

  }

我已经能够回显刷新令牌,因此我知道我得到了正确的刷新令牌,但是每当我使用注释掉的字符串时都会出错。有什么想法吗?

【问题讨论】:

  • 你试过使用'getEventsForDay(date)'吗?这将为您提供给定日期发生的所有事件。 developers.google.com/apps-script/reference/calendar/…
  • 取回的token只在一个小时内有效,所以一定要改用刷新token,否则你将无法每天运行脚本。如果您希望我分享如何执行此操作,请告诉我,如果您已经在执行此操作,请道歉。
  • @jksn.co 如果你有一个例子,我会喜欢的!
  • @ChrisOlson 考虑一下这两个部分的工作。 1)您的原始脚本工作正常,您只需将刷新令牌保存到数据库,此时您不需要使用刷新令牌。 2) 构建一个每天运行的脚本(在 cron 上),它使用刷新令牌(就像我在下面的回答中一样)。

标签: php google-calendar-api google-api-php-client


【解决方案1】:

要使您的脚本能够在原始访问令牌的生命周期(仅持续一个小时)之后被调用,您需要在初始授权期间检索并存储刷新令牌,然后使用它来生成新的访问权限每次脚本运行时的令牌。

访问令牌的生命周期有限。如果您的应用程序需要访问 在单个访问令牌的生命周期之外的 Google API,它可以 获取刷新令牌。刷新令牌允许您的应用程序 获取新的访问令牌。

https://developers.google.com/identity/protocols/OAuth2#basicsteps(4. 如有必要,刷新访问令牌。)

用户对您的应用进行身份验证后,他们将使用code 查询字符串返回到您的重定向 URI。

以下是验证和获取刷新令牌的示例(这使用 Analytics,但对于其他服务应该相同):

$client = new Google_Client();
$client->setClientId('xxx');
$client->setClientSecret('xxx');
$client->setRedirectUri('xxx');

//authenticate with the code returned from google
$authenticate = $client->authenticate($_GET['code']);

//get the refresh token
$refreshToken = $client->getRefreshToken();

//store refresh token in database...

然后,当您运行日常脚本时,使用刷新令牌(从您的数据库中检索)生成新的访问令牌:

$client = new Google_Client();
$client->setClientId('xxx');
$client->setClientSecret('yyy');
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);

$client->refreshToken($user->refresh_token);
$newToken = $client->getAccessToken();
$client->setAccessToken($newToken);

【讨论】:

  • 你能看看我在最初的帖子中所做的更新吗?我一直在尝试使用我正确获得的刷新代码(您可以看到注释掉的行),但它不起作用。想法?
  • 刷新token时,是否需要设置范围?或者可以在没有任何明确范围的情况下检索新的 access_token?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多