簡體   English   中英

如何使用 php 將事件插入用戶谷歌日歷?

[英]How to insert event to user google calendar using php?

我有以下這些代碼可以插入到我的特定谷歌日歷中。 嗯它很成功,但是如何讓用戶可以添加到自己的日歷中呢? 有人可以幫助我......我的預期結果就像用戶可以通過谷歌登錄......這意味着用戶可以添加到他們自己的谷歌日歷。 謝謝。

添加到我的特定日歷的代碼

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客戶端庫

// 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);

有關更多詳細信息,請從此處查看官方文檔事件:插入

當您想為其他人插入事件時,您必須通過 OAuth 2.0 實現。 您的應用程序必須使用 OAuth 2.0 來授權來自經過身份驗證的用戶的請求。 不支持其他授權協議。

使用 OAuth 2.0 的應用程序必須具有向 OAuth 2.0 標識應用程序的憑據。 具有這些憑據的應用程序可以訪問您為項目啟用的 API。 要為您的項目獲取 Web 應用程序憑據,請完成以下步驟:

  • 轉到 Google Developers Console 和 Open Credentials 頁面。

  • 通過單擊 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

現在要為訪問令牌交換授權代碼,請使用 authenticate 方法:

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

現在在庫中設置您的訪問令牌

 $client->setAccessToken($access_token);

現在,您可以根據需要輕松刪除/插入/編輯事件

<!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

不需要這樣復雜的操作,您可以通過 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"] => 與 datetime 相同的規則 - 事件結束

$location => 活動地點

$details => 活動描述

其他參數應該是事件的來源。

$trp = false - 我不確定這是做什么的

所以你可以將所有這些插入一個錨點中:

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

編輯:經過一番搜索后,我在堆棧溢出上找到了它,它的解釋相同: Link to add to google calendar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM