|
|
import express from 'express' |
|
|
import morgan from 'morgan' |
|
|
import * as pup from 'puppeteer-real-browser' |
|
|
import serveIndex from 'serve-index' |
|
|
|
|
|
import { exec } from 'node:child_process' |
|
|
import { tmpdir } from 'node:os' |
|
|
import { setTimeout } from 'node:timers/promises' |
|
|
import { format, promisify } from 'node:util' |
|
|
|
|
|
const app = express() |
|
|
const execPromise = promisify(exec) |
|
|
|
|
|
app.set('json spaces', 2) |
|
|
app.use(express.json({ limit: '200mb' })) |
|
|
app.use(express.urlencoded({ |
|
|
extended: true, |
|
|
limit: '200mb' |
|
|
})) |
|
|
app.use(morgan('dev')) |
|
|
|
|
|
const tmpDir = tmpdir() |
|
|
app.use( |
|
|
tmpDir, |
|
|
express.static(tmpDir), |
|
|
serveIndex( |
|
|
tmpDir, |
|
|
{ hidden: true, icons: true } |
|
|
) |
|
|
) |
|
|
|
|
|
app.all( |
|
|
'/', |
|
|
(_, res) => res.json({ msg: 'Hello World' }) |
|
|
) |
|
|
|
|
|
app.get('/shell', async (req, res) => { |
|
|
const { q = 'w' } = req.query |
|
|
let o, output = '' |
|
|
try { |
|
|
o = await execPromise(q) |
|
|
} catch (e) { |
|
|
o = e |
|
|
} finally { |
|
|
const { stderr, stdout } = o |
|
|
if (stderr) |
|
|
output += `STDERR:\n${stderr}\n` |
|
|
if (stdout) |
|
|
output += `\nSTDOUT:\n${stdout}` |
|
|
res.send(output.trim()) |
|
|
} |
|
|
}) |
|
|
|
|
|
app.get('/ss', async (req, res) => { |
|
|
const { |
|
|
delay = 0, |
|
|
full = false, |
|
|
url = 'https://hf.co' |
|
|
} = req.query |
|
|
const conn = await pup.connect({ |
|
|
customConfig: { |
|
|
executablePath: process.env.CHROME_BIN |
|
|
}, |
|
|
|
|
|
headless: 'new', |
|
|
turnstile: true |
|
|
}) |
|
|
try { |
|
|
const page = conn.page |
|
|
await page.goto( |
|
|
url, |
|
|
{ waitUntil: 'networkidle0'} |
|
|
) |
|
|
const name = format( |
|
|
'%s/%s.png', |
|
|
tmpDir, |
|
|
Math.random().toString(36).slice(2) |
|
|
) |
|
|
if (/^\d$/.test(delay)) |
|
|
await setTimeout(+delay) |
|
|
await page.screenshot({ |
|
|
fullPage: full, |
|
|
path: name, |
|
|
omitBackground: true |
|
|
}) |
|
|
res.redirect(name) |
|
|
} catch (e) { |
|
|
console.error(e) |
|
|
res |
|
|
.status(500) |
|
|
.json({ |
|
|
err: true, |
|
|
msg: format(e?.message || e) |
|
|
}) |
|
|
} finally { |
|
|
await conn.browser.close() |
|
|
} |
|
|
}) |
|
|
|
|
|
const PORT = process.env.PORT || 7860 |
|
|
app.listen( |
|
|
PORT, |
|
|
() => console.log('App running on port', PORT) |
|
|
) |