Ankündigung

Einklappen
Keine Ankündigung bisher.

Google Calendar - update für "neue" GoogleAPI

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #91
    Hallo Dieter,

    bei Punkt 5 hatte ich die Auswahl-Möglichkeit neben "Webanwendung" und "Dienstkonto" auch die von Carsten beschriebene Auswahl "Installierte Anwendung", also genau so wie von Carsten beschrieben. Vielleicht kannst du nochmals prüfen, ob du an der richtigen Stelle warst.

    Der Google-Standard-Kalender entspricht auch bei mir meiner Google-Mail-Adresse. Einfach diese in die URL eintragen. Solltest du weitere Kalender angelegt haben, so bekommen diese zufällig generierte Kalender-IDs, in der Form calendarid@group.calendar.google.com.

    @henfri: wegen mir kann die Erweiterung gerne ins Repository übernommen werden, falls die Entwickler daran interessiert sind.


    Gruß
    Thorsten

    Kommentar


      #92
      Hallo Thorsten

      In der Beilage die Ansicht zu den Esintellungsmöglichkeiten, welche ich erhalte. Die Option "Installierte Anwendung" fehlt dort..
      Angehängte Dateien

      Kommentar


        #93
        Hallo,

        vielen Dank, ich hab das jetzt hier auch soweit am laufen.
        Das einzige, was nicht funktioniert:
        addressbook#contacts@group.v.calendar.google.com

        Das sind die Geburtstage. Funktioniert das bei euch?

        @thorsten: Sonstige funktioniert bei mir.

        Gruß,
        Hendrik

        Kommentar


          #94
          Zitat von henfri Beitrag anzeigen
          ...
          Das einzige, was nicht funktioniert:
          addressbook #contacts@group.v.calendar.google.com
          Das Problem war die Raute "#" in der Kalender-ID. Diese musste escaped werden. Unten angefügt eine aktualisierte Version in der das Problem behoben sein sollte.

          @Dieter: Bei mir sah das auf jeden Fall anders aus. Leider kenne ich mich mit der Authentifizierung und den Google-Projekten nicht wirklich aus. Vielleicht hat Carsten noch eine Idee.

          PHP-Code:
          <?php
          /**
           * -----------------------------------------------------------------------------
           * @package     smartVISU
           * @author      Martin Gleiß (basic version), Carsten Gotschlich (google API V3), Thorsten Moll (cache, multiple calendars)
           * @copyright   2012
           * @license     GPL [http://www.gnu.de]
           * -----------------------------------------------------------------------------
           */

          // Note: for debugging purposes you can execute this script from commandline with    php -q <scriptname>

          require_once '../../../lib/includes.php';
          require_once 
          const_path_system.'calendar/calendar.php';
          require_once 
          const_path_system.'class_cache.php';

          /**
           * This class reads a google calenda
           */
          class calendar_google extends calendar
          {
              const 
          CLIENT_ID '';                    // put your clientID here - from Google website
              
          const CLIENT_SECRET '';        // put your client Secret here - from Google WebSitr
              
          const REFRESH_TOKEN '';     // Put your google refresh token here - from other PHP script

              
          var $calendar_ids = array();

              
          /**
               * initialization of some parameters
               */
              
          public function init($request)
              {
                  
          parent::init($request);
                  if (
          $this->url == '')
                      
          $this->url 'primary';
                  if (
          $this->count == 0)
                      
          $this->count 10;

                  
          $this->calendar_ids explode(',' $this->url);
              }


              public function 
          run()
              {
                  
          $cache = new class_cache('calendar_google.json');

                  
          // check for cached data
                  
          if ($cache->hit(3600)) {
                      
          $cache_content json_decode($cache->read(), ture);

                      if (
          $cache_content['accessTokenExpiry'] < time()) {
                          
          // if token is not valid anymore reload everything cached
                          
          unset($cache_content);
                      }
                  }

                  if (!isset(
          $cache_content['accessToken'])) {
                      
          $token_url 'https://accounts.google.com/o/oauth2/token';
                      
          $post_data = array(
                                      
          'client_secret' =>   self::CLIENT_SECRET,
                                      
          'grant_type'    =>   'refresh_token',
                                      
          'refresh_token' =>   self::REFRESH_TOKEN,
                                      
          'client_id'     =>   self::CLIENT_ID
                                      
          );
                      
          $ch curl_init();

                      
          curl_setopt($chCURLOPT_URL$token_url);
                      
          curl_setopt($chCURLOPT_POST1);
                      
          curl_setopt($chCURLOPT_POSTFIELDS$post_data);
                      
          curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

                      
          $result curl_exec($ch);
                      
          $token_object json_decode($result);

                      
          $cache_content['accessToken'] = $token_object->{'access_token'};
                      
          $cache_content['accessTokenExpiry'] = time() + $token_object->{'expires_in'} - 60;
                  }

                  
          //---------------------------------------------------------------------
                  // so now we have an access-token, let's use it to access the calendar
                  
          $context stream_context_create(array('http' => array('method' => "GET"'header' => "Authorization: OAuth " $cache_content['accessToken'])));
                  
                  
          // first let's retrieve the colors and cache them
                  
          if (!isset($cache_content['calendarColors'])) {
                      
          $resturl 'https://www.googleapis.com/calendar/v3/colors';
                      
          $content = @file_get_contents($resturlfalse$context);
                      if (
          $content !== false)
                      {
                          
          $result json_decode($content,true);
                          
          $cache_content['calendarColors'] = $result["event"];
                          
          //var_dump($cache_content['calendarColors']);
                      
          }
                  }

                  
          // then retrieve the users calendars available and cache them, too
                  // do only if more than one calendar specified
                  
          if (count($this->calendar_ids) > && !isset($cache_content['calendarList'])) {
                      
          $resturl 'https://www.googleapis.com/calendar/v3/users/me/calendarList';
                      
          $content = @file_get_contents($resturlfalse$context);
                      if (
          $content !== false) {
                          
          $result json_decode($content);
                          
          $calendarList = array();

                          foreach (
          $result->{'items'} as $entry) {
                              
          $cal = array();
                              
          $cal["description"]     = $entry->{'summary'};
                              
          $cal["backgroundColor"] = $entry->{'backgroundColor'};
                              
          $calendarList[$entry->{'id'}] = $cal;
                          }

                          
          $cache_content['calendarList'] = $calendarList;
                          
          //var_dump($cache_content['calendarList']);
                      
          }
                  }
                  
                  
          // retrieve the calendar entries from each calendar
                  
          $events = array();

                  foreach (
          $this->calendar_ids as $calendarid) {
                      
          $resturl 'https://www.googleapis.com/calendar/v3/calendars/'urlencode($calendarid) . '/events?maxResults='$this->count .'&q=-%22%40visu+no%22&singleEvents=true&orderBy=startTime&timeMin='.urlencode(date('c'));
                      
          $content = @file_get_contents($resturlfalse$context);
                      
          $this->debug($content);

                      
          // for debugging purposes only
                      // echo $content;
                      // echo "###########";

                      
          if ($content !== false)
                      {
                          
          $result json_decode($content,true);

                          foreach (
          $result["items"] as $entry)
                          {
                              
          $startstamp = (string)($entry["start"]["dateTime"]);
                              
          $endstamp = (string)($entry["end"]["dateTime"]);
                              if (
          $startstamp == '')
                                  
          $startstamp = (string)($entry["start"]["date"]);
                              if (
          $endstamp == '')
                                  
          $endstamp = (string)($entry["end"]["date"]);
                              
          $start strtotime($startstamp);
                              
          $end   strtotime($endstamp);

                              
          $color '';
                              if (((string)(
          $entry["colorId"]))!='') {
                                  
          $color=$cache_content['calendarColors'][(string)($entry["colorId"])]['background'];
                              }
                              else if (
          count($this->calendar_ids) > 1) {
                                  
          $color=$cache_content['calendarList'][$calendarid]['backgroundColor'];
                              }

                              
          $events[$start] = array(
                                  
          'start' => date('y-m-d'$start).' '.date('H:i:s'$start),
                                  
          'end' => date('y-m-d'$end).' '.date('H:i:s'$end),
                                  
          'title' => (string)($entry["summary"]),
                                  
          'content' => (string)($entry["description"]),
                                  
          'where' => (string)($entry["location"]),
                                  
          'color' => $color,
                                  
          'link' => (string)($entry["htmlLink"])
                              );
                          }
                      }
                      else
                      {
                          
          $this->error('Calendar: Google''Calendar '$calendarid .' read request failed!');
                      }
                  }

                  
          // finally re-order the events comming potentially from different calendars
                  
          $i 1;
                  
          ksort($events);
                  foreach(
          $events as $event) {
                      
          $event['pos'] = $i++;
                      
          $this->data[] = $event;
                      if (
          $i $this->count) break;
                  }

                  
          // at the end write back cache
                  
          $cache->writejson_encode($cache_content) );
              }
          }


          // -----------------------------------------------------------------------------
          // call the service
          // ----------------------------------------------------------------------------

          //

          $service = new calendar_google(array_merge($_GET$_POST));
          echo 
          $service->json();
          ?>
          Zuletzt geändert von CodeRed; 17.08.2015, 19:50.

          Kommentar


            #95
            Hallo Thorsten
            Es funktioniert nun alles bestens! php5-curl war auf dem Raspberry nicht installiert! Mein Screenshot in Post #92 war somit aktuell, es muss dort der Punkt "Sonstige" ausgewählt werden, es gibt keinen Punkt "Installierte Anwendung"; ggfs. in der Anleitung korrigieren.
            Was noch eine Option wäre, dass eine Serie bloss als ein einziger Eintrag angezeigt wird, da eine Serie sonst die ganze Anzeige zumauert.
            Danke für Deinen guten Support!
            Dieter

            Kommentar


              #96
              Hallo,

              danke für die neue Version
              leider funktioniert der Kalender (auch die vorherige) nicht mehr:
              Code:
              php -q googleV3.php
              [{"title":"Calendar: Google","text":"Calendar primary read request failed!"}]root@homeserver:/var/www/html/visu/lib/calendar/ser
              vice
              Hast du eine Idee?

              Gruß,
              Hendrik

              Kommentar


                #97
                Hallo zusammen,
                in dem Post oben ist noch ein Fehler:
                PHP-Code:
                $cache_content json_decode($cache->read(), ture); 
                müsste sein:
                PHP-Code:
                $cache_content json_decode($cache->read(), true); 
                Gruß
                Alex

                Kommentar


                  #98
                  Hallo Alex,

                  leider hat das noch nicht geholfen:

                  Code:
                  /var/www/html/visu/lib/calendar/service# php -q googleV3.php
                  [{"title":"Calendar: Google","text":"Calendar primary read request failed!"}]

                  Kann man dem Skript noch Details herauslocken (Warum failed?)?

                  Habe es gerade noch einmal mit der älteren Version geprüft um Autentifizierungsprobleme auszuschließen. Damit funktioniert es weiterhin.

                  Gruß,
                  Hendrik
                  Zuletzt geändert von henfri; 22.08.2015, 10:08.

                  Kommentar


                    #99
                    Funktioniert doch. Ich bin nicht sicher, was faul war.


                    Danke!

                    Kommentar


                      Hallo zusammen,

                      ich schaffs nicht mir dieses Refresh-Token zu generieren... beim 2ten Script bekommen ich immer folgenden Fehler:
                      Code:
                      "error" : "invalid_grant"
                      }PHP Notice:  Undefined property: stdClass::$refresh_token in /tmp/google_2.php on line 20
                      Habe dort wie im Thread erwähnt schon das echo $result eingefügt

                      Vielleicht trage ich ja die falschen Sachen ein, daher 2 Fragen:
                      1. Muss bei der Client-ID das ".apps.googleusercontent.com" mit dran?
                      2. Wo finde ich die Redirect-URI? ich habs bisher mit "urn:ietf:wgauth:2.0ob" oder "http://localhost" probiert...

                      Vielleicht könnte ja jemand mal ein funktionierendes Beispiel(mit gefakten Daten) posten wie die beiden Scripte befüllt werden müssen....

                      Danke schonmal...
                      cu Yfkt5A
                      DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
                      microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

                      Kommentar


                        Hallo Zusammen,

                        ich habe ein Problem mit der Darstellung des Googlekalenders in meiner Visu.
                        Ich bekomme die Termine nur angezeigt, wenn ich zuvor mittels Putty ins passende Verzeichnis wechsle und die Datei mit folgendem Befehl ausführe:

                        php -q googleV3.php dann zeigt es mir die Termine für eine gewisse Zeit an und verschwinden wieder, anschliessend muss ich wieder die Datei googleV3.php ausführen.
                        @ nEiMi

                        zu 1. ja muss mit dran

                        zu 2. da hab ich auch die erste Zeile genommen

                        habe auch mehrer Versuche gebraucht bis die Scripte alle funktionierten

                        Gruß


                        Kommentar


                          Hallo zusammen,

                          ich verzweifel auch langsam hier....

                          Die Tokens und Skripte sind alle generiert und konfiguriert, ich bekomme aber keinen Kalender im Smartvisu angezeigt.

                          Wenn ich mein Skript an der Konsole ausführe, bekomme ich lauter "php NOTICE Undefined index" und am Ende dann aber auch Daten aus meinem Kalender - d.h. die ganze Authentifizierung funktioniert, und irgendwo stimmt in meinen Skripten was nicht.

                          Update: Wenn ich das googleV3.php Browser aufrufe, bekomme ich direkt die Kalenderdaten in folgendem Format dargestellt, d.h. die Googleabfrage funktioniert!?

                          [{"pos":1,"start":"15-10-07 06:00:00","end":"15-10-07 06:15:00","title":"Tho: Auto Neuk\u00f6lln","content":"","where":"","link":"htt ps:\/\/www.google.com\/calendar\/event?eid=NWxuYT..............

                          Das sieht auf den ersten Blick richtig aus, oder?

                          Jetzt muss ich nur noch auflösen, warum die Darstellung nicht funktioniert - hat vielleicht jemand nen Tip bzgl typischer Fehlerquellen?

                          Danke und viele Grüße

                          Thorschtn

                          // Update: Augenscheinlich war ich zu ungeduldig. Die obige Ausgabe des googleV3.php ist korrekt. Ich weiss nicht, warum Smartvisu anfangs den Kalender nicht dargestellt hat (Caching war ausgestellt, RPI und Browser hatte ich auch bereits neu gestartet) - aber einen halben Tag später gings auf einmal, ohne, dass ich noch etwas dran ändern musste....
                          Zuletzt geändert von thorschtn; 08.10.2015, 07:49.

                          Kommentar


                            Hallo Zusammen,

                            konnte mich soweit durchhangel und scheitere nun aber bei googleV3.php.
                            Auf der Page gibt's den Fehler: "Calendar mailadresse@gmail.com read request failed!"
                            die CalenderID ist nur die reine mailadresse?!


                            Auf der Console gibt es mir diesen Code aus:
                            Code:
                            admin@smarthome:/usr/smarthome$ php -q /var/www/smartvisu/lib/calendar/service/googleV3.php
                             PHP Warning:  require_once(../../../lib/includes.php): failed to open stream: No such file or directory in /var/www/smartvisu/lib/calendar/service/googleV3.php on line 13
                            PHP Fatal error:  require_once(): Failed opening required '../../../lib/includes.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/smartvisu/lib/calendar/service/googleV3.php on line 13
                            Zeile 13 im Script:
                            Code:
                            require_once '../../../lib/includes.php';
                            Wäre für eine Hilfe dankbar.

                            Danke und Grüße.
                            Lio

                            Kommentar


                              Ich hab das @ encoded alias: "%40googlemail.com"

                              Bei Dir kommt aber ein klarer PHP Fehler raus. Das müsste man tiefer anschauen.

                              Liegen die Filers korrekt unter lib/calendar/service? Und liegt die includes.php da wo sie soll, also unter lib? Er geht ja 3 Directories rauf und dann wieder unter lib.. Ansonsten ggf. PHP Konfigurationssache?! Oder mal absolut includen.
                              Zuletzt geändert von psilo; 18.10.2015, 13:04.

                              Kommentar


                                dake psilo,

                                evtl bin ich einen Schritt weiter, nun folgt diese Nachricht:
                                Code:
                                /var/www/smartvisu/lib/calendar/service$ php -q googleV3.php
                                PHP Warning:  Cannot modify header information - headers already sent by (output started at /var/www/smartvisu/lib/calendar/service/googleV3.php:1) in /var/www/smartvisu/lib/service.php on line 95  [{"title":"Calendar: Google","text":"Calendar primary read request failed!"}]
                                Wo machst Du das:
                                Zitat von psilo Beitrag anzeigen
                                Ich hab das @ encoded alias: "%40googlemail.com"
                                Auf der Config-Page? -Das bewirkt (noch) nichts.

                                danke und Gruß,
                                Lio

                                Kommentar

                                Lädt...
                                X