From f19deb189745272ff65096174d0dd90e7c631dfc Mon Sep 17 00:00:00 2001 From: Dicken Date: Fri, 12 Jun 2026 17:10:29 +0200 Subject: [PATCH] fix: kein Countdown, ehrlicher UX mit Retry-Button und klaren Hinweisen --- frontend/src/tools/paywallkiller.jsx | 105 +++++++-------------------- 1 file changed, 28 insertions(+), 77 deletions(-) diff --git a/frontend/src/tools/paywallkiller.jsx b/frontend/src/tools/paywallkiller.jsx index d699b18..f164f1d 100644 --- a/frontend/src/tools/paywallkiller.jsx +++ b/frontend/src/tools/paywallkiller.jsx @@ -8,27 +8,10 @@ const C = { muted: '#6b7280', }; -// Wayback CDX – prüft ob Snapshot existiert (CORS: *) -async function checkWayback(targetUrl) { - try { - const res = await fetch( - `https://web.archive.org/cdx/search/cdx?url=${encodeURIComponent(targetUrl)}&output=json&limit=1&fl=timestamp&filter=statuscode:200&fastLatest=true` - ); - if (!res.ok) return null; - const data = await res.json(); - if (Array.isArray(data) && data.length >= 2 && data[1]?.[0]) { - return `https://web.archive.org/web/${data[1][0]}/${targetUrl}`; - } - } catch {} - return null; -} - export default function PaywallKiller() { - const [inputUrl, setInputUrl] = useState(''); + const [inputUrl, setInputUrl] = useState(''); const [archiveUrl, setArchiveUrl] = useState(''); - // status: idle | checking | archiving | ready | notfound - const [status, setStatus] = useState('idle'); - const [statusMsg, setStatusMsg] = useState(''); + const [status, setStatus] = useState('idle'); const inputRef = useRef(null); function getTargetUrl() { @@ -36,32 +19,12 @@ export default function PaywallKiller() { return url.startsWith('http') ? url : 'https://' + url; } - async function handleSearch() { + function handleSearch() { if (!inputUrl.trim()) return; const targetUrl = getTargetUrl(); - setStatus('checking'); - setStatusMsg('Prüfe ob Archiv existiert...'); - setArchiveUrl(''); - - // Schritt 1: Prüfen ob archive.ph schon einen Snapshot hat - // archive.ph /newest/ leitet weiter wenn gefunden, sonst Suchseite - // Wir nutzen CDX der Wayback Machine als schnelle Vorab-Prüfung - // und bauen immer die archive.ph URL auf - const newestUrl = `https://archive.ph/newest/${targetUrl}`; - - // Parallel: Wayback prüfen (liefert uns Info ob überhaupt archiviert) - // Aber primär: archive.ph direkt versuchen - // Falls "No results" → automatisch archivieren via no-cors submit - - setArchiveUrl(newestUrl); - - // Schritt 2: archive.ph Submit (fire-and-forget, no-cors) - // Das triggert die Archivierung falls noch nicht vorhanden - setStatus('archiving'); - setStatusMsg('Archiviere Artikel (falls noch nicht vorhanden)...'); + // archive.ph Submit (no-cors, fire-and-forget) – triggert Archivierung try { - // archive.ph Submit via no-cors – kein Response lesbar aber Request geht raus const formData = new FormData(); formData.append('url', targetUrl); formData.append('anyway', '1'); @@ -72,13 +35,7 @@ export default function PaywallKiller() { }).catch(() => {}); } catch {} - // Schritt 3: 8s warten dann Artikel öffnen - // (archive.ph braucht ~5-15s zum Archivieren) - for (let i = 8; i > 0; i--) { - setStatusMsg(`Archivierung läuft... öffnet in ${i}s`); - await new Promise(r => setTimeout(r, 1000)); - } - + setArchiveUrl(`https://archive.ph/newest/${targetUrl}`); setStatus('ready'); } @@ -86,30 +43,28 @@ export default function PaywallKiller() { setInputUrl(''); setArchiveUrl(''); setStatus('idle'); - setStatusMsg(''); setTimeout(() => inputRef.current?.focus(), 50); } return (
+ {/* Header */}
🔓 PAYWALL-KILLER
archive.ph · Als PDF speichern
- - {/* Getestet-Badges */}
GETESTET MIT {[ - { name: 'waz.de', favicon: 'https://www.google.com/s2/favicons?domain=waz.de&sz=16' }, - { name: 'bild.de', favicon: 'https://www.google.com/s2/favicons?domain=bild.de&sz=16' }, - { name: 'heise.de', favicon: 'https://www.google.com/s2/favicons?domain=heise.de&sz=16' }, - ].map(({ name, favicon }) => ( + { name: 'waz.de', domain: 'waz.de' }, + { name: 'bild.de', domain: 'bild.de' }, + { name: 'heise.de', domain: 'heise.de' }, + ].map(({ name, domain }) => (
- + {name}
))} @@ -142,32 +97,17 @@ export default function PaywallKiller() {
- {/* Lade-Status */} - {(status === 'checking' || status === 'archiving') && ( -
-
- - {statusMsg} -
- {status === 'archiving' && ( -
- archive.ph archiviert den Artikel. Das dauert einen Moment. Anschließend wird er automatisch geöffnet. -
- )} -
- )} - {/* Ergebnis */} - {status === 'ready' && archiveUrl && ( + {status === 'ready' && (
ARTIKEL ÖFFNEN & ALS PDF SPEICHERN
{/* Schritt 1 */} -
+
1
- Öffne archive.ph – falls CAPTCHA erscheint einmalig lösen: + Öffne den Artikel auf archive.ph. Falls CAPTCHA erscheint: einmalig lösen. Falls "No results": auf "archive this url" klicken, kurz warten, dann nochmal öffnen.
@@ -176,12 +116,23 @@ export default function PaywallKiller() {
+ {/* Nochmal öffnen nach Archivierung */} +
+
+ Nach "archive this url" ~15–30s warten, dann: +
+
+ 🔄 Nochmal öffnen + +
+ {/* Schritt 2 */}
2
- Als PDF speichern: + Wenn der Artikel sichtbar ist, als PDF speichern:
{[ @@ -211,8 +162,8 @@ export default function PaywallKiller() {
SO FUNKTIONIERT ES
{[ ['1', 'URL des gesperrten Artikels einfügen'], - ['2', 'Archiv wird automatisch gesucht und erstellt falls nötig'], - ['3', 'Artikel auf archive.ph öffnen – CAPTCHA einmalig lösen'], + ['2', 'Artikel auf archive.ph öffnen'], + ['3', 'Falls nicht archiviert: "archive this url" klicken, kurz warten, nochmal öffnen'], ['4', 'Über Drucken-Funktion als PDF speichern'], ].map(([num, text]) => (