quickstart.php - Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


<?PHP

session_start();

if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); }

mb_internal_encoding("UTF-8");

/*
 * quickstart für den Event-Kalender - quickstart.php - Übernahme von Google Calendar events (utf-8)
 * © RaHa
     
 * Teile des Scripts sind copyrigth by google.com und github.com
     

 * !!!!!!!!!!     
 * Speichern im Ordner google_calendar_get_events!     
 * !!!!!!!!!!     

 * Mit dem modifizierten Script quickstart.php werden Events aus dem Google Calendar gelesen und in den Event-Kalender eingetragen

 * Dieses Script läuft unter der Kommandozeile und Aufruf aus der crontab!.
    
 * Ich wünsche viel Spass!

 * Dieses Script wird in der Hoffnung verteilt, dass es nützlich sein wird, aber ohne irgendeine Garantie;
 * ohne auch nur die implizierte Gewährleistung der Marktgängigkeit oder Eignung für einen bestimmten Zweck.
 * Weitere Informationen finden Sie in der GNU General Public License.
 * Siehe Datei: license.txt - http://www.gnu.org/licenses/gpl.html

 * Sie können diese Datei unter den Bedingungen der GNU General Public License frei verwenden und weiter verbreiten.

 *
 * Sie können Änderungen vornehmen oder individuell anpassen.
 * Achtung: Fehlerhafte Angaben können Probleme verursachen!
 * Testen Sie einzelne Änderungen immer gleich bevor weitere vorgenommen werden.
 *

 * DIESES SCRIPT ÜBERNIMMT WICHTIGE INFORMATIONEN AUS GOOGLE CALENDAR - GGF. WEITERE DATEN in Beschreibung übernehmen!     
*/

/* API laden - Wert an eigene Umgebung anpassen */
require_once '/var/www/vhosts/domain/domain.tld/google_calendar_get_events/vendor/autoload.php';

/* OAuth-Client-ID Credentials JSON-Datei $credentials_file - Wert an eigene Umgebung anpassen */ 
$credentials_file = YOUR CREDENTIAL FILE!

/**
 * Returns an authorized API client.
 * @return Google_Client the authorized client object
 */
function getClient()
{
    global $credentials_file;

    $client = new Google_Client();
    $client->setApplicationName('Google Calendar API PHP Quickstart');
    $client->setScopes(Google_Service_Calendar::CALENDAR_READONLY);
    $client->setAuthConfig($credentials_file);
    $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());
              print "Fehler bei Google Test Cloud - token.json loeschen, quickstart.php in CLI starten und Authorisierung durchfuehren!!\n\n";          
        } else {
            // Request authorization from the user.
              print "Fehler Access Token - quickstart.php in CLI starten und Authorisierung durchfuehren!!\n\n";          
            $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;
}


/*
die Verifizierung ist erfolgt, das notwendige Token (token.json) ist vorhanden
jetzt können wir die Events aus dem Google Calendar lesen und in den Event-Kalender schreiben
*/

/* Name Administrator oder ein anderer vorhandener Nutzer */
$eventkalender_name = "RaHa";
print "eventkalender_name: ".$eventkalender_name."\n";

/* $KATEGORIEN[$PRIORITAET[16]]= "GOOGLE" */
$eventkalender_prioritaet_default="16";
$eventkalender_kategorie="GOOGLE";

/* Gruppe Event-Kalender */
$eventkalender_gruppe=date("YmdHis").'0'.mt_rand(10, 99);

/* BBCodes Umwandlung */
$google_bbcodes = array("<b>", "</b>", "<i>", "</i>", "<s>", "</s>", "<q>", "</q>", "<u>", "</u>", "<ins>", "</ins>", "<del>", "</del>", "<mark>", "</mark>", "<code>", "</code>", "<samp>", "</samp>", "<add>", "</add>", "<quote>", "</quote>", "<p>", "</p>", "<div>", "</div>", "<img=>", "</img>", "<sub>", "</sub>", "<sup>", "</sup>", "<ol>", "</ol>", "<li>", "</li>", "<ul>", "</ul>"); 

$event_kalender_bbcodes = array("[b]", "[/b]", "[i]", "[/i]", "[s]", "[/s]", "[q]", "[/q]", "[u]", "[/u]", "[ins]", "[/ins]", "[del]", "[/del]", "[mark]", "[/mark]", "[code]", "[/code]", "[samp]", "[/samp]", "[add]", "[/add]", "[quote]", "[/quote]", "[p]", "[/p]", "[div]", "[/div]", "[img=]", "[/img]", "[sub]", "[/sub]", "[sup]", "[/sup]", "[olist]", "[/olist]", "[li]", "[/li]", "[list]", "[/list]"); 

/*
In diesem Beispiel Script gehen wir so vor, dass alle Datensätze mit der Kategorie GOOGLE und entsprechend dem like %$timeselect% in Gruppe aus dem Event-Kalender gelöscht werden.
Dann werden aus dem Google Calendar alle Events von $timeselect ($timemin, $timemax) gelesen und neu in den Event-Kalender eintragen.
*/

/* kommt timeselect über Aufruf dann prüfen und Parameter setzen, sonst Vorgaben nehmen */ 
if (isset($argv[1])) {
     print "argv: ".$argv[1]."\n";
     $timeselect=$argv[1];
     /* gültig sind YYYY oder YYYY-MM, sonst aktuelles YYYY vorgeben */
     if (!preg_match("/(^[0-9]{4}$)|(^[0-9]{4}-[0-9]{2}$)/", $timeselect)) { $timeselect=date("Y"); }
     print "timeselect: ".$timeselect."\n";
} else {
     // aktuelles Jahr
     $timeselect=date("Y");
     // aktueller Monat
     // $timeselect=date("Y-m");
}

if (strlen($timeselect)==4){
     // anlegen der notwendigen Zeitvariablen - Abfrage Jahr
     $timemin=$timeselect.'-01-01T00:00:00+00:00';
     $timemax=$timeselect.'-12-31T23:59:59+00:00';
     $eventkalender_gruppe=$timeselect.date("mdHis").'0'.mt_rand(10, 99);
} else {
     // anlegen der notwendigen Zeitvariablen - Abfrage Monat
     $year=substr($timeselect,0,4);
     $month=substr($timeselect,-2);
     $day=date("t",mktime(0,0,0,$month,1,$year));
     $timemin=$year.'-'.$month.'-01T00:00:00+00:00';
     $timemax=$year.'-'.$month.'-'.$day.'T23:59:59+00:00';
     $eventkalender_gruppe=$year.$month.date("dHis").'0'.mt_rand(10, 99);
     print "year: ".$year."\n";
     print "month: ".$month."\n";
     print "day: ".$day."\n";
}

print "timemin: ".$timemin."\n";
print "timemax: ".$timemax."\n";
print "timeselect: ".$timeselect."\n";
print "eventkalender_gruppe: ".$eventkalender_gruppe."\n";

/* Verbindungsdaten zur Datenbank - Wert an eigene Umgebung anpassen */
require_once("/var/www/vhosts/domain/domain.tld/dbinfo.inc.php");

/* Datensätze mit kategorie = $eventkalender_kategorie und gruppe = like %$timeselect% löschen */
$sql = "DELETE from ".$TABLE_PREFIX."_kalender where kategorie = '".$eventkalender_kategorie."' and `gruppe` like '%".str_replace("-", "", $timeselect)."%'";
try { $db->exec($sql); } catch(PDOException $e) { echo "Ungültige Datenbankabfrage! - Fehler: " . $e->getMessage()."\n"; exit; }
print "SQL: ".$sql."\n\n";

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

/* Events vom Kalender mit der $calendarId holen */
$calendarId = 'YOUR CALENDAR ID';
$optParams = array(
  'maxResults' => 10000,
  'orderBy' => 'startTime',
  'singleEvents' => true,
  'timeMin' => $timemin,
  'timeMax' => $timemax,
);
$events = $service->events->listEvents($calendarId, $optParams);

if (empty($events)) {
    print "Keine Events gefunden.\n";
} else {
    print "Gefundene Events:\n";
     while(true){
         foreach ($events->getItems() as $event) {
               // print_r($event);
               /* Zuordnung GOOGLE CALENDAR EVENT Feld zu Event-Kalender Feld */ 
               $eventkalender_start = $event->start->dateTime;
               if (empty($eventkalender_start)) {
                    /* dann Ganzertag */
                    $eventkalender_start = $event->start->date;
                    $eventkalender_start .= " 00:00:01";
                    $eventkalender_volltag=1;  
               } else {
                    $eventkalender_start = str_replace("T", " ", $eventkalender_start);
                    $eventkalender_start = substr($eventkalender_start, 0 , strpos($eventkalender_start, "+"));
                    $eventkalender_volltag=0;  
               }
               print "start: ".$eventkalender_start."\n";

               $eventkalender_ende = $event->end->dateTime;
               if (empty($eventkalender_ende)) {
                    /* dann Ganzertag */
                    $eventkalender_ende = $event->start->date;
                    $eventkalender_ende .= " 00:00:00";
                    $eventkalender_volltag=1;  
               } else {
                    $eventkalender_ende = str_replace("T", " ", $eventkalender_ende);
                    $eventkalender_ende = substr($eventkalender_ende, 0 , strpos($eventkalender_ende, "+"));
                    $eventkalender_volltag=0;  
               }
               print "ende: ".$eventkalender_ende."\n";
     
               print "volltag: ".$eventkalender_volltag."\n";

               $eventkalender_event = $event->summary;     
               $eventkalender_event = str_replace("'", "´", $eventkalender_event);
               print "event: ".$eventkalender_event."\n";     

               $eventkalender_beschreibung = $event->description;     
               $eventkalender_beschreibung = str_replace("<br>",chr(10), $eventkalender_beschreibung);
               $eventkalender_beschreibung = str_replace("'", "´", $eventkalender_beschreibung);
               while (strpos($eventkalender_beschreibung, "<a href=") > -1 ) {
                    $pos = strpos($eventkalender_beschreibung, "<a href=");
                    $apos = strpos($eventkalender_beschreibung, ">", $pos);
                    $epos = strpos($eventkalender_beschreibung, "</a>", $apos);
                    $sub = $eventkalender_beschreibung;
                    $eventkalender_beschreibung = substr($sub, 0, $pos).substr($sub, $pos+9, ($apos-1)-($pos+9)).' ['.substr($sub, $apos+1, $epos-($apos+1)).'] '.substr($sub, $epos+4);                         
               }

               $eventkalender_beschreibung = str_replace($google_bbcodes, $event_kalender_bbcodes, $eventkalender_beschreibung);
               $eventkalender_beschreibung = str_replace("&nbsp;", " ",  $eventkalender_beschreibung);

               if (isset($event["attendees"]["0"]["email"])) { $attendees  = $event["attendees"]["0"]["email"]; } else { $attendees  =""; }
               if(!empty($attendees)) {
                    $eventkalender_beschreibung .= '\n\nGäste eingeladen: '.$attendees;
                    for ($i = 1; ; $i++) {
                         if (empty($event["attendees"][$i]["email"])) { break; }
                         $eventkalender_beschreibung .= ', '. $event["attendees"][$i]["email"];
                    }
                    $eventkalender_beschreibung .= '\n';
               }

               if (isset($event["attachments"]["0"]["fileUrl"])) { $attachments = $event["attachments"]["0"]["fileUrl"]; } else { $attachments=""; }
               if(!empty($attachments)) {
                    $eventkalender_beschreibung .= '\n\nAnhang: \n'.$attachments.'\n';
                    for ($i = 1; ; $i++) {
                         if (empty($event["attachments"][$i]["fileUrl"])) { break; }
                         $eventkalender_beschreibung .= $event["attachments"][$i]["fileUrl"].'\n';
                    }
                    $eventkalender_beschreibung .= '\n';
               }

               print "beschreibung: ".$eventkalender_beschreibung."\n";     

               $eventkalender_adresse = $event->location;     
               $eventkalender_adresse = str_replace("'", "´", $eventkalender_adresse);
               print "adresse: ".$eventkalender_adresse."\n";     

               if (isset($event["colorId"])) { $google_isfarbe = strval($event["colorId"]); } else { $google_isfarbe =""; }
               print "google_isfarbe: ".$google_isfarbe."\n";

               $eventkalender_prioritaet = $eventkalender_prioritaet_default; 
               if(!empty($google_isfarbe)) {

/* Farbumwandlung */
/* Google */
/* TOMATE = 11 | FLAMINGO = 4 | MANDARINE = 6 | BANANE = 5 | SALBEI = 2 | BASILIKUM = 10 | PFAU = 7 | HEIDELBEERE = 9 | LAVENDEL =  | WEINTRAUBE = 3 | GRAFIT = 8 */
/* Event-Kalener */
/* 0 = "Transparent | 1 = Rot| 2 = Gold | 3 = Grün | 4 = Blau | 5 = Orange | 6 = Violet | 7 = Himmelblau | 8 = Rosa | 9 = Cyan | 10 = Braun | 11 = Grau | 12 = Stahlblau */
/* 13 = Seegrün | 14 = Salomon | 15 = Violetrot | 16 = Purple | 17 = Khaki | 18 = Waldgrün | 19 = Türkis | 20 = Blaugrau | 21 = Terracotta | 22 = Mittelblau | 23 = Olive */
/* 24 = Blassgold | 25 = Blassviolet | 26 = Lichtblau | 27 = Schulferien */

                    /* $eventkalender_prioritaet=str_replace(array, array, $google_isfarbe) funktioniert hier nicht, deshalb die while-Schleife */ 
                    while(true) {
                         if ($google_isfarbe == "11") { $eventkalender_prioritaet = "1"; break; }
                         if ($google_isfarbe == "4") { $eventkalender_prioritaet = "21"; break; } 
                         if ($google_isfarbe == "6") { $eventkalender_prioritaet = "5"; break; }
                         if ($google_isfarbe == "5") { $eventkalender_prioritaet = "2"; break; }
                         if ($google_isfarbe == "2") { $eventkalender_prioritaet = "3"; break; }
                         if ($google_isfarbe == "10") { $eventkalender_prioritaet = "18"; break; }
                         if ($google_isfarbe == "7") { $eventkalender_prioritaet = "4"; break; }
                         if ($google_isfarbe == "9") { $eventkalender_prioritaet = "22"; break; }
                         if ($google_isfarbe == "3") { $eventkalender_prioritaet = "6"; break; }
                         if ($google_isfarbe == "8") { $eventkalender_prioritaet = "11"; break; }
                         break; 
                    }
               }

               print "prioritaet: ".$eventkalender_prioritaet."\n";     
               print "kategorie: ".$eventkalender_kategorie."\n";     
               print "gruppe: ".$eventkalender_gruppe."\n";     


               /* Werte in Event-Kalender schreiben */
               $sql = "INSERT INTO ".$TABLE_PREFIX."_kalender ( start, ende, volltag, name, event, beschreibung, adresse, prioritaet, kategorie, gruppe) VALUES ('".$eventkalender_start."', '".$eventkalender_ende."', '".$eventkalender_volltag."', '".$eventkalender_name."', '".$eventkalender_event."', '".$eventkalender_beschreibung."', '".$eventkalender_adresse."', '".$eventkalender_prioritaet."', '".$eventkalender_kategorie."', '".$eventkalender_gruppe."');";

               print "SQL: ".$sql."\n";
               try { $db->exec($sql); } catch(PDOException $e) { echo "Ungültige Datenbankabfrage! - Fehler: " . $e->getMessage()."\n"; exit;}
          } // end for

            $pageToken = $events->getNextPageToken();
            if ($pageToken) {
               $optParams = array('pageToken' => $pageToken);
               $events = $service->events->listEvents($calendarId, $optParams);
            } else { break; }

     } //end while
} // end if
?>


quickstart.sh – Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


# quickstart crontab start
cd /var/www/vhosts/domain/domain.tld/google_calendar_get_events
php quickstart.php


quickstart_sh.php – Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


<?PHP

/* Wert an eignene Umgebung anpassen */
echo '<br><br><br><a href="https://domain.tld/" target="_self" alt="" title=""><button class="button button1">Zurück zum Event-Kalender</button></a>';
echo '<h1>GOOGLE CALENDAR GET EVENTS</h1>';

$flag = 0;
unset($output);
$command='/bin/sh quickstart.sh';
exec($command,$output,$flag);

echo '<pre>';
print_r($output);
echo '</pre>';

/* Wert an eignene Umgebung anpassen */
echo '<br><br><br><a href="https://domain.tld/" target="_self" alt="" title=""><button class="button button1">Zurück zum Event-Kalender</button></a>';
?>


in index.php/demo.php einfügen/ersetzen – Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen



    <link rel="stylesheet" href="kalenderstyle.css">

    <script>
    function getgooglecalender(){
        window.location.href = "https://domain.tld/google_calendar_get_events/quickstart_sh.php";
    }
    </script>
    <script type="text/javascript" src="kalenderscript.js"></script>
    </head>
    <body>
    <button type="button" onclick="getgooglecalender();">GOOGLE CALENDAR GET EVENTS</button>
    <div id="kalender"></div>



dbinfo.inc.php – Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


<?php

// Keine Ausführung via URL
if (strpos($_SERVER["SCRIPT_FILENAME"], "dbinfo.inc") > 0 ) { echo "NO"; exit; }

// Verbindungsdaten zur Datenbank
$DB_HOST = "localhost:3306"; // Host-Adresse
$DB_NAME = "event-kalender_"; // Datenbankname
$DB_BENUTZER = "checkip"; // Benutzername
$DB_PASSWORT = "😀😀😀😀😀😀😀😀😀😀"; // Passwort

$TABLE_PREFIX = "mai20"; // mai20 - Letzte Änderung an der DB-Tabelle: Mai 2020

// Attribute für das Datenbankhandle festlegen (UTF-8 (utf8mb4) setzen)
$OPTION = [
 PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode='TRADITIONAL'",
 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci",
// PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];

// Verbindung zur Datenbank aufbauen
try {
 $db = new PDO("mysql:host=" . $DB_HOST . ";dbname=" . $DB_NAME, $DB_BENUTZER, $DB_PASSWORT, $OPTION);
}
// Bei einer fehlerhaften Verbindung
catch (PDOException $e) {

 if ($FEHLER_VERBINDUNG  == "ja") {

  echo '<h3>Event-Kalender</h3>' .
   '<p>Die Verbindung zur Datenbank ist fehlgeschlagen!';
  $fehler = ["2002" => 'Die Host-Adresse ist',
                 "1049" => 'Der Datenbankname ist',
                 "1045" => 'Der Benutzername oder das Passwort sind'];
  $code = $e->getCode();

  if (in_array($code, array_keys($fehler))) {
   echo '<br>' . $fehler[$code] . ' unbekannt!</p>';
  }
 }
 exit;
}

?>