diff --git a/backend/src/tools/paywallkiller/routes.js b/backend/src/tools/paywallkiller/routes.js index c2b4cf2..f75f53b 100644 --- a/backend/src/tools/paywallkiller/routes.js +++ b/backend/src/tools/paywallkiller/routes.js @@ -55,11 +55,12 @@ router.get('/cdx', authenticate, async (req, res) => { }); // ── POST /api/tools/paywallkiller/pdf ───────────────────────────────────── -// Immer Wayback-URL verwenden – Originalseite hat server-seitige Paywall +// Lädt via 12ft.io (Paywall-Bypasser, kein CAPTCHA) → PDF router.post('/pdf', authenticate, async (req, res) => { const { originalUrl, archiveUrl } = req.body; - // archiveUrl (Wayback) bevorzugen – hat vollen Text ohne server-seitige Paywall - const targetUrl = archiveUrl || originalUrl; + if (!originalUrl && !archiveUrl) return res.status(400).json({ error: 'URL fehlt' }); + // 12ft.io umgeht Paywalls indem es die Googlebot-Version abruft + const targetUrl = `https://12ft.io/proxy?q=${encodeURIComponent(originalUrl || archiveUrl)}`; if (!targetUrl || typeof targetUrl !== 'string') return res.status(400).json({ error: 'URL fehlt' }); const tmpFile = path.join('/tmp', `pwk_${crypto.randomBytes(8).toString('hex')}.pdf`); diff --git a/frontend/src/tools/paywallkiller.jsx b/frontend/src/tools/paywallkiller.jsx index 9b3fc04..9bc8ede 100644 --- a/frontend/src/tools/paywallkiller.jsx +++ b/frontend/src/tools/paywallkiller.jsx @@ -204,16 +204,37 @@ export default function PaywallKiller() { )} - {hasResult && archivePhUrl && ( + {hasResult && inputUrl.trim() && (
-
- 📦 - archive.ph -
-
- 🌐 Öffnen - Kein PDF – CAPTCHA-geschützt -
+
WEITERE OPTIONEN
+ {[ + { + icon: '🔓', + label: '12ft.io', + desc: 'Paywall-Bypasser (kein CAPTCHA)', + url: `https://12ft.io/proxy?q=${encodeURIComponent(getTargetUrl())}`, + }, + { + icon: '📦', + label: 'archive.ph', + desc: 'Nach CAPTCHA vollen Artikel sichtbar', + url: archivePhUrl, + }, + { + icon: '🗑', + label: 'removepaywall.com', + desc: 'Alternativer Bypasser', + url: `https://www.removepaywall.com/search?url=${encodeURIComponent(getTargetUrl())}`, + }, + ].map(({ icon, label, desc, url }) => ( +
+ + {icon} {label} + + {desc} +
+ ))}
)}