Skip to content

Commit

Permalink
Fix Savefrom #84
Browse files Browse the repository at this point in the history
  • Loading branch information
BochilGaming committed Aug 19, 2023
1 parent ad44039 commit f1b2c90
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 89 deletions.
15 changes: 9 additions & 6 deletions packages/scraper-sosmed/src/savefrom.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import got from 'got'
import vm from 'vm'
import { SaveFromArgsSchema, Savefrom, SaveFromSchema } from '../types/index.js'
import { generateSavefromParams } from '../utils/savefrom.js'

export default async function savefrom (url: string): Promise<Savefrom[]> {
SaveFromArgsSchema.parse(arguments)

let scriptJS = await got('https://worker.sf-tools.com/savefrom.php', {
let scriptJS = await got('https://worker.savefrom.net/savefrom.php', {
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded',
Expand All @@ -22,12 +23,14 @@ export default async function savefrom (url: string): Promise<Savefrom[]> {
country: 'id',
os: 'Windows',
browser: 'Chrome',
channel: ' main',
'sf-nomad': 1
channel: 'main',
'sf-nomad': 1,
url,
...generateSavefromParams(url)
}
}).text()
const executeCode = '[]["filter"]["constructor"](b).call(a);'
if (scriptJS.indexOf(executeCode) === -1) throw new Error(`Cannot find execute code\n${scriptJS}`)
if (scriptJS.indexOf(executeCode) === -1) throw new Error(`Cannot find executable code\n${scriptJS}`)
scriptJS = scriptJS.replace(executeCode, `
try {const script = ${executeCode.split('.call')[0]}.toString();if (script.includes('function showResult')) scriptResult = script;else (${executeCode.replace(/;/, '')});} catch {}
`)
Expand All @@ -50,8 +53,8 @@ try {const script = ${executeCode.split('.call')[0]}.toString();if (script.inclu
json = [JSON.parse(data.split(');')[0])]
}
} catch (e) {
json = null
console.error(e)
}
if (!json?.length) throw new Error(`Cannot parse data ("${data}") from\n"${context.scriptResult}"`)
if (!json! || !json.length) throw new Error(`Cannot parse data ("${data}") from\n"${context.scriptResult}"`)
return json.map(v => SaveFromSchema.parse(v))
}
143 changes: 64 additions & 79 deletions packages/scraper-sosmed/src/youtube.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,10 @@ interface IresLinks {
export async function youtubedlv2 (url: string): Promise<YoutubeDownloader> {
YoutubeDownloaderV2ArgsSchema.parse(arguments)

const html = await got('https://yt5s.com/en32').text()
const html = await got('https://yt5s.io/').text()
const urlAjax = (/k_url_search="(.*?)"/.exec(html) || ['', ''])[1]
const vt = (/k_page='(.*?)'/.exec(html) || ['', ''])[1]
const urlConvert = (/k_url_convert="(.*?)"/.exec(html) || ['', ''])[1]
const params: { [Key: string]: string } = {
q: url,
vt: 'home'
}
const json: {
vid: string;
title: string;
Expand All @@ -156,14 +153,16 @@ export async function youtubedlv2 (url: string): Promise<YoutubeDownloader> {
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
cookie:
'__cflb=04dToSoFRg9oqH9pYF2En9gKJK4fe8D9TcYtUD6tYu; _ga=GA1.2.1350132744.1641709803; _gid=GA1.2.1492233267.1641709803; _gat_gtag_UA_122831834_4=1',
origin: 'https://yt5s.com',
origin: 'https://yt5s.io',
'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
},
searchParams: new URLSearchParams(Object.entries(params) as [string, string][])
form: {
q: url,
vt
}
}).json()
console.log(json)
const video: YoutubeVideoOrAudio = {}
Object.values(json.links.mp4).forEach(({ k, size }: IresLinks) => {
video[k] = {
Expand Down Expand Up @@ -245,89 +244,75 @@ export async function convert (
return YoutubeConvertSchema.parse(json.dlink)
}

export function convertv2 (
export async function convertv2 (
url: string,
v_id: string,
ftype: string,
fquality: string,
token: string,
timeExpire: number,
fname: string
): Promise<string> {
return new Promise<string>(async (resolve, reject) => {
const params: { [Key: string]: string | number } = {
v_id,
ftype,
fquality,
token,
timeExpire,
client: 'yt5s.com'
}
const resServer: { c_server?: string; d_url?: string; c_status: string } =
await got(url, {
method: 'POST',
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
origin: 'https://yt5s.com',
referer: 'https://yt5s.com/',
'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
'X-Requested-Key': 'de0cfuirtgf67a'
},
form: params
}).json()
const server = resServer.c_server
if (!server && ftype === 'mp3') return resolve(server || resServer.d_url || '')
const payload: { [Key: string]: string | number } = {
) {
console.log({
v_id,
ftype,
fquality,
token,
timeExpire,
client: 'yt5s.io'
})

const form = new FormData()
form.append('v_id', v_id)
form.append('ftype', ftype)
form.append('fquality', fquality)
form.append('token', token)
form.append('timeExpire', timeExpire)
form.append('client', 'yt5s.io')

const json = await got.post(url, {
headers: {
Accept: '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
origin: 'https://yt5s.io',
referer: 'https://yt5s.io/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
'X-Requested-Key': 'de0cfuirtgf67a'
},
json: {
v_id,
ftype,
fquality,
token,
timeExpire,
client: 'yt5s.io'
}
}).json<{
c_server: string
c_status: string
}>()
console.log({ json })
if (json.c_status !== 'ok') {
throw new Error(`Error in converting!. Got ${JSON.stringify(json)}`)
}
const json2 = await got.post(`${json.c_server}/api/json/convert`, {
headers: {
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
origin: 'https://yt5s.io',
referer: 'https://yt5s.io/',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
},
form: {
v_id,
ftype,
fquality,
fname,
token,
timeExpire
}
const results: {
status: string;
jobId?: string;
statusCode: number;
result: string;
} = await got(`${server}/api/json/convert`, {
method: 'POST',
form: payload
}).json()
if (results.statusCode === 200) return resolve(results.result)
else if (results.statusCode === 300) {
try {
// @ts-ignore
const WebSocket = (await import('ws')).default
const Url = new URL(server as string)
const WSUrl = `${/https/i.test(Url.protocol) ? 'wss:' : 'ws:'}//${Url.host
}/sub/${results.jobId}?fname=yt5s.com`
const ws = new WebSocket(WSUrl, undefined, {
headers: {
'Accept-Encoding': 'gzip, deflate, br',
Host: Url.host,
Origin: 'https://yt5s.com',
'Sec-WebSocket-Extensions':
'permessage-deflate; client_max_window_bits',
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
})
ws.on('message', function incoming (message: Buffer) {
const msg: { action: string; url: string } = JSON.parse(
message.toString()
)
if (msg.action === 'success') {
try { ws.close() } catch (e) { console.error(e) }
ws.removeAllListeners('message')
return resolve(msg.url)
} else if (msg.action === 'error') return reject(msg)
})
} catch (e) {
console.error(e)
return reject(e)
}
} else return reject(results)
})
console.log({ json2 })
return json2
}
12 changes: 8 additions & 4 deletions packages/scraper-sosmed/test/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,12 @@ describe('Social media', () => {

it('Youtube downloader v2', done => {
youtubedlv2('https://youtu.be/iik25wqIuFo').then((res) => {
console.log(res)

// idk, why error if process in parallel
res.video['360p'].download().then((video) => {
console.log({ video })
res.audio['128kbps'].download().then((audio) => {
console.log({ audio })

return done()
}).catch(done)
Expand Down Expand Up @@ -157,7 +158,7 @@ describe('Social media', () => {
})

describe('Savefrom', function () {
this.timeout(5000)
this.timeout(10000)
it('Tiktok download', done => {
savefrom('https://www.tiktok.com/@omagadsus/video/7025456384175017243?is_from_webapp=1&sender_device=pc&web_id6982004129280116226').then((res) => {
for (const { hosting } of res) {
Expand Down Expand Up @@ -189,7 +190,7 @@ describe('Social media', () => {
})

it('Instagram download', done => {
savefrom('https://www.instagram.com/reel/CXK49yFLtJ_/?utm_source=ig_web_copy_link').then((res) => {
savefrom('https://www.instagram.com/reel/CulHiusJQE3/?igshid=MzRlODBiNWFlZA==').then((res) => {
for (const { hosting } of res) {
expect(hosting).to.be.eq('instagram.com')
}
Expand All @@ -199,7 +200,10 @@ describe('Social media', () => {
})

it('Instagram download #63', done => {
savefrom('https://www.instagram.com/p/CrvIUf8omdg/').then((res) => {
savefrom('https://www.instagram.com/p/CvFbwPqRxd3').then((res) => {
for (const { hosting } of res) {
expect(hosting).to.be.eq('instagram.com')
}

return done()
}).catch(done)
Expand Down
22 changes: 22 additions & 0 deletions packages/scraper-sosmed/utils/savefrom.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import * as crypto from 'crypto'

const hashed = "1aa25e742304cfd938350f98c41dfdb5546d8bbc4bfb78dd92b9061e039d69a3"

export function generateHash (url: string) {
const data = url + Date.now() + hashed
const hash = crypto.createHash('sha256')
hash.update(data)
return hash.digest('hex')
}

export function generateSavefromParams (url: string) {
const ts = Date.now()
const _tsc = 0
const _s = generateHash(url)
return {
ts,
_ts: 1692292847625,
_tsc,
_s
}
}

0 comments on commit f1b2c90

Please sign in to comment.