【问题标题】:How to insert event to user google calendar using php?如何使用 php 向用户谷歌日历插入事件?
【发布时间】:2016-04-05 02:32:34
【问题描述】:

我将以下代码插入到我的特定谷歌日历中。那么它非常成功,但是如何让用户可以添加到自己的日历中?有人可以帮助我......我的预期结果是用户可以通过谷歌登录......这意味着用户可以添加到他们自己的谷歌日历。谢谢。

要添加到我的特定日历的代码

require_once './vendor/google/apiclient/src/Google/autoload.php';

$key_file_location = 'Calendar-96992da17e2dda.p12'; // key.p12 to create in the Google API console

$client_id = '6094969424649-compute@developer.gserviceaccount.com';
$service_account_name = 'testsd-440@studied-zephyr-117012.iam.gserviceaccount.com'; // Email Address in the console account

if (strpos($client_id, "gserviceaccount") == false || !strlen($service_account_name) || !strlen($key_file_location)) {
    echo "no credentials were set.";
    exit;
}

/** We create service access ***/
$client = new Google_Client();  

/************************************************
If we have an access token, we can carry on.  (Otherwise, we'll get one with the help of an  assertion credential.)
Here we have to list the scopes manually. We also supply  the service account
 ************************************************/
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'), // ou calendar_readonly
$key
);

$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion($cred);
}
$_SESSION['service_token'] = $client->getAccessToken();



// Get the API client and construct the service object.
$service = new Google_Service_Calendar($client);


    /************* INSERT ****************/
$event = new Google_Service_Calendar_Event(array(
  'summary' => 'My Summary',
  'location' => 'My Location',
  'description' => 'My Description',
  'start' => array(
    'dateTime' => '2015-12-31T09:09:00',
    'timeZone' => 'Asia/Singapore',
  ),
  'end' => array(
    'dateTime' => '2015-12-31T17:16:00',
    'timeZone' => 'Asia/Singapore',
  ),
  'attendees' => array(
    array('email' => 'abc@gmail.com'),
    array('email' => 'def@gmail.my'),
  ),
  'reminders' => array(
    'useDefault' => FALSE,
    'overrides' => array(
      array('method' => 'email', 'minutes' => 24 * 60),
      array('method' => 'popup', 'minutes' => 10),
    ),
  ),
));

$events = $service->events->insert('primary', $event);
printf('Event created: %s', $events->htmlLink);

【问题讨论】:

    标签: php calendar google-calendar-api


    【解决方案1】:

    当您想为其他人插入事件时,您必须通过 OAuth 2.0 实施。您的应用程序必须使用 OAuth 2.0 来授权来自经过身份验证的用户的请求。不支持其他授权协议。

    使用 OAuth 2.0 的应用程序必须具有向 OAuth 2.0 识别应用程序的凭据。拥有这些凭据的应用程序可以访问您为项目启用的 API。要为您的项目获取 Web 应用程序凭据,请完成以下步骤:

    • 转到 Google Developers Console 并打开凭据页面。

    • 通过单击 OAuth 标题下的 Create new Client ID 创建 OAuth 2.0 凭据。接下来,在相关表中查找您的应用程序的client IDclient secret

    • 您还可以通过单击客户端 ID 从该页面创建和编辑重定向 URI。重定向 URI 是指向应用程序身份验证端点的 URI,这些端点处理来自 OAuth 2.0 服务器的响应。

    • 下载 client_secrets.json 文件并将其安全地存储在只有您的应用程序可以访问的位置。

    现在有两个阶段的工作。

    第一阶段

    在第一阶段,您会将用户重定向到 Google 服务器以授权您的应用程序进行更改。由于您已经在使用 Google PHP Clinet 库,所以事情会很容易

     $client = new Google_Client();
     client->setAuthConfigFile('client_secrets.json');  //file downloaded earlier
     $client->addScope("https://www.googleapis.com/auth/calendar");
    

    生成一个 URL 以从 Google 的 OAuth 2.0 服务器请求访问:

     $auth_url = $client->createAuthUrl();
     header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); //redirect user to Google
    

    第二阶段

    当用户授权您的应用程序和 Google 使用临时令牌代码将用户重定向到您的网站时,第二阶段开始。

    如果用户拒绝或错误响应:

    https://localhost/auth?error=access_denied
    

    授权码响应:

    https://localhost/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
    

    现在要为访问令牌交换授权码,请使用身份验证方法:

    $client->authenticate($_GET['code']);
    $access_token = $client->getAccessToken();
    

    现在在库中设置您的访问令牌

     $client->setAccessToken($access_token);
    

    现在,您可以根据需要轻松删除/插入/编辑事件了

    【讨论】:

      【解决方案2】:

      使用 PHP client library

      // Refer to the PHP quickstart on how to setup the environment:
      // https://developers.google.com/google-apps/calendar/quickstart/php
      // Change the scope to Google_Service_Calendar::CALENDAR and delete any stored
      // credentials.
      
      $event = new Google_Service_Calendar_Event(array(
        'summary' => 'Google I/O 2015',
        'location' => '800 Howard St., San Francisco, CA 94103',
        'description' => 'A chance to hear more about Google\'s developer products.',
        'start' => array(
          'dateTime' => '2015-05-28T09:00:00-07:00',
          'timeZone' => 'America/Los_Angeles',
        ),
        'end' => array(
          'dateTime' => '2015-05-28T17:00:00-07:00',
          'timeZone' => 'America/Los_Angeles',
        ),
        'recurrence' => array(
          'RRULE:FREQ=DAILY;COUNT=2'
        ),
        'attendees' => array(
          array('email' => 'lpage@example.com'),
          array('email' => 'sbrin@example.com'),
        ),
        'reminders' => array(
          'useDefault' => FALSE,
          'overrides' => array(
            array('method' => 'email', 'minutes' => 24 * 60),
            array('method' => 'popup', 'minutes' => 10),
          ),
        ),
      ));
      
      $calendarId = 'primary';
      $event = $service->events->insert($calendarId, $event);
      printf('Event created: %s\n', $event->htmlLink);
      

      更多详情请查看官方文档Events: insert

      【讨论】:

      • 我之前确实开发过这段代码。但现在是我需要让其他用户不仅我可以添加日历。目前我的代码已成功添加到我的日历中,但其他人没有。
      • 您可以尝试使用这个新的 API,它也允许这样做。
      • 我研究了那个页面..但不完全明白你能告诉我完整的方法吗?
      • 让我知道你卡在哪里了。我会随时帮助你。
      • 我所有的代码都在我的问题中......这些功能仅用于插入我的日历。如何让其他用户也可以插入自己的日历?你的答案对我来说不是很清楚。
      【解决方案3】:

      没有必要这么复杂,您可以命令用户事件日历通过 url 创建事件:

      $data['calendar_url']['google'] =   
          'http://www.google.com/calendar/event?action=TEMPLATE'.
          '&text='.$event_detail["title"].
          '&dates='.$event_detail["datetime"].'/'.$event_detail["datetime_end"].
          '&location='.$event_detail["location"].
          '&details='.$event_detail["details"].
          '&trp=false'.
          '&sprop=website:www.someurl.com'.
          '&sprop=name:Name'
      ;
      

      变量值:

      $event_detail['title'] => 事件名称

      $event_detail["datetime"] => 这种格式的事件开始日期时间 (YmdTHis) T 字母代表时间分隔符(例如 20151212T160000) - 事件开始于 2015 - 12 - 12 / 16:00h

      $event_detail["datetime_end"] => 与日期时间相同的规则 - 事件结束

      $location => 活动地点

      $details => 事件描述

      其他参数应该是事件的来源。

      $trp = false - 我不确定这是做什么的

      所以你可以将所有这些都插入到一个锚中:

      <a href='<?= $data["calendar_url"]["google"]; ?>'>Create google event</a>
      

      编辑:经过一番搜索后,我在 stack-overflow 上发现了这一点,它的解释是一样的:Link to add to google calendar

      【讨论】:

      • 感谢您的帮助。我需要尝试查看您的代码。一旦测试,我会给出反馈。
      • 我使用此模板创建了一个网址,您可以自己查找:calendar.google.com/calendar/…
      • 这是个好主意,但不实用..这会让用户需要在谷歌日历中手动添加。那么如何重定向回我的自定义页面呢?
      • 我不明白什么自定义页面?用户只需推送保存即可将事件添加到日历中
      • 我的意思是……在保存过程之后……我需要重定向到我自己的页面……而不是谷歌日历。
      【解决方案4】:
      <!DOCTYPE html><html>
      <head>
          <title>GOOGLE CALENDAR - insert, change and delete Google Calenda event</title>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <meta charset="UTF-8">
          <style>
              body{
                  margin: 0;
                  width: 100%;
                  font-family: Verdana, Arial;
              }
              #centro{
                  width: 780px;
                  margin: auto;
              }
              .calendario{
                  position: relative;
                  width: 800px;
                  height: 600px;
                  margin-left:-390px;
                  left: 50%;
                  float: left;
                  -webkit-border-radius: 5px;
                  -moz-border-radius: 5px;
                  border-radius: 5px;
              }
              #datahora{
                  width: 250px;
                  float: left;
              }
              #cento{
                  width: 780px;
                  float: left;
              }
              #centro .primo{
                  width: 100%;
                  background-color: #E3E9FF;
                  padding: 10px;
                  margin: 50px 0;
                  float: left;
                  -webkit-border-radius: 5px;
                  -moz-border-radius: 5px;
                  border-radius: 5px;
              }
              label {
                  width: 780px;
                  margin: 5px 5px 0;
                  float: left;
                  padding-top: 10px;
              }
      
              input{
                  margin: 5px;
                  float: left;
                  padding: 5px 10px;
                  -webkit-border-radius: 5px;
                  -moz-border-radius: 5px;
                  border-radius: 5px;
                  border: 1px #CCC solid;
              }
              input[type="text"]{
                  width: 750px;
              }
              input[type="date"]{
                  width: 125px;
              }
              input[type="time"]{
                  width: 70px;
              }
              input[type="submit"]{
      
              }
      
              input:focus{
                  border: 1px  #cc0000 solid;
                  box-shadow: 0 0 5px #cc0000;
              }
              .btn {
                  background: #3498db;
                  background-image: -webkit-linear-gradient(top, #3498db, #2980b9);
                  background-image: -moz-linear-gradient(top, #3498db, #2980b9);
                  background-image: -ms-linear-gradient(top, #3498db, #2980b9);
                  background-image: -o-linear-gradient(top, #3498db, #2980b9);
                  background-image: linear-gradient(to bottom, #3498db, #2980b9);
                  -webkit-border-radius: 5;
                  -moz-border-radius: 5;
                  border-radius: 5px;
                  font-family: Arial;
                  color: #ffffff;
                  font-size: 20px;
                  padding: 10px 20px 10px 20px;
                  text-decoration: none;
                  cursor: pointer;
              }
      
              .btn:hover {
                  background: #3cb0fd;
                  background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db);
                  background-image: -moz-linear-gradient(top, #3cb0fd, #3498db);
                  background-image: -ms-linear-gradient(top, #3cb0fd, #3498db);
                  background-image: -o-linear-gradient(top, #3cb0fd, #3498db);
                  background-image: linear-gradient(to bottom, #3cb0fd, #3498db);
                  text-decoration: none;
              }
      
          </style>
      </head>
      <body>
      
          <?php
          session_start();
          require 'google-api-php-client-master/src/Google/autoload.php';
          require_once 'google-api-php-client-master/src/Google/Client.php';
          require_once 'google-api-php-client-master/src/Google/Service/Calendar.php';
      
          $client_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; //change this
          $Email_address = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; //change this
          $key_file_location = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; //change this
          $client = new Google_Client();
          $client->setApplicationName("Client_Library_Examples");
          $key = file_get_contents($key_file_location);
      
      
          $scopes = "https://www.googleapis.com/auth/calendar";
          $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);
      
          $calendarList = $service->calendarList->listCalendarList();
          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;
              }
          }
      
      
          if ($_POST) {
      
              $Summary = $_POST['Summary'];
              $Location = $_POST['Location'];
              $DateStart = $_POST['DateStart'];
              $TimeStart = $_POST['TimeStart'];
              $DateEnd = $_POST['DateEnd'];
              $TimeEnd = $_POST['TimeEnd'];
              $status = $_POST['status'];
      
      
      
              if ($status == 'Insert') {
                  //--------------- trying to insert EVENT --------------- 
                  $event = new Google_Service_Calendar_Event();
                  $event->setSummary($Summary);
                  $event->setLocation($Location);
                  $start = new Google_Service_Calendar_EventDateTime();
                  $datatimeI = geratime(DataIT2DB($DateStart), $TimeStart);
      
                  $start->setDateTime($datatimeI);
                  $event->setStart($start);
                  $end = new Google_Service_Calendar_EventDateTime();
                  $datatimeF = geratime(DataIT2DB($DateEnd), $TimeEnd);
      
                  $end->setDateTime($datatimeF);
                  $event->setEnd($end);
                  $attendee1 = new Google_Service_Calendar_EventAttendee();
                  $attendee1->setEmail('xxxxxxx@gmail.com');
                  $attendees = array($attendee1);
                  $event->attendees = $attendees;
                  $createdEvent = $service->events->insert('primary', $event);
                  $_SESSION['eventID'] = $createdEvent->getId();
              } else if ($status == 'Cancel') {
                  //--------------- trying to del EVENT --------------- 
                  $createdEvent = $service->events->delete('primary', $_SESSION['eventID']);
              } else if ($status == 'Update') {
                  //--------------- trying to update EVENT --------------- 
      
                  $rule = $service->events->get('primary', $_SESSION['eventID']);
      
      
                  $event = new Google_Service_Calendar_Event();
                  $event->setSummary($Summary);
                  $event->setLocation($Location);
                  $start = new Google_Service_Calendar_EventDateTime();
                  $datatimeI = geratime(DataIT2DB($DateStart), $TimeStart);
      
                  $start->setDateTime($datatimeI);
                  $event->setStart($start);
                  $end = new Google_Service_Calendar_EventDateTime();
                  $datatimeF = geratime(DataIT2DB($DateEnd), $TimeEnd);
      
                  $end->setDateTime($datatimeF);
                  $event->setEnd($end);
                  $attendee1 = new Google_Service_Calendar_EventAttendee();
                  $attendee1->setEmail('xxxxxxxxxx@gmail.com'); //change this
                  $attendees = array($attendee1);
                  $event->attendees = $attendees;
      
                  $updatedRule = $service->events->update('primary', $rule->getId(), $event);
              }
          }
      
          function DataIT2DB($datapega) {
              if ($datapega) {
                  $data = explode('/', $datapega);
                  if (count($data) > 1) {
                      $datacerta = $data[2] . '-' . $data[1] . '-' . $data[0];
                  } else {
                      $datacerta = $datapega;
                  }
              } else {
                  $datacerta = $datapega;
              }
              return $datacerta;
          }
      
          function geratime($DateStart, $TimeStart) {
              $dataHora = $DateStart . 'T' . $TimeStart . ':00.000+02:00'; //Fuso Rome
              return $dataHora;
          }
          ?>
      
          <div id="contenut" style="width: 100%; float: left;">
              <div id="centro">
                  <div class="primo">
                      <form name="adicionar" method="POST" action="#">
                          ID evento: <?php echo ( isset($_SESSION['eventID']) ? $_SESSION['eventID'] : "" ); ?>
                          <input type="hidden" name="" value="<?php echo ( isset($_SESSION['eventID']) ? $_SESSION['eventID'] : "" ); ?>" />
                          <input type="text" name="Summary" value="<?php echo ( isset($_POST['Summary']) ? $_POST['Summary'] : "" ); ?>" placeholder="Title"/>
                          <input type="text" name="Location" value="<?php echo ( isset($_POST['Location']) ? $_POST['Location'] : "" ); ?>" placeholder="Location "/>
                          <div id="datahora">
                              <label>Starting Date</label>
                              <input type="date" name="DateStart" value="<?php echo ( isset($_POST['DateStart']) ? $_POST['DateStart'] : "" ); ?>" placeholder="DD/MM/YYYY"/>
                              <input type="time" name="TimeStart" value="<?php echo ( isset($_POST['TimeStart']) ? $_POST['TimeStart'] : "" ); ?>" placeholder="10:20"/>
                          </div>
                          <div id="datahora">
                              <label>Ending Date</label>
                              <input type="date" name="DateEnd" value="<?php echo ( isset($_POST['DateEnd']) ? $_POST['DateEnd'] : "" ); ?>" placeholder="DD/MM/YYYY"/>
                              <input type="time" name="TimeEnd" value="<?php echo ( isset($_POST['TimeEnd']) ? $_POST['TimeEnd'] : "" ); ?>" placeholder="10:20" />
                          </div>
                          <div id="cento">
                              <input class="btn" type="submit" value="Insert" name="status" />
                              <input class="btn" type="submit" value="Cancel" name="status" />
                              <input class="btn" type="submit" value="Update" name="status" />
                          </div>
      
                      </form>
                  </div>
              </div>
          </div>
      </body>
      

      请参阅此代码它的工作原理。 插入您自己的 client_id、Email_address 和 key_file_location

      【讨论】:

      • 这些代码是否允许其他用户也添加到他们的日历中或仅添加到我的日历中?
      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多