simoncck commited on
Commit
0e460eb
·
verified ·
1 Parent(s): 9c1fde7

Update server.js

Browse files
Files changed (1) hide show
  1. server.js +38 -14
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 || 7860;
8
- /*const TOKEN = process.env.API_KEY || '';*/ // optional simple auth
 
9
 
10
  const app = express();
11
  app.use(express.json());
12
 
13
- /* POST /login { "key": "secret" } */
14
- app.post('/login', async (req, res) => {
15
- /* if (TOKEN && req.body.key !== TOKEN)
16
- return res.status(401).json({ error: 'unauthorized' });*/
 
 
 
 
 
 
17
 
18
- // optional: debounce so two calls don't overlap
19
- if (app.locals.running) return res.status(429).json({ error: 'busy' });
20
- app.locals.running = true;
21
 
22
- const result = await runLogin();
23
- app.locals.running = false;
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- res.json(result);
 
 
 
 
 
 
 
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));