up / index.js
aripbae's picture
Update index.js
ce0afca verified
import { format as formatBytes } from 'bytes'
import express from 'express'
import { fileTypeFromBuffer } from 'file-type'
import morgan from 'morgan'
import pg from 'puppeteer-ghost'
import * as prb from 'puppeteer-real-browser'
import serveIndex from 'serve-index'
import { spawn } from 'node:child_process'
import { promises as fsp } from 'node:fs'
import { tmpdir } from 'node:os'
import { env } from 'node:process'
import { setTimeout } from 'node:timers/promises'
import { format } from 'node:util'
const app = express()
app.enable('trust proxy')
const limitSize = '1000mb'
app.set('json spaces', 2)
app.use(express.json({ limit: limitSize }))
app.use(express.urlencoded({
extended: true,
limit: limitSize
}))
app.use(morgan('dev'))
const tmpDir = tmpdir()
app.use(
tmpDir,
express.static(tmpDir),
serveIndex(
tmpDir,
{ hidden: true, icons: true }
)
)
const isBase64 = (str) => {
try {
return btoa(atob(str)) === str
} catch {
return false
}
}
app.all('/', async (req, res) => {
try {
if (req.method !== 'POST') return res
.status(405)
.json({ msg: 'Hello World' })
const { file } = req.body
if (!isBase64(file)) return res
.status(400)
.json({
err: true,
msg: 'Bad Request'
})
const buffer = Buffer.from(file, 'base64')
const {
mime = 'application/octet-stream',
ext = 'bin'
} = await fileTypeFromBuffer(buffer) || {}
const name = format(
'%s/%s-%s.%s',
tmpDir,
mime.split('/')[0],
Math.random().toString(36).slice(2),
ext
)
await fsp.writeFile(name, buffer)
const bytes = buffer.length
res.json({
name: name.split('/').pop(),
size: {
bytes,
readable: formatBytes(
bytes,
{ unitSeparator: ' ' }
),
},
type: { mime, ext },
url: format(
'%s://%s',
req.protocol,
req.host + name
)
})
} catch (e) {
console.error(e)
res
.status(500)
.json({
err: true,
msg: format(e?.message || e)
})
}
})
app.get('/dl', async (req, res) => {
const { url } = req.query
if (!url) return res.redirect('/')
const api = format(
'https://ochinpo-helper.hf.space/mediafire?url=%s',
url
)
try {
const json = await (await fetch(api)).json()
const { result } = json
const target = format(
'%s/%s',
tmpDir,
result.filename
)
const cmds = [
'/shell?cmd=wget', '%s', '-O', '"%s"',
'--header="cookie: %s"','&&',
'unzip', '"%s"', '-d', '%s'
]
const route = format(
cmds.join(' '),
result.download,
target,
result.cookie,
target,
target.replace('.zip', '')
)
res.set('user-agent', env.UA)
res.redirect(route)
} catch (e) {
console.error(e)
res
.status(500)
.json({
err: true,
msg: format(e?.message || e)
})
}
})
app.get(
'/shell',
(req, res, next) =>
req.get('user-agent') != env.UA ?
res.redirect('/') :
next(),
async (req, res) => {
req.query.cmd ||= 'w'
const [cmd, ...args] = req
.query
.cmd
.trim()
.split(' ')
const file = format(
'%s/%s.log',
tmpDir,
Date.now()
)
const log = await fsp.open(file, 'w+')
const child = spawn(
cmd,
args,
{
detached: true,
env: Object.assign(
env,
{ FORCE_COLOR: '0' }
),
shell: true,
stdio: ['ignore', log, log]
}
)
child.unref()
res.redirect(file)
}
)
const executablePath = env.CHROME_BIN
app.get('/ss', async (req, res) => {
const {
delay = 0,
full = false,
mode = 'ghost',
transparent = false,
url = 'https://example.com'
} = req.query
if (String(url).includes('whatsapp.com'))
return res.redirect('/')
const isGhost = /^ghost$/i.test(mode)
const ctx = isGhost ?
await pg.launch({
executablePath,
headless: 'new'
}) :
await prb.connect({
customConfig: { executablePath },
disableXvfb: true,
headless: 'new',
turnstile: true
})
try {
const page = isGhost ?
await ctx.newPage() :
ctx.page
await page.goto(
url,
{ waitUntil: 'networkidle0'}
)
const name = format(
'%s/%s.png',
tmpDir,
Math.random().toString(36).slice(2)
)
if (/^\d$/.test(delay) && delay > 0)
await setTimeout(+delay)
await page.screenshot({
fullPage: full,
path: name,
omitBackground: transparent
})
res.redirect(name)
} catch (e) {
console.error(e)
res
.status(500)
.json({
err: true,
msg: format(e?.message || e)
})
} finally {
await (isGhost ? ctx : ctx.browser).close()
}
})
const PORT = env.SERVER_PORT || env.PORT || 7860
app.listen(
PORT,
() => console.log('App running on port', PORT)
)