【问题标题】:Google 日历推送通知设置
【发布时间】:2015-04-12 07:16:24
【问题描述】:

我正在尝试使用 PHP 和 V3 api 为 Google 日历设置推送通知。

我已获得 Auth2.0 权限,并且能够从我的应用程序在 google 上创建事件。现在我想知道用户何时对谷歌日历进行了任何更改(CRUD 操作)。

这是我的代码:

private $imageService;
public $google_client;
public $google_calendar;

public function __construct()
{
    $this->imageService = new ImageService();
    $this->google_client = new Google_Client();
    $this->google_client->setApplicationName($_ENV['GOOGLE_APP_NAME']);
    $this->google_client->setDeveloperKey($_ENV['GOOGLE_API_KEY']);
    $this->google_client->setClientId($_ENV['CLIENT_ID']);
    $this->google_client->setClientSecret($_ENV['CLIENT_SECRET']);
    $this->google_client->setAccessType('offline');
    $this->google_client->setIncludeGrantedScopes(true);
    $this->google_client->setScopes(array('email', 'profile', 'https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/calendar'));
    $this->google_calendar = new Google_Service_Calendar($this->google_client);

}

 public function googleCalendarWatch($uuid){

    $channel =  new Google_Service_Calendar_Channel($this->google_client);
    $channel->setId($uuid);
    $channel->setType('web_hook');
    $channel->setAddress("https://example.com/google/googleNotifications");
    $channel->setExpiration("1919995862000");
    $this->google_calendar->events->watch('primary', $channel);

}

这是输出:

Google_Service_Calendar_Channel Object (
    [internal_gapi_mappings:protected] => Array ( ) 
    [address] => 
    [expiration] => 1426272395000 
    [id] => aee2b430-34bf-42bc-a597-ada46db42799 
    [kind] => api#channel 
    [params] => 
    [payload] => 
    [resourceId] => 51IKGpOwCJ6EMraQMUc1_04MODk 
    [resourceUri] => https://www.googleapis.com/calendar/v3/calendars/primary/events?key=AIzaSyBFUvq3OZO6ugAKvz7l8NgLS0V6DUJq8Vc&alt=json 
    [token] => 
    [type] => 
    [modelData:protected] => Array ( ) 
    [processed:protected] => Array ( ) )

到目前为止我还不知道为什么address返回null,也许这就是问题所在。但我不知道如何解决它。

还阅读此内容:#26730263 并查看我自己的代码并没有太大区别。

我做了谷歌所说的所有事情,注册域、添加凭据、api 密钥、允许推送域等等。

【问题讨论】:

  • 您将用户重定向到谷歌服务器以获取身份验证令牌的部分在哪里?
  • @mathieu- 都是 wrkg...我在我的 webhook url 中获得点击,但它只是空白...我如何从 webhook 中选择响应。
  • 您的用户需要经过身份验证才能添加新的 webhook
  • @MathieudeLorimier- 我已完成身份验证并拥有经过验证的 webhook。我得到了如上所示的东西,但我的问题是当我更新谷歌日历中的数据时,我没有得到任何数据(来自 webhook)。
  • @Sinto 根据第一个答案(在上面链接的问题中),您没有在 webhook 中获得任何数据,您只会收到更改的通知。然后,您需要找出发生了什么变化。或者你是说你的钩子根本没有被调用?

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


【解决方案1】:

为每个单独的资源创建一个通知渠道,然后对该资源的任何修改都会通知您。以下信息直接来自 Google(创建通知渠道)。

提出监视请求:

每个可观看的 Google 日历 API 资源在以下形式的 URI 处都有一个关联的 watch 方法:

https://www.googleapis.com/**apiName**/**apiVersion**/**resourcePath**/watch

要为有关特定资源更改的消息设置通知通道,请向资源的 watch 方法发送 POST 请求。 每个通知通道都与特定用户和特定资源(或资源集)相关联。除非当前用户拥有或有权访问此资源,否则监视请求将不会成功。

示例:

开始观察给定日历上一系列事件的变化:

POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://example.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myCalendarChannelDest", // (Optional) Your channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
  }
}

参考:Google (Creating notification channels)(2018 年 3 月 19 日)。

  • 地址?
  • 令牌?

【讨论】:

    【解决方案2】:
    <?php
    require __DIR__ . '/vendor/autoload.php';
    
    if (php_sapi_name() != 'cli') {
        throw new Exception('This application must be run on the command line.');
    }
    
    /**
     * Returns an authorized API client.
     * @return Google_Client the authorized client object
     */
    function getClient()
    {
        $client = new Google_Client();
        $client->setApplicationName('Google Calendar API PHP Quickstart');
        $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
        $client->setAuthConfig('credentials.json');
        $client->setAccessType('offline');
        $client->setPrompt('select_account consent');
    
        // Load previously authorized token from a file, if it exists.
        // The file token.json stores the user's access and refresh tokens, and is
        // created automatically when the authorization flow completes for the first
        // time.
        $tokenPath = 'token.json';
        if (file_exists($tokenPath)) {
            $accessToken = json_decode(file_get_contents($tokenPath), true);
            $client->setAccessToken($accessToken);
        }
    
        // If there is no previous token or it's expired.
        if ($client->isAccessTokenExpired()) {
            // Refresh the token if possible, else fetch a new one.
            if ($client->getRefreshToken()) {
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
            } else {
                // Request authorization from the user.
                $authUrl = $client->createAuthUrl();
                printf("Open the following link in your browser:\n%s\n", $authUrl);
                print 'Enter verification code: ';
                $authCode = trim(fgets(STDIN));
    
                // Exchange authorization code for an access token.
                $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
                $client->setAccessToken($accessToken);
    
                // Check to see if there was an error.
                if (array_key_exists('error', $accessToken)) {
                    throw new Exception(join(', ', $accessToken));
                }
            }
            // Save the token to a file.
            if (!file_exists(dirname($tokenPath))) {
                mkdir(dirname($tokenPath), 0700, true);
            }
            file_put_contents($tokenPath, json_encode($client->getAccessToken()));
        }
        return $client;
    }
    
    
    // Get the API client and construct the service object.
    $client = getClient();
    $service = new Google_Service_Calendar($client);
    
    // Print the next 10 events on the user's calendar.
    $calendarId = 'primary';
    $optParams = array(
      'maxResults' => 10,
      'orderBy' => 'startTime',
      'singleEvents' => true,
      'timeMin' => date('c'),
    );
    $results = $service->events->listEvents($calendarId, $optParams);
    $events = $results->getItems();
    
    if (empty($events)) {
        print "No upcoming events found.\n";
    } else {
        print "Upcoming events:\n";
        foreach ($events as $event) {
            $start = $event->start->dateTime;
            if (empty($start)) {
                $start = $event->start->date;
            }
            printf("%s (%s)\n", $event->getSummary(), $start);
        }
    }
    

    Full Tutorial

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多