NEWS
Script: Google Shared Locations Cookie Fixer
-
@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.1Nachtrag. 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.@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.1Den 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(); -
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 - [32minfo[39m: 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 - [31merror[39m: google-sharedlocations.0 (311359) Could not parse location data. Probably authentication error. Please check cookie. 2026-01-20 04:04:48.938 - [32minfo[39m: 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 - [32minfo[39m: 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 - [31merror[39m: google-sharedlocations.0 (311359) Could not parse location data. Probably authentication error. Please check cookie. 2026-01-20 04:04:49.101 - [32minfo[39m: 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 - [32minfo[39m: 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 - [32minfo[39m: host.IoBroker instance "system.adapter.google-sharedlocations.0" disabled via .alive 2026-01-20 04:05:04.526 - [32minfo[39m: host.IoBroker "system.adapter.google-sharedlocations.0" disabled 2026-01-20 04:05:04.526 - [32minfo[39m: host.IoBroker stopInstance system.adapter.google-sharedlocations.0 (force=false, process=true) 2026-01-20 04:05:04.530 - [32minfo[39m: google-sharedlocations.0 (311359) Got terminate signal TERMINATE_YOURSELF 2026-01-20 04:05:04.530 - [32minfo[39m: google-sharedlocations.0 (311359) terminating 2026-01-20 04:05:04.531 - [32minfo[39m: google-sharedlocations.0 (311359) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason 2026-01-20 04:05:04.581 - [32minfo[39m: host.IoBroker stopInstance system.adapter.google-sharedlocations.0 send kill signal 2026-01-20 04:05:05.031 - [32minfo[39m: google-sharedlocations.0 (311359) terminating 2026-01-20 04:05:05.174 - [32minfo[39m: host.IoBroker instance system.adapter.google-sharedlocations.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION) 2026-01-20 04:05:05.608 - [32minfo[39m: 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 - [32minfo[39m: host.IoBroker instance "system.adapter.google-sharedlocations.0" enabled via .alive 2026-01-20 04:05:09.566 - [32minfo[39m: host.IoBroker "system.adapter.google-sharedlocations.0" enabled 2026-01-20 04:05:09.820 - [32minfo[39m: 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 - [32minfo[39m: 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 - [32minfo[39m: google-sharedlocations.0 (687283) Starting google shared locations adapterVielen Dank noch an dieser Stelle.