Spaces:
Sleeping
Sleeping
Update server.js
Browse files
server.js
CHANGED
|
@@ -4,26 +4,50 @@ import { runLogin } from './login.js';
|
|
| 4 |
import { JSDOM } from 'jsdom';
|
| 5 |
import { Readability } from '@mozilla/readability';
|
| 6 |
|
| 7 |
-
const PORT = process.env.PORT
|
| 8 |
-
|
|
|
|
| 9 |
|
| 10 |
const app = express();
|
| 11 |
app.use(express.json());
|
| 12 |
|
| 13 |
-
/*
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
app.locals.running = true;
|
| 21 |
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
});
|
| 27 |
|
| 28 |
-
app.listen(PORT, ()
|
| 29 |
-
console.log(`🔐 n8n-login API listening on ${PORT}`));
|
|
|
|
| 4 |
import { JSDOM } from 'jsdom';
|
| 5 |
import { Readability } from '@mozilla/readability';
|
| 6 |
|
| 7 |
+
const PORT = process.env.PORT;
|
| 8 |
+
const TIMEOUT = 15000;
|
| 9 |
+
const API_KEY = process.env.API_KEY || '';
|
| 10 |
|
| 11 |
const app = express();
|
| 12 |
app.use(express.json());
|
| 13 |
|
| 14 |
+
/* ---- screenshot endpoint ---- */
|
| 15 |
+
async function shot(url, res) {
|
| 16 |
+
if (!url?.startsWith('http')) return res.status(400).json({ error: 'bad url' });
|
| 17 |
+
const browser = await chromium.launch({ args: ['--no-sandbox'] });
|
| 18 |
+
const page = await browser.newPage({ viewport: { width:1366, height:768 } });
|
| 19 |
+
await page.goto(url, { waitUntil:'networkidle', timeout: TIMEOUT });
|
| 20 |
+
const buf = await page.screenshot({ type:'png', fullPage:true });
|
| 21 |
+
await browser.close();
|
| 22 |
+
res.type('png').send(buf);
|
| 23 |
+
}
|
| 24 |
|
| 25 |
+
app.get ('/shot', (req,res)=> shot(req.query.url,res));
|
| 26 |
+
app.post('/shot', (req,res)=> shot(req.body.url,res));
|
|
|
|
| 27 |
|
| 28 |
+
/* ---- extract endpoint ---- */
|
| 29 |
+
async function extract(url, res){
|
| 30 |
+
if (!url?.startsWith('http')) return res.status(400).json({ error:'bad url'});
|
| 31 |
+
const browser=await chromium.launch({ args:['--no-sandbox'] });
|
| 32 |
+
const page=await browser.newPage();
|
| 33 |
+
await page.goto(url,{ waitUntil:'networkidle', timeout: TIMEOUT});
|
| 34 |
+
const html=await page.content();
|
| 35 |
+
const title=await page.title();
|
| 36 |
+
const dom=new JSDOM(html,{url});
|
| 37 |
+
const reader=new Readability(dom.window.document).parse() || {};
|
| 38 |
+
const links=[...dom.window.document.querySelectorAll('a[href]')].map(a=>a.href);
|
| 39 |
+
await browser.close();
|
| 40 |
+
res.json({ url,title, text:reader.textContent||'', html:reader.content||'', links});
|
| 41 |
+
}
|
| 42 |
|
| 43 |
+
app.get ('/extract',(req,res)=>extract(req.query.url,res));
|
| 44 |
+
app.post('/extract',(req,res)=>extract(req.body.url,res));
|
| 45 |
+
|
| 46 |
+
/* ---- on-demand login ---- */
|
| 47 |
+
app.post('/login', async (req,res)=>{
|
| 48 |
+
if (API_KEY && req.body.key!==API_KEY) return res.status(401).json({error:'unauth'});
|
| 49 |
+
const out=await runLogin();
|
| 50 |
+
res.json(out);
|
| 51 |
});
|
| 52 |
|
| 53 |
+
app.listen(PORT, ()=>console.log('🚀 API ready on',PORT));
|
|
|