token-refresh: .env automatisch aktualisieren

Made-with: Cursor
This commit is contained in:
2026-02-28 12:36:30 +01:00
parent 6ca6132cf8
commit 0002af207a
2 changed files with 44 additions and 8 deletions

View File

@@ -97,7 +97,7 @@ Tokens laufen nach einiger Zeit ab (typisch Stunden). Bei 401-Fehlern oder „Ni
npm run token-refresh
```
Öffnet einen Browser mit drive.internxt.com. Einloggen die Tokens werden automatisch extrahiert und in der Konsole ausgegeben. In `.env` eintragen, Server neu starten.
Öffnet einen Browser mit drive.internxt.com. Einloggen die Tokens werden extrahiert und `.env` automatisch aktualisiert. Server neu starten.
### Option B: Manuell

View File

@@ -1,14 +1,19 @@
/**
* Token-Refresh: Öffnet drive.internxt.com im Browser, wartet auf Login,
* extrahiert Token und Mnemonic aus localStorage.
* extrahiert Token und Mnemonic aus localStorage und aktualisiert .env.
*
* Aufruf: npm run token-refresh
*
* Browser öffnet sich (headed). Einloggen, dann werden die Tokens ausgegeben.
*/
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import puppeteer from 'puppeteer';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ENV_PATH = path.resolve(__dirname, '../.env');
const ENV_EXAMPLE = path.resolve(__dirname, '../.env.example');
const DRIVE_URL = 'https://drive.internxt.com';
const POLL_MS = 2000;
const TIMEOUT_MS = 5 * 60 * 1000; // 5 Min
@@ -21,6 +26,39 @@ async function getTokens(page) {
});
}
function updateEnv(token, mnemonic) {
let content = '';
if (fs.existsSync(ENV_PATH)) {
content = fs.readFileSync(ENV_PATH, 'utf8');
} else if (fs.existsSync(ENV_EXAMPLE)) {
content = fs.readFileSync(ENV_EXAMPLE, 'utf8');
}
const lines = content.split('\n');
const result = [];
let hasToken = false;
let hasMnemonic = false;
const escape = (v) => (/\s/.test(v) ? `"${v.replace(/"/g, '\\"')}"` : v);
for (const line of lines) {
if (/^\s*INXT_TOKEN\s*=/.test(line)) {
result.push(`INXT_TOKEN=${escape(token)}`);
hasToken = true;
} else if (/^\s*INXT_MNEMONIC\s*=/.test(line)) {
result.push(`INXT_MNEMONIC=${escape(mnemonic)}`);
hasMnemonic = true;
} else {
result.push(line);
}
}
if (!hasToken) result.push(`INXT_TOKEN=${escape(token)}`);
if (!hasMnemonic) result.push(`INXT_MNEMONIC=${escape(mnemonic)}`);
fs.writeFileSync(ENV_PATH, result.join('\n'), 'utf8');
}
async function main() {
console.log('Starte Browser bitte auf', DRIVE_URL, 'einloggen.\n');
@@ -37,10 +75,8 @@ async function main() {
while (Date.now() - start < TIMEOUT_MS) {
const { token, mnemonic } = await getTokens(page);
if (token && mnemonic) {
console.log('\n=== Tokens gefunden in .env eintragen ===\n');
console.log('INXT_TOKEN=' + token);
console.log('INXT_MNEMONIC=' + mnemonic);
console.log('\n===========================================\n');
updateEnv(token, mnemonic);
console.log('\n.env aktualisiert. Server neu starten.\n');
await browser.close();
return;
}