如何使用php将事件插入用户谷歌日历?

时间:2015-12-31 04:29:48

标签: php calendar google-calendar-api

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

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

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

4 个答案:

答案 0 :(得分:4)

使用PHP enter image description here

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

有关详细信息,请查看此处的官方文档client library

答案 1 :(得分:3)

如果您想为其他人执行事件插入,那么您必须通过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是应用程序的auth端点的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);

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您无需订购此类复杂功能,您可以订购用户活动日历以通过网址创建活动:

$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'] =&gt;事件名称

$event_detail["datetime"] =&gt;事件以此格式开始日期时间(YmdTHisT字母代表时间分隔符(ex 20151212T160000) - 活动于2015年开始 - 12 - 12/16:00h

$event_detail["datetime_end"] =&gt;与datetime相同的规则 - 事件结束

$location =&gt;事件的位置

$details =&gt;事件描述

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

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

所以你可以在锚中插入所有这些:

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

编辑:经过一些搜索后,我发现它在堆栈溢出时解释相同:Link to add to google calendar

相关问题