Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Script: Google Shared Locations Cookie Fixer

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    799

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.0k

Script: Google Shared Locations Cookie Fixer

Geplant Angeheftet Gesperrt Verschoben JavaScript
21 Beiträge 4 Kommentatoren 150 Aufrufe 9 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • B bommel_030

    @David-G.
    Ja, sorry, klar, pupeteer ist als Modul eingetragen

    David G.D Online
    David G.D Online
    David G.
    schrieb am zuletzt editiert von David G.
    #8

    @bommel_030

    Musste da auch mal die Ki fragen, hat mir aicu beim Script geholfen.
    Diese meint:

    Das ist ein klassisches Problem bei der Nutzung von Puppeteer in einer Linux-Umgebung (wie Debian oder Ubuntu, worauf die meisten ioBroker-Installationen basieren). Der Fehler Code: 127 bedeutet, dass der Chrome-Browser zwar installiert ist, ihm aber wichtige System-Bibliotheken fehlen, um zu starten.
    ​In diesem Fall fehlt konkret libnspr4.so, aber meistens fehlen noch ein paar andere Pakete.
    ....
    ....
    ....
    ....

    sudo apt install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2
    
    

    Evtl hat das bei mir der puppeteer Adapter mit installiert?

    Edit
    Bei mir laufen die genannten Pakete teilweise:

    Last login: Fri Dec 26 22:30:42 2025 from 192.168.99.143
    david@iobroker:~# for pkg in libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxrandr2 libgbm1 libasound2 libpango-1.0-0 libcairo2; do
    >   dpkg -s $pkg >/dev/null 2>&1 && echo "$pkg: installed" || echo "$pkg: MISSING";
    > done
    libnss3: installed
    libnspr4: installed
    libatk1.0-0: MISSING
    libatk-bridge2.0-0: MISSING
    libcups2: MISSING
    libdrm2: installed
    libxkbcommon0: installed
    libxcomposite1: installed
    libxdamage1: installed
    libxext6: installed
    libxfixes3: installed
    libxrandr2: installed
    libgbm1: installed
    libasound2: MISSING
    libpango-1.0-0: installed
    libcairo2: installed
    root@iobroker:~#
    

    Edit 2
    Evfl. mal das libnspr4 nachinstallieren.
    Das vermisst die log Meldung ja.

    Wäre lieb wenn du oder @xbit das mal testen würdet.

    Zeigt eure Lovelace-Visualisierung klick
    (Auch ideal um sich Anregungen zu holen)

    Meine Tabellen für eure Visualisierung klick

    1 Antwort Letzte Antwort
    0
    • B Nicht stören
      B Nicht stören
      bommel_030
      schrieb am zuletzt editiert von
      #9

      @david-g.
      So, ja, libnspr4 hatte ich natürlich auch schon installiert. Die danach angemahnten auch. Bis zur libatk-bridge. Die wollte wohl nicht.
      Jetzt nochmal alles drüber und es kommt zumindest keine Fehlermeldung mehr. Mal schauen ob er den Keks später erneuert.

      David G.D 1 Antwort Letzte Antwort
      0
      • B bommel_030

        @david-g.
        So, ja, libnspr4 hatte ich natürlich auch schon installiert. Die danach angemahnten auch. Bis zur libatk-bridge. Die wollte wohl nicht.
        Jetzt nochmal alles drüber und es kommt zumindest keine Fehlermeldung mehr. Mal schauen ob er den Keks später erneuert.

        David G.D Online
        David G.D Online
        David G.
        schrieb am zuletzt editiert von David G.
        #10

        @bommel_030

        Interessant. Keine Ahnung, warum das bei mir alles drauf war.....
        Frage mal im Thread vom puppeteer Adapter ob der das macht. Dann empfehle ich, den mit zu installieren.
        https://forum.iobroker.net/topic/54944/puppeteer-screenshots-phantomjs-alternative/246?_=1768766081588

        Zeigt eure Lovelace-Visualisierung klick
        (Auch ideal um sich Anregungen zu holen)

        Meine Tabellen für eure Visualisierung klick

        B 1 Antwort Letzte Antwort
        0
        • David G.D David G.

          @bommel_030

          Interessant. Keine Ahnung, warum das bei mir alles drauf war.....
          Frage mal im Thread vom puppeteer Adapter ob der das macht. Dann empfehle ich, den mit zu installieren.
          https://forum.iobroker.net/topic/54944/puppeteer-screenshots-phantomjs-alternative/246?_=1768766081588

          B Nicht stören
          B Nicht stören
          bommel_030
          schrieb am zuletzt editiert von
          #11

          @David-G.
          Den puppeteer Adapter hatte ich gar nicht auf dem Schirm. Hab den einfach über die Konsole installiert.
          Ich lass das Skript mal über Nacht laufen und geb dann Feedback.

          David G.D 1 Antwort Letzte Antwort
          0
          • B bommel_030

            @David-G.
            Den puppeteer Adapter hatte ich gar nicht auf dem Schirm. Hab den einfach über die Konsole installiert.
            Ich lass das Skript mal über Nacht laufen und geb dann Feedback.

            David G.D Online
            David G.D Online
            David G.
            schrieb am zuletzt editiert von
            #12

            @bommel_030

            Kannst es auch einfach über einen der beiden DPs ausführen die es angelegt hat (oder Script nochmal neustarten). Einer der nur den Coockie im Script aktualisiert und einer der ihn noch an shared locations sendet.

            Zeigt eure Lovelace-Visualisierung klick
            (Auch ideal um sich Anregungen zu holen)

            Meine Tabellen für eure Visualisierung klick

            1 Antwort Letzte Antwort
            0
            • David G.D Online
              David G.D Online
              David G.
              schrieb am zuletzt editiert von David G.
              #13

              @bommel_030 @xbit
              Ich habe die Fehler nicht, da ich den puppeteer Adapter installiert hatte. Dieser hat bei mir die Abhängigkeiten installiert.
              Hab es im Startpost unter troubleshooting ergänzt.

              Zeigt eure Lovelace-Visualisierung klick
              (Auch ideal um sich Anregungen zu holen)

              Meine Tabellen für eure Visualisierung klick

              1 Antwort Letzte Antwort
              0
              • B Nicht stören
                B Nicht stören
                bommel_030
                schrieb zuletzt editiert von bommel_030
                #14

                @david-g.
                OK, ich installier mal den puppeteer Adapter. Der aktuelle Stand hat nicht funktioniert. Nach 2h war der Cookie abgelaufen und es konnte kein neuer geholt werden.

                Nachtrag...
                Habe den anderen Adapter noch nicht installiert, aber mir mal die Cookies angeschaut. Das was dein Skript holt und das was ich aus der Entwicklerkonsole auslese sieht am Anfang anders aus.

                Cookie aus deinem Skript:

                SOCS=CAISNQgEEitib3FfaWRlbnRpdHlmcm9udGVuZHVpc2VydmVyXzIwMjYwMTE0LjAyX3AwGgJkZSACGgYIgMWwywY; AEC=AaJma5v4ez0cnzj
                

                Cookie aus der Entwicklerkonsole:

                AEC=AaJma5sHbT0WNn1HOfWs
                

                Also der SOCS Teil ist in der Entwicklerkonsole von Chrome nicht drin. Könnte es daran liegen?

                1 Antwort Letzte Antwort
                0
                • David G.D Online
                  David G.D Online
                  David G.
                  schrieb zuletzt editiert von David G.
                  #15

                  Meine Cookies fingen bisher immer mit

                  __Secure-3PSIDCC=AKEyXzWvTk4OruIi7N3i3hCQqj11FuNYuiQnbHvVCNAvQ3wQR5wu_Uw
                  

                  an.

                  Der Adapter benötigt auch nur einen Speziellen Teil aus dem Cookie. Da hat Garfonso mal was geändert damit man blind alles aus dem Cookie eingeben kann und der Adapter das relevante raus holt.

                  Im Browser das Cookie kannst du ja nicht 1 zu 1 mit dem aus dem Skript vergleichen, die holen sich ja jeweils eigene.

                  Die Cookie die ich mir bisher geholt habe, haben auch mit SOCS an. Das Secure...kommt dann etwas später.

                  Bei mir wurde heute Nacht ein neuer Cookie erstellt, konnte Ihn eben auch erfolgreich erneuern. Habe eben im Skript aber auch nochmal eine Anpassung gemacht. Glaube aber nicht, dass es das ist.

                  Evtl. nochmal einen frischen Cookie in den DP vom Skript einfügen.

                  Zeigt eure Lovelace-Visualisierung klick
                  (Auch ideal um sich Anregungen zu holen)

                  Meine Tabellen für eure Visualisierung klick

                  1 Antwort Letzte Antwort
                  0
                  • B Nicht stören
                    B Nicht stören
                    bommel_030
                    schrieb zuletzt editiert von
                    #16

                    @david-g.
                    Ich habe jetzt den Google Adapter mit einem manuellen Cookie gestartet. Verbindungstest sagt, ist ok. Dann habe ich mit dem Trigger Refresh einen Cookie vom Skript holen lassen.
                    Wenn ich diesen Cookie dann von Hand in den Adapter kopiere sagt der Verbindungstest direkt fehlgeschlagen.
                    Das sollte doch klappen, oder?

                    David G.D 1 Antwort Letzte Antwort
                    0
                    • B bommel_030

                      @david-g.
                      Ich habe jetzt den Google Adapter mit einem manuellen Cookie gestartet. Verbindungstest sagt, ist ok. Dann habe ich mit dem Trigger Refresh einen Cookie vom Skript holen lassen.
                      Wenn ich diesen Cookie dann von Hand in den Adapter kopiere sagt der Verbindungstest direkt fehlgeschlagen.
                      Das sollte doch klappen, oder?

                      David G.D Online
                      David G.D Online
                      David G.
                      schrieb zuletzt editiert von David G.
                      #17

                      @bommel_030

                      Ja, sollte es.
                      Tut es zumindest bei mir.....

                      Habe heute morgen eine neue Version vom Script hochgeladen.

                      Gemini meint, dort würde das Coockie noch besser behandelt und gefoltert.
                      Ka ob das was bei dir macht.....

                      Edit
                      (Hab die verschiedenen Coockie Anfänge von dir und mir mal gegoogelt und gemini damit gefüttert.
                      Teste mal das (Kann ich gtad nicht, bin beim Zahnarzt..... 🤣) .

                      /**
                       * Script: Google Shared Locations Cookie Fixer
                       * Autor: @ipod86
                       * Version: v. 1.5 (COM-Domain Fix)
                       * Datum: 19.01.2026
                       * Forum: https://forum.iobroker.net/topic/83592/script-google-shared-locations-cookie-fixer
                       * * Historie:
                       * v. 1.4 - SOCS-Fix & Consent-Handling.
                       * v. 1.5 - Umstellung auf .com (zwingend erforderlich für Session-Übernahme).
                       */
                      
                      const puppeteer = require('puppeteer');
                      
                      const BASE_PATH = '0_userdata.0.google_sharedlocations_cookie_fixer';
                      const ADAPTER_INSTANCE = 'google-sharedlocations.0';
                      const ADAPTER_ALIVE_DP = `system.adapter.${ADAPTER_INSTANCE}.alive`;
                      const ADAPTER_COOKIE_DP = `${ADAPTER_INSTANCE}.info.augmented_cookie`;
                      const ADAPTER_CONN_DP = `${ADAPTER_INSTANCE}.info.connection`;
                      
                      async function initDPs() {
                          await createStateAsync(`${BASE_PATH}.Cookie`, '', {name: 'Aktueller Google Cookie', type: 'string', role: 'text'});
                          await createStateAsync(`${BASE_PATH}.LastUpdate`, '', {name: 'Letztes Update Zeitstempel', type: 'string', role: 'text'});
                          await createStateAsync(`${BASE_PATH}.TriggerRefresh`, false, {name: 'Manueller Refresh Trigger', type: 'boolean', role: 'button'});
                          await createStateAsync(`${BASE_PATH}.RestoreAdapter`, false, {name: 'Cookie zum Adapter kopieren & Neustart', type: 'boolean', role: 'button'});
                      }
                      
                      async function startRefresh() {
                          let state = await getStateAsync(`${BASE_PATH}.Cookie`);
                          let cookieToUse = state ? state.val : '';
                      
                          if (!cookieToUse || cookieToUse.length < 50) {
                              const adapterCookie = await getStateAsync(ADAPTER_COOKIE_DP);
                              cookieToUse = adapterCookie ? adapterCookie.val : '';
                          }
                      
                          if (!cookieToUse || cookieToUse.length < 50) {
                              console.warn(`[Cookie-Fixer] Abbruch: Kein gültiger Start-Cookie gefunden!`);
                              return;
                          }
                      
                          console.log('[Cookie-Fixer] Starte Refresh auf google.com...');
                          let browser;
                      
                          try {
                              browser = await puppeteer.launch({
                                  headless: true,
                                  args: [
                                      '--no-sandbox', 
                                      '--disable-setuid-sandbox', 
                                      '--disable-blink-features=AutomationControlled',
                                      '--lang=en-US' // Auf US gestellt, um .com Verhalten zu erzwingen
                                  ]
                              });
                      
                              const page = await browser.newPage();
                              await page.setViewport({ width: 1280, height: 800 });
                              await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
                      
                              // Cookies explizit für .com Domains setzen
                              const rawPairs = cookieToUse.split(';');
                              const domains = ['.google.com', 'google.com']; 
                              
                              for (let pair of rawPairs) {
                                  const parts = pair.trim().split('=');
                                  if (parts.length >= 2) {
                                      const name = parts[0].trim();
                                      const value = parts.slice(1).join('=').trim();
                                      for (let dom of domains) {
                                          try { 
                                              await page.setCookie({ 
                                                  name, 
                                                  value, 
                                                  domain: dom, 
                                                  path: '/', 
                                                  secure: true,
                                                  sameSite: 'Lax'
                                              }); 
                                          } catch (e) {}
                                      }
                                  }
                              }
                      
                              // Schritt 1: Hauptseite .com aufrufen
                              await page.goto('https://www.google.com', { waitUntil: 'networkidle2' });
                              
                              // Consent-Check (Englisch/International)
                              try {
                                  const buttons = await page.$$('button');
                                  for (let btn of buttons) {
                                      const text = await page.evaluate(el => el.innerText, btn);
                                      if (text.includes('Accept all') || text.includes('I agree') || text.includes('Alle akzeptieren')) {
                                          await btn.click();
                                          await new Promise(r => setTimeout(r, 2000));
                                          break;
                                      }
                                  }
                              } catch (e) {}
                      
                              // Schritt 2: Zwingend Maps .com aufrufen
                              await page.goto('https://maps.google.com', { waitUntil: 'networkidle2' });
                              await new Promise(r => setTimeout(r, 5000));
                      
                              const freshCookies = await page.cookies();
                              
                              // Extraktion: Wir nehmen alles von google.com
                              const freshCookieString = freshCookies
                                  .filter(c => c.domain.includes('google.com'))
                                  .map(c => `${c.name}=${c.value}`)
                                  .join('; ');
                      
                              // Validierung: Enthält der Cookie die Session-ID?
                              if (freshCookieString.length > 100 && (freshCookieString.includes('SID=') || freshCookieString.includes('Secure-3'))) {
                                  await setStateAsync(`${BASE_PATH}.Cookie`, freshCookieString, true);
                                  await setStateAsync(`${BASE_PATH}.LastUpdate`, new Date().toLocaleString(), true);
                                  console.log('[Cookie-Fixer] ERFOLG: Google.com Session-Cookie generiert.');
                                  
                                  const conn = await getStateAsync(ADAPTER_CONN_DP);
                                  if (conn && !conn.val) await restoreAdapter();
                              } else {
                                  console.error('[Cookie-Fixer] FEHLER: Session auf google.com konnte nicht übernommen werden (SID fehlt).');
                              }
                      
                          } catch (err) {
                              console.error('[Cookie-Fixer] Fehler: ' + err.message);
                          } finally {
                              if (browser) await browser.close();
                          }
                      }
                      
                      async function restoreAdapter() {
                          const scriptCookie = await getStateAsync(`${BASE_PATH}.Cookie`);
                          if (!scriptCookie || scriptCookie.val.length < 100) return;
                          
                          await extendObjectAsync(ADAPTER_COOKIE_DP, {common: {write: true}});
                          await setStateAsync(ADAPTER_COOKIE_DP, scriptCookie.val, false);
                          
                          await setStateAsync(ADAPTER_ALIVE_DP, false);
                          setTimeout(() => setState(ADAPTER_ALIVE_DP, true), 5000);
                      }
                      
                      async function main() {
                          await initDPs();
                          await startRefresh();
                          
                          on({id: `${BASE_PATH}.TriggerRefresh`, val: true, ack: false}, () => { 
                              startRefresh(); 
                              setState(`${BASE_PATH}.TriggerRefresh`, false, true); 
                          });
                          
                          on({id: `${BASE_PATH}.RestoreAdapter`, val: true, ack: false}, () => { 
                              restoreAdapter(); 
                              setState(`${BASE_PATH}.RestoreAdapter`, false, true); 
                          });
                          
                          on({id: ADAPTER_CONN_DP, val: false, ack: true}, async () => { 
                              if ((await getStateAsync(ADAPTER_ALIVE_DP)).val) await startRefresh(); 
                          });
                          
                          schedule("0 4 * * *", startRefresh);
                      }
                      main();
                      
                      

                      Zeigt eure Lovelace-Visualisierung klick
                      (Auch ideal um sich Anregungen zu holen)

                      Meine Tabellen für eure Visualisierung klick

                      1 Antwort Letzte Antwort
                      0
                      • XBiTX Offline
                        XBiTX Offline
                        XBiT
                        schrieb zuletzt editiert von
                        #18

                        @david-g.

                        Sorry bin zur Zeit nicht oft Online....

                        Kurze Info mit Version 1.5 vom Script.

                        Adapter puppeteer installiert -> Script geht ohne Fehlermeldung und holt Coockie
                        Adapter puppeteer gestoppt -> Script geht ohne Fehlermeldung und holt Coockie
                        Adapter puppeteer gelöscht -> Script geht ohne Fehlermeldung und holt Coockie

                        Also Adapter hinzufügen und wieder löschen sollte reichen -> ob es später mal Probleme gibt wegen Update etc. kann ich natürlich nicht sagen.

                        David G.D 1 Antwort Letzte Antwort
                        0
                        • XBiTX XBiT

                          @david-g.

                          Sorry bin zur Zeit nicht oft Online....

                          Kurze Info mit Version 1.5 vom Script.

                          Adapter puppeteer installiert -> Script geht ohne Fehlermeldung und holt Coockie
                          Adapter puppeteer gestoppt -> Script geht ohne Fehlermeldung und holt Coockie
                          Adapter puppeteer gelöscht -> Script geht ohne Fehlermeldung und holt Coockie

                          Also Adapter hinzufügen und wieder löschen sollte reichen -> ob es später mal Probleme gibt wegen Update etc. kann ich natürlich nicht sagen.

                          David G.D Online
                          David G.D Online
                          David G.
                          schrieb zuletzt editiert von
                          #19

                          @XBiT

                          Danke fürs testen.
                          Klappen bei dir die gegolten Coockies denn, wenn du sie direkt im Adapter eingibst und auf testen gehst? Bei @bommel_030 gibt's ja Probleme.

                          Zeigt eure Lovelace-Visualisierung klick
                          (Auch ideal um sich Anregungen zu holen)

                          Meine Tabellen für eure Visualisierung klick

                          B 1 Antwort Letzte Antwort
                          0
                          • David G.D David G.

                            @XBiT

                            Danke fürs testen.
                            Klappen bei dir die gegolten Coockies denn, wenn du sie direkt im Adapter eingibst und auf testen gehst? Bei @bommel_030 gibt's ja Probleme.

                            B Nicht stören
                            B Nicht stören
                            bommel_030
                            schrieb zuletzt editiert von bommel_030
                            #20

                            @David-G.
                            So, auch mal den puppeteer Adapter installiert. Und Skript v 1.5
                            Das Ergebnis ist leider gleich.
                            Das Skript ruft sauber einen neuen Cookie ab. Aber egal ob ich den manuell oder über Restore an den Adapter übergebe, die Verbindung bricht sofort ab.

                            Das hat übrigens den unschönen Nachteil, dass das Skript quasi in Endlosschleife den Adapter neustartet. Könntest du das irgendwie abfangen? So in der Art nach 5 Versuchen hör auf und schreib eine Warnung ins Log?!?

                            Weißt du welcher Teil des Cookies der interessante Teil ist? Die Cookies die ich auslese sind im Schnitt 300 Zeichen länger als die, die das Skript abruft...

                            Mal was anderes, wessen Adapter in welcher Version nutzt du? Ich nutze den hier:
                            https://github.com/Garfonso/ioBroker.google-sharedlocations
                            in der Version 2.2.1

                            Nachtrag. Was mit noch auffällt, der Cookie wird im Objektbaum
                            google-sharedlocations.0.info.augmented_cookie eingetragen,
                            aber in der Instanzeinstellung bleibt (auch nach refresh) der alte Cookie stehen.

                            David G.D 1 Antwort Letzte Antwort
                            0
                            • B bommel_030

                              @David-G.
                              So, auch mal den puppeteer Adapter installiert. Und Skript v 1.5
                              Das Ergebnis ist leider gleich.
                              Das Skript ruft sauber einen neuen Cookie ab. Aber egal ob ich den manuell oder über Restore an den Adapter übergebe, die Verbindung bricht sofort ab.

                              Das hat übrigens den unschönen Nachteil, dass das Skript quasi in Endlosschleife den Adapter neustartet. Könntest du das irgendwie abfangen? So in der Art nach 5 Versuchen hör auf und schreib eine Warnung ins Log?!?

                              Weißt du welcher Teil des Cookies der interessante Teil ist? Die Cookies die ich auslese sind im Schnitt 300 Zeichen länger als die, die das Skript abruft...

                              Mal was anderes, wessen Adapter in welcher Version nutzt du? Ich nutze den hier:
                              https://github.com/Garfonso/ioBroker.google-sharedlocations
                              in der Version 2.2.1

                              Nachtrag. Was mit noch auffällt, der Cookie wird im Objektbaum
                              google-sharedlocations.0.info.augmented_cookie eingetragen,
                              aber in der Instanzeinstellung bleibt (auch nach refresh) der alte Cookie stehen.

                              David G.D Online
                              David G.D Online
                              David G.
                              schrieb zuletzt editiert von David G.
                              #21

                              @bommel_030 sagte in Script: Google Shared Locations Cookie Fixer:

                              Das hat übrigens den unschönen Nachteil, dass das Skript quasi in Endlosschleife den Adapter neustartet. Könntest du das irgendwie abfangen? So in der Art nach 5 Versuchen hör auf und schreib eine Warnung ins Log?!?

                              Schaue mal, was ich da machen kann.

                              @bommel_030 sagte in Script: Google Shared Locations Cookie Fixer:

                              Weißt du welcher Teil des Cookies der interessante Teil ist? Die Cookies die ich auslese sind im Schnitt 300 Zeichen länger als die, die das Skript abruft...

                              Leider nicht wirklich....

                              @bommel_030 sagte in Script: Google Shared Locations Cookie Fixer:

                              Mal was anderes, wessen Adapter in welcher Version nutzt du? Ich nutze den hier:
                              https://github.com/Garfonso/ioBroker.google-sharedlocations
                              in der Version 2.2.1

                              Den nutze ich auch

                              @bommel_030 sagte in Script: Google Shared Locations Cookie Fixer:

                              Nachtrag. Was mit noch auffällt, der Cookie wird im Objektbaum
                              google-sharedlocations.0.info.augmented_cookie eingetragen,
                              aber in der Instanzeinstellung bleibt (auch nach refresh) der alte Cookie stehen.

                              Das habe ich auch schon gesehen. Der Adapter muss den Coockie wohl doppelt speichern. Wenn ich im Adapter Abc beim Coockie eingebe, startet er gelb und wird vom Script gefixt. Im Adapter steht dann aber noch immer Abc. Der DP ist eigentlich auch schreibgeschützt. Das Script hebt das beim Schreiben kurz auf. Ich vermute die Gui speichert den Coockie in dem DP schaut aber nicht was da steht, da sie dort normal selber den Wert setzt.

                              Keine Ahnung, was as bei dir ist. Mal sehen ob andere user das selbe melden oder es da klappt. Das Script ist das Ergebnis von einem sehr langen Gespräch mit gemini. Verstehe da auch nicht alles.....

                              EDIT
                              Hier zumindest mal eine loop protection für deinen Fall.
                              Er probiert es 3 mal. Dann verweigert er für 30min den repair bis man es selber triggert oder er es nachts im 4 selber nochmal probiert.

                              /**
                               * Script: Google Shared Locations Cookie Fixer
                               * Autor: David G. 
                               * Version: v. 1.5.1
                               * Datum: 19.01.2026
                               * Forum: https://forum.iobroker.net/topic/83592/script-google-shared-locations-cookie-fixer
                               * * Historie:
                               * v. 1.0 - Erstveröffentlichung: Grundfunktion zur Cookie-Extraktion.
                               * v. 1.1 - Automatisierung: Adapter-Datenpunkte werden automatisch beschreibbar gemacht.
                               * v. 1.2 - Tarnung: User-Agent und Bot-Detection-Umgehung hinzugefügt.
                               * v. 1.3 - Domain-Fix: Unterstützung für verschiedene Google-Länderdomains.
                               * v. 1.4 - Consent-Fix: Automatisches Akzeptieren von Cookie-Bannern (SOCS-Handling).
                               * v. 1.5.0 - COM-Fix: Zwingende Umstellung auf google.com für stabile Session-Übernahme.
                               * v. 1.5.1 - Loop-Protection & Retry: 3 Versuche bei Fehlern, danach 30 Min. Sicherheitssperre.
                               */
                              
                              const puppeteer = require('puppeteer');
                              
                              const BASE_PATH = '0_userdata.0.google_sharedlocations_cookie_fixer';
                              const ADAPTER_INSTANCE = 'google-sharedlocations.0';
                              const ADAPTER_ALIVE_DP = `system.adapter.${ADAPTER_INSTANCE}.alive`;
                              const ADAPTER_COOKIE_DP = `${ADAPTER_INSTANCE}.info.augmented_cookie`;
                              const ADAPTER_CONN_DP = `${ADAPTER_INSTANCE}.info.connection`;
                              
                              let isRefreshing = false;
                              let lastAutoRepair = 0;
                              let retryCount = 0;
                              const MAX_RETRIES = 3;
                              
                              async function initDPs() {
                                  await createStateAsync(`${BASE_PATH}.Cookie`, '', {name: 'Aktueller Google Cookie', type: 'string', role: 'text'});
                                  await createStateAsync(`${BASE_PATH}.LastUpdate`, '', {name: 'Letztes Update Zeitstempel', type: 'string', role: 'text'});
                                  await createStateAsync(`${BASE_PATH}.TriggerRefresh`, false, {name: 'Manueller Refresh Trigger', type: 'boolean', role: 'button'});
                                  await createStateAsync(`${BASE_PATH}.RestoreAdapter`, false, {name: 'Cookie zum Adapter kopieren & Neustart', type: 'boolean', role: 'button'});
                              }
                              
                              async function startRefresh(isAuto = false) {
                                  if (isRefreshing) return;
                                  
                                  const now = Date.now();
                                  // Cooldown-Prüfung: Falls deaktiviert, loggen wir das und brechen ab.
                                  if (isAuto && retryCount === 0 && (now - lastAutoRepair) < 1800000) {
                                      console.warn(`[Cookie-Fixer] Auto-Repair aktuell deaktiviert (Sicherheitssperre bis ${new Date(lastAutoRepair + 1800000).toLocaleTimeString()}).`);
                                      return;
                                  }
                              
                                  isRefreshing = true;
                                  let state = await getStateAsync(`${BASE_PATH}.Cookie`);
                                  let cookieToUse = state ? state.val : '';
                              
                                  if (!cookieToUse || cookieToUse.length < 50) {
                                      const adapterCookie = await getStateAsync(ADAPTER_COOKIE_DP);
                                      cookieToUse = adapterCookie ? adapterCookie.val : '';
                                  }
                              
                                  if (!cookieToUse || cookieToUse.length < 50) {
                                      console.warn(`[Cookie-Fixer] Abbruch: Kein gültiger Start-Cookie gefunden!`);
                                      isRefreshing = false;
                                      return;
                                  }
                              
                                  console.log(`[Cookie-Fixer] Starte Refresh (${isAuto ? 'Auto' : 'Manuell'}, Versuch ${retryCount + 1}/${MAX_RETRIES})...`);
                                  let browser;
                              
                                  try {
                                      browser = await puppeteer.launch({
                                          headless: true,
                                          args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled', '--lang=en-US']
                                      });
                              
                                      const page = await browser.newPage();
                                      await page.setViewport({ width: 1280, height: 800 });
                                      await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
                              
                                      const rawPairs = cookieToUse.split(';');
                                      const domains = ['.google.com', 'google.com']; 
                                      for (let pair of rawPairs) {
                                          const parts = pair.trim().split('=');
                                          if (parts.length >= 2) {
                                              const name = parts[0].trim();
                                              const value = parts.slice(1).join('=').trim();
                                              for (let dom of domains) {
                                                  try { await page.setCookie({ name, value, domain: dom, path: '/', secure: true, sameSite: 'Lax' }); } catch (e) {}
                                              }
                                          }
                                      }
                              
                                      await page.goto('https://www.google.com', { waitUntil: 'networkidle2', timeout: 60000 });
                                      
                                      try {
                                          const buttons = await page.$$('button');
                                          for (let btn of buttons) {
                                              const text = await page.evaluate(el => el.innerText, btn);
                                              if (text.includes('Accept all') || text.includes('I agree') || text.includes('Alle akzeptieren')) {
                                                  await btn.click();
                                                  await new Promise(r => setTimeout(r, 2000));
                                                  break;
                                              }
                                          }
                                      } catch (e) {}
                              
                                      await page.goto('https://maps.google.com', { waitUntil: 'networkidle2', timeout: 60000 });
                                      await new Promise(r => setTimeout(r, 5000));
                              
                                      const freshCookies = await page.cookies();
                                      const freshCookieString = freshCookies
                                          .filter(c => c.domain.includes('google.com'))
                                          .map(c => `${c.name}=${c.value}`)
                                          .join('; ');
                              
                                      if (freshCookieString.length > 100 && (freshCookieString.includes('SID=') || freshCookieString.includes('Secure-3'))) {
                                          await setStateAsync(`${BASE_PATH}.Cookie`, freshCookieString, true);
                                          await setStateAsync(`${BASE_PATH}.LastUpdate`, new Date().toLocaleString(), true);
                                          console.log('[Cookie-Fixer] ERFOLG: Google.com Session-Cookie generiert.');
                                          
                                          retryCount = 0; 
                                          lastAutoRepair = Date.now(); 
                                          
                                          const conn = await getStateAsync(ADAPTER_CONN_DP);
                                          if (conn && !conn.val) await restoreAdapter();
                                      } else {
                                          throw new Error('Cookie unvollständig (SID fehlt)');
                                      }
                              
                                  } catch (err) {
                                      console.error(`[Cookie-Fixer] Fehler in Versuch ${retryCount + 1}: ${err.message}`);
                                      retryCount++;
                                      
                                      if (isAuto && retryCount < MAX_RETRIES) {
                                          console.log('[Cookie-Fixer] Pause... Nächster Versuch in 60 Sekunden.');
                                          setTimeout(() => {
                                              isRefreshing = false;
                                              startRefresh(true);
                                          }, 60000);
                                      } else {
                                          console.error(`[Cookie-Fixer] Abbruch nach ${MAX_RETRIES} Versuchen. Auto-Repair für 30 Minuten deaktiviert.`);
                                          retryCount = 0;
                                          lastAutoRepair = Date.now();
                                      }
                                  } finally {
                                      if (browser) await browser.close();
                                      isRefreshing = false;
                                  }
                              }
                              
                              async function restoreAdapter() {
                                  const scriptCookie = await getStateAsync(`${BASE_PATH}.Cookie`);
                                  if (!scriptCookie || scriptCookie.val.length < 100) return;
                                  await extendObjectAsync(ADAPTER_COOKIE_DP, {common: {write: true}});
                                  await setStateAsync(ADAPTER_COOKIE_DP, scriptCookie.val, false);
                                  await setStateAsync(ADAPTER_ALIVE_DP, false);
                                  setTimeout(() => setState(ADAPTER_ALIVE_DP, true), 5000);
                              }
                              
                              async function main() {
                                  await initDPs();
                                  await startRefresh();
                                  
                                  on({id: `${BASE_PATH}.TriggerRefresh`, val: true, ack: false}, () => { 
                                      retryCount = 0;
                                      lastAutoRepair = 0; // Manuellem Trigger Vorrang geben
                                      startRefresh(false); 
                                      setState(`${BASE_PATH}.TriggerRefresh`, false, true); 
                                  });
                                  
                                  on({id: `${BASE_PATH}.RestoreAdapter`, val: true, ack: false}, () => { 
                                      restoreAdapter(); 
                                      setState(`${BASE_PATH}.RestoreAdapter`, false, true); 
                                  });
                                  
                                  on({id: ADAPTER_CONN_DP, val: false, ack: true}, async () => { 
                                      const alive = await getStateAsync(ADAPTER_ALIVE_DP);
                                      if (alive && alive.val) {
                                          console.log('[Cookie-Fixer] Adapter offline! Starte Auto-Repair...');
                                          await startRefresh(true);
                                      }
                                  });
                                  
                                  schedule("0 4 * * *", () => {
                                      retryCount = 0;
                                      startRefresh(false);
                                  });
                              }
                              main();
                              
                              
                              

                              Zeigt eure Lovelace-Visualisierung klick
                              (Auch ideal um sich Anregungen zu holen)

                              Meine Tabellen für eure Visualisierung klick

                              1 Antwort Letzte Antwort
                              0
                              Antworten
                              • In einem neuen Thema antworten
                              Anmelden zum Antworten
                              • Älteste zuerst
                              • Neuste zuerst
                              • Meiste Stimmen


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              364

                              Online

                              32.6k

                              Benutzer

                              82.0k

                              Themen

                              1.3m

                              Beiträge
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Anmelden

                              • Du hast noch kein Konto? Registrieren

                              • Anmelden oder registrieren, um zu suchen
                              • Erster Beitrag
                                Letzter Beitrag
                              0
                              • Home
                              • Aktuell
                              • Tags
                              • Ungelesen 0
                              • Kategorien
                              • Unreplied
                              • Beliebt
                              • GitHub
                              • Docu
                              • Hilfe