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.8k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

Script: Google Shared Locations Cookie Fixer

Geplant Angeheftet Gesperrt Verschoben JavaScript
31 Beiträge 6 Kommentatoren 323 Aufrufe 10 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 Nicht stören
    B Nicht stören
    bommel_030
    schrieb am 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 Offline
      David G.D Offline
      David G.
      schrieb am 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 am 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 Offline
          David G.D Offline
          David G.
          schrieb am 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 am 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 Offline
              David G.D Offline
              David G.
              schrieb am 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 am 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 Offline
                  David G.D Offline
                  David G.
                  schrieb am 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
                  • XBiTX Offline
                    XBiTX Offline
                    XBiT
                    schrieb am zuletzt editiert von
                    #22

                    @david-g.

                    also bei mir ist die Nacht um 4:04 der Cookie abgelaufen und es hat alles gekappt -> Wegpunkte von heute sind da.

                    2026-01-20 04:04:48.931  - info: google-sharedlocations.0 (311359) Error in location data parsing: Error: No location data in response. Cookie expired or no users share their location with you.
                    2026-01-20 04:04:48.932  - error: google-sharedlocations.0 (311359) Could not parse location data. Probably authentication error. Please check cookie.
                    2026-01-20 04:04:48.938  - info: javascript.0 (646033) script.js.common.0_userdata_0_.Standort.google_sharedlocations_cookie_fixer: [Cookie-Fixer] Starte Refresh auf google.com...
                    2026-01-20 04:04:49.095  - info: google-sharedlocations.0 (311359) Error in location data parsing: Error: No location data in response. Cookie expired or no users share their location with you.
                    2026-01-20 04:04:49.095  - error: google-sharedlocations.0 (311359) Could not parse location data. Probably authentication error. Please check cookie.
                    2026-01-20 04:04:49.101  - info: javascript.0 (646033) script.js.common.0_userdata_0_.Standort.google_sharedlocations_cookie_fixer: [Cookie-Fixer] Starte Refresh auf google.com...
                    2026-01-20 04:05:04.441  - info: javascript.0 (646033) script.js.common.0_userdata_0_.Standort.google_sharedlocations_cookie_fixer: [Cookie-Fixer] ERFOLG: Google.com Session-Cookie generiert.
                    2026-01-20 04:05:04.514  - info: host.IoBroker instance "system.adapter.google-sharedlocations.0" disabled via .alive
                    2026-01-20 04:05:04.526  - info: host.IoBroker "system.adapter.google-sharedlocations.0" disabled
                    2026-01-20 04:05:04.526  - info: host.IoBroker stopInstance system.adapter.google-sharedlocations.0 (force=false, process=true)
                    2026-01-20 04:05:04.530  - info: google-sharedlocations.0 (311359) Got terminate signal TERMINATE_YOURSELF
                    2026-01-20 04:05:04.530  - info: google-sharedlocations.0 (311359) terminating
                    2026-01-20 04:05:04.531  - info: google-sharedlocations.0 (311359) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
                    2026-01-20 04:05:04.581  - info: host.IoBroker stopInstance system.adapter.google-sharedlocations.0 send kill signal
                    2026-01-20 04:05:05.031  - info: google-sharedlocations.0 (311359) terminating
                    2026-01-20 04:05:05.174  - info: host.IoBroker instance system.adapter.google-sharedlocations.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
                    2026-01-20 04:05:05.608  - info: javascript.0 (646033) script.js.common.0_userdata_0_.Standort.google_sharedlocations_cookie_fixer: [Cookie-Fixer] ERFOLG: Google.com Session-Cookie generiert.
                    2026-01-20 04:05:09.558  - info: host.IoBroker instance "system.adapter.google-sharedlocations.0" enabled via .alive
                    2026-01-20 04:05:09.566  - info: host.IoBroker "system.adapter.google-sharedlocations.0" enabled
                    2026-01-20 04:05:09.820  - info: host.IoBroker instance system.adapter.google-sharedlocations.0 in version "2.2.1" (non-npm: Garfonso/ioBroker.google-sharedlocations#91ce6d3d470cba4011b7861103c4bfffa32dffbe) started with pid 687283
                    2026-01-20 04:05:11.758  - info: google-sharedlocations.0 (687283) starting. Version 2.2.1 (non-npm: Garfonso/ioBroker.google-sharedlocations#91ce6d3d470cba4011b7861103c4bfffa32dffbe) in /opt/iobroker/node_modules/iobroker.google-sharedlocations, node: v22.21.0, js-controller: 7.0.7
                    2026-01-20 04:05:11.768  - info: google-sharedlocations.0 (687283) Starting google shared locations adapter
                    
                    

                    Vielen Dank noch an dieser Stelle.

                    1 Antwort Letzte Antwort
                    2
                    • GarfonsoG Offline
                      GarfonsoG Offline
                      Garfonso
                      Developer
                      schrieb am zuletzt editiert von
                      #23

                      Cooles skript. Danke dafür. :-)

                      Vielleicht gucke ich mal, ob ich puppeteer in den Adapter direkt integrieren kann? So etwas hatte ich immer schon im Kopf, aber nie umgesetzt. Hm.

                      Alternativ kann ich auch eine message zum speichern eines neuen cookies einfügen. Dann müsste man den Adapter nicht neustarten. (der Verbindungscheck läuft auch schon über message, du müsstest also mit sendTo('google-sharedlocations.0', 'checmConnection', { cookie: HIER_COOKIE }, reply => { log('Cookie ist ' + reply ? 'ok' : 'nicht ok') }); prüfen können, ob der Adapter mit dem Cookie, den du übergibst, glücklich ist. Ähnlich könnte das verwenden / speichern eines Cookie implementiert werden.

                      Ultimativer Lovelace Leitfaden: https://forum.iobroker.net/topic/35937/der-ultimative-iobroker-lovelace-leitfaden-dokumentation

                      Lovelace UI Beispiele: https://forum.iobroker.net/topic/35950/zeigt-her-eure-lovelace-visualisierung

                      K B 2 Antworten Letzte Antwort
                      1
                      • GarfonsoG Garfonso

                        Cooles skript. Danke dafür. :-)

                        Vielleicht gucke ich mal, ob ich puppeteer in den Adapter direkt integrieren kann? So etwas hatte ich immer schon im Kopf, aber nie umgesetzt. Hm.

                        Alternativ kann ich auch eine message zum speichern eines neuen cookies einfügen. Dann müsste man den Adapter nicht neustarten. (der Verbindungscheck läuft auch schon über message, du müsstest also mit sendTo('google-sharedlocations.0', 'checmConnection', { cookie: HIER_COOKIE }, reply => { log('Cookie ist ' + reply ? 'ok' : 'nicht ok') }); prüfen können, ob der Adapter mit dem Cookie, den du übergibst, glücklich ist. Ähnlich könnte das verwenden / speichern eines Cookie implementiert werden.

                        K Online
                        K Online
                        Krys
                        schrieb am zuletzt editiert von
                        #24

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

                        Cooles skript. Danke dafür. :-)

                        Vielleicht gucke ich mal, ob ich puppeteer in den Adapter direkt integrieren kann? So etwas hatte ich immer schon im Kopf, aber nie umgesetzt. Hm.

                        Alternativ kann ich auch eine message zum speichern eines neuen cookies einfügen. Dann müsste man den Adapter nicht neustarten. (der Verbindungscheck läuft auch schon über message, du müsstest also mit sendTo('google-sharedlocations.0', 'checmConnection', { cookie: HIER_COOKIE }, reply => { log('Cookie ist ' + reply ? 'ok' : 'nicht ok') }); prüfen können, ob der Adapter mit dem Cookie, den du übergibst, glücklich ist. Ähnlich könnte das verwenden / speichern eines Cookie implementiert werden.

                        Das wäre schon sehr nice.

                        1 Antwort Letzte Antwort
                        0
                        • GarfonsoG Garfonso

                          Cooles skript. Danke dafür. :-)

                          Vielleicht gucke ich mal, ob ich puppeteer in den Adapter direkt integrieren kann? So etwas hatte ich immer schon im Kopf, aber nie umgesetzt. Hm.

                          Alternativ kann ich auch eine message zum speichern eines neuen cookies einfügen. Dann müsste man den Adapter nicht neustarten. (der Verbindungscheck läuft auch schon über message, du müsstest also mit sendTo('google-sharedlocations.0', 'checmConnection', { cookie: HIER_COOKIE }, reply => { log('Cookie ist ' + reply ? 'ok' : 'nicht ok') }); prüfen können, ob der Adapter mit dem Cookie, den du übergibst, glücklich ist. Ähnlich könnte das verwenden / speichern eines Cookie implementiert werden.

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

                          @Garfonso

                          Weißt du noch welcher Teil des Cookies für die Anmeldung wirklich wichtig ist? Ich bekomme es zum verrecken nicht hin, dass der Adapter den Cookie aus dem Skript auch akzeptiert. Der sieht am Anfang leicht anders aus als der, den ich manuell aus der Browserkonsole kopiere.

                          GarfonsoG 1 Antwort Letzte Antwort
                          0
                          • B bommel_030

                            @Garfonso

                            Weißt du noch welcher Teil des Cookies für die Anmeldung wirklich wichtig ist? Ich bekomme es zum verrecken nicht hin, dass der Adapter den Cookie aus dem Skript auch akzeptiert. Der sieht am Anfang leicht anders aus als der, den ich manuell aus der Browserkonsole kopiere.

                            GarfonsoG Offline
                            GarfonsoG Offline
                            Garfonso
                            Developer
                            schrieb am zuletzt editiert von
                            #26

                            @bommel_030
                            Nö, keine Ahnung.

                            Das wichtigste ist halt maps.google.com (nicht .de). Da bin ich meistens drüber gestolpert... aber sonst. schulterzuck

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

                            aber in der Instanzeinstellung bleibt (auch nach refresh) der alte Cookie stehen.

                            Ja, das ist korrekt... eigentlich ist es so gedacht, dass der Cookie in den Instanzeinstellungen der Chef ist und in "augmented cookie" schreibt der Adapter, was er sonst noch so vom Server geschickt bekommt. Das war ein Versuch dafür zu sorgen, dass der cookie länger hält.
                            Es kann sogar sein, dass der cookie in den Instanzeinstellungen immer mit in den augmented reinkopiert wird (und da dann vielleicht was kaputt macht?) - das weiß ich nicht mehr ganz genau... Muss nochmal tiefer in den Code gucken. Vielleicht werf ich das auch alle über den Haufen und mach nen neuen Adapter, dann könnte er vielleicht auch mal wieder ins repository. kopfkratz

                            Ultimativer Lovelace Leitfaden: https://forum.iobroker.net/topic/35937/der-ultimative-iobroker-lovelace-leitfaden-dokumentation

                            Lovelace UI Beispiele: https://forum.iobroker.net/topic/35950/zeigt-her-eure-lovelace-visualisierung

                            B 1 Antwort Letzte Antwort
                            0
                            • GarfonsoG Garfonso

                              @bommel_030
                              Nö, keine Ahnung.

                              Das wichtigste ist halt maps.google.com (nicht .de). Da bin ich meistens drüber gestolpert... aber sonst. schulterzuck

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

                              aber in der Instanzeinstellung bleibt (auch nach refresh) der alte Cookie stehen.

                              Ja, das ist korrekt... eigentlich ist es so gedacht, dass der Cookie in den Instanzeinstellungen der Chef ist und in "augmented cookie" schreibt der Adapter, was er sonst noch so vom Server geschickt bekommt. Das war ein Versuch dafür zu sorgen, dass der cookie länger hält.
                              Es kann sogar sein, dass der cookie in den Instanzeinstellungen immer mit in den augmented reinkopiert wird (und da dann vielleicht was kaputt macht?) - das weiß ich nicht mehr ganz genau... Muss nochmal tiefer in den Code gucken. Vielleicht werf ich das auch alle über den Haufen und mach nen neuen Adapter, dann könnte er vielleicht auch mal wieder ins repository. kopfkratz

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

                              @Garfonso
                              Danke für die Rückmeldung. Auf .com habe ich immer geachtet, das kann ich ausschließen.
                              Dann schmeiß ich mal puppeteer etc. wieder runter und versuch es nochmal neu....

                              Ein Adapter aus dem Repository wäre natürlich klasse. Wäre eine Anmeldung aus dem Adapter mit Nutzername/Passwort grundsätzlich möglich?

                              GarfonsoG 1 Antwort Letzte Antwort
                              0
                              • B bommel_030

                                @Garfonso
                                Danke für die Rückmeldung. Auf .com habe ich immer geachtet, das kann ich ausschließen.
                                Dann schmeiß ich mal puppeteer etc. wieder runter und versuch es nochmal neu....

                                Ein Adapter aus dem Repository wäre natürlich klasse. Wäre eine Anmeldung aus dem Adapter mit Nutzername/Passwort grundsätzlich möglich?

                                GarfonsoG Offline
                                GarfonsoG Offline
                                Garfonso
                                Developer
                                schrieb am zuletzt editiert von
                                #28

                                @bommel_030
                                ich muss mal lernen, was mit puppeteer so möglich ist und wie man den steuert. Vielleicht geht's mit dem (ohne 2FA).

                                Ultimativer Lovelace Leitfaden: https://forum.iobroker.net/topic/35937/der-ultimative-iobroker-lovelace-leitfaden-dokumentation

                                Lovelace UI Beispiele: https://forum.iobroker.net/topic/35950/zeigt-her-eure-lovelace-visualisierung

                                David G.D 1 Antwort Letzte Antwort
                                1
                                • GarfonsoG Garfonso

                                  @bommel_030
                                  ich muss mal lernen, was mit puppeteer so möglich ist und wie man den steuert. Vielleicht geht's mit dem (ohne 2FA).

                                  David G.D Offline
                                  David G.D Offline
                                  David G.
                                  schrieb am zuletzt editiert von David G.
                                  #29

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

                                  ich muss mal lernen, was mit puppeteer so möglich ist und wie man den steuert. Vielleicht geht's mit dem (ohne 2FA).

                                  Wegen 2FA hatte gemini beim dem Script auch bedenken geäußert. Das wird wohl mit puppeteer auch verlangt. Das wird nur umgangen indem das Coockie mitgegeben wird. Angeblich (laut gemini) kann er sogar 2FA verlangen, wenn der Coockie aus einem anderen Netzwerk bzw Standort kommt wie der Browseraufruf.
                                  Puppeteer ist ja ein ganz normaler Chrome Browser mit fetter API.

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

                                  Meine Tabellen für eure Visualisierung klick

                                  1 Antwort Letzte Antwort
                                  0
                                  • GarfonsoG Offline
                                    GarfonsoG Offline
                                    Garfonso
                                    Developer
                                    schrieb zuletzt editiert von Garfonso
                                    #30

                                    Naja, 2FA find ich nicht sooo super kritisch, ist ja "nur" der ioBroker Account. ;-)

                                    Die Frage wäre ja, wie man den 2. Faktor in den Adapter bekommt (wenn der sich einloggen soll) und ob man dann wirklich was an Sicherheit gewonnen hat...

                                    Ultimativer Lovelace Leitfaden: https://forum.iobroker.net/topic/35937/der-ultimative-iobroker-lovelace-leitfaden-dokumentation

                                    Lovelace UI Beispiele: https://forum.iobroker.net/topic/35950/zeigt-her-eure-lovelace-visualisierung

                                    1 Antwort Letzte Antwort
                                    0
                                    • GarfonsoG Offline
                                      GarfonsoG Offline
                                      Garfonso
                                      Developer
                                      schrieb zuletzt editiert von
                                      #31

                                      So, falls jemand testen mag:
                                      https://forum.iobroker.net/topic/83726/test-adapter-google-sharedlocations2

                                      Es ist echt magisch. g Gerne in dem anderen Topic weiter diskutieren, falls es da Bedarf gibt.

                                      Ultimativer Lovelace Leitfaden: https://forum.iobroker.net/topic/35937/der-ultimative-iobroker-lovelace-leitfaden-dokumentation

                                      Lovelace UI Beispiele: https://forum.iobroker.net/topic/35950/zeigt-her-eure-lovelace-visualisierung

                                      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

                                      699

                                      Online

                                      32.6k

                                      Benutzer

                                      82.1k

                                      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