import { useState, useRef } from 'react'; import { S } from '../lib.js'; const C = { accent: '#f59e0b', success: '#4ade80', error: '#f87171', muted: '#6b7280', }; export default function PaywallKiller() { const [inputUrl, setInputUrl] = useState(''); const [archiveUrl, setArchiveUrl] = useState(''); const [status, setStatus] = useState('idle'); const inputRef = useRef(null); function getTargetUrl() { let url = inputUrl.trim(); if (!url.startsWith('http')) url = 'https://' + url; // Mobile Subdomains auf Desktop normalisieren (m.bild.de → www.bild.de) // damit archive.ph den richtigen Snapshot findet try { const u = new URL(url); if (u.hostname.startsWith('m.')) { u.hostname = 'www.' + u.hostname.slice(2); url = u.toString(); } else if (u.hostname.startsWith('mobile.')) { u.hostname = 'www.' + u.hostname.slice(7); url = u.toString(); } } catch {} return url; } function handleSearch() { if (!inputUrl.trim()) return; const targetUrl = getTargetUrl(); // archive.ph Submit (no-cors, fire-and-forget) – triggert Archivierung try { const formData = new FormData(); formData.append('url', targetUrl); formData.append('anyway', '1'); fetch('https://archive.ph/submit/', { method: 'POST', mode: 'no-cors', body: formData, }).catch(() => {}); } catch {} setArchiveUrl(`https://archive.ph/newest/${targetUrl}`); setStatus('ready'); } function handleReset() { setInputUrl(''); setArchiveUrl(''); setStatus('idle'); setTimeout(() => inputRef.current?.focus(), 50); } return (
{/* Header */}
🔓 PAYWALL-KILLER
archive.ph · Als PDF speichern
GETESTET MIT {[ { name: 'waz.de', domain: 'waz.de' }, { name: 'bild.de', domain: 'bild.de' }, { name: 'heise.de', domain: 'heise.de' }, ].map(({ name, domain }) => (
{name}
))}
{/* Eingabe */}
ARTIKEL-URL
setInputUrl(e.target.value)} onKeyDown={e => e.key === 'Enter' && status === 'idle' && handleSearch()} placeholder="URL einfügen (Long-Press → Einfügen)" style={{ ...S.inp, width: '100%', boxSizing: 'border-box', marginBottom: 10 }} />
{status === 'idle' ? ( ) : ( )}
{/* Ergebnis */} {status === 'ready' && (
ARTIKEL ÖFFNEN & ALS PDF SPEICHERN
{/* Schritt 1 */}
1
Ö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.
🌐 Artikel auf archive.ph öffnen
{/* Nochmal öffnen nach Archivierung */}
Nach "archive this url" ~15–30s warten, dann:
🔄 Nochmal öffnen
{/* Schritt 2 */}
2
Wenn der Artikel sichtbar ist, als PDF speichern:
{[ ['📱', 'Android Chrome', 'Menü (⋮) → Teilen → Drucken → Als PDF · Kopf-/Fußzeilen: aus'], ['🍎', 'iOS Safari', 'Teilen-Button → Als PDF sichern'], ['💻', 'Desktop', 'Strg+P / Cmd+P → Als PDF · Kopf-/Fußzeilen: aus'], ].map(([icon, label, desc]) => (
{icon} {label}
{desc}
))}
ℹ️ Der archive.ph-Balken oben ist Teil der archivierten Seite und kann nicht automatisch entfernt werden.
)} {/* Idle-Info */} {status === 'idle' && (
SO FUNKTIONIERT ES
{[ ['1', 'URL des gesperrten Artikels einfügen'], ['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]) => (
{num} {text}
))}
)}
); }