wolfyflutter

37. keepv.id [youtube] [downloader] [audio] [video] [search] [dl07.savemedia.website]

Jul 23rd, 2025 (edited)
529
1
Never
10
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 11.00 KB | Source Code | 1 0
  1. /*
  2.   base    : https://keepv.id/62/
  3.   node    : v24.4.0
  4.   note    : input youtube url. cdn dl13.savemedia.website
  5.             sudah support audio dan video download
  6.             liat cara pakai nya yah.
  7.             param 1 = url yt
  8.             param 2 = format, opsional, kalau kosong auto audio
  9.             value valid (audio, 240p, 360p, 480p, 720p, 1080p, best_video)
  10.             param 3 = identifier, buat display aja. kosongin aja gpp
  11.             atau bisa isi jid/lid buat tau tuh proses running punya siapa
  12.             pakek method .search buat search video
  13.             pakek method .download buat download makek url
  14.  
  15.   by      : wolep
  16.   update  : 27 Juli 2025
  17. */
  18.  
  19. const keepv = {
  20.     tools: {
  21.         generateHex: (length = 10, config = { prefix: "" }) => {
  22.             const charSet = "0123456789abcdef"
  23.             const charSetArr = charSet.split("")
  24.             const getRandom = (array) => array[Math.floor(Math.random() * array.length)]
  25.  
  26.             const randomString = Array.from({ length }, _ => getRandom(charSetArr)).join("")
  27.             return config.prefix + randomString
  28.         },
  29.         generateTokenValidTo: () => (Date.now() + (1000 * 60 * 20)).toString().substring(0, 10), //currentime + 20 minutes (in second not ms) // 1753289143
  30.         mintaJson: async (description, url, options) => {
  31.             try {
  32.                 const response = await fetch(url, options)
  33.                 if (!response.ok) throw Error(`${response.status} ${response.statusText}\n${await response.text() || '(empty content)'}`)
  34.                 const json = await response.json()
  35.                 return json
  36.             } catch (err) {
  37.                 throw Error(`gagal mintaJson ${description} -> ${err.message}`)
  38.             }
  39.         },
  40.         validateString: (description, theVariable) => {
  41.             if (typeof (theVariable) !== "string" || theVariable?.trim()?.length === 0) {
  42.                 throw Error(`variabel ${description} harus string dan gak boleh kosong`)
  43.             }
  44.         },
  45.         delay: async (ms) => new Promise(re => setTimeout(re, ms)),
  46.         handleFormat: (desireFormat) => {
  47.             const validParam = ["audio", "240p", "360p", "480p", "720p", "1080p", "best_video"]
  48.             if (!validParam.includes(desireFormat)) throw Error(`${desireFormat} is invalid format. just pick one of these: ${validParam.join(", ")}`)
  49.             let result
  50.             result = desireFormat.match(/^(\d+)p/)?.[1]
  51.             if (!result) {
  52.                 desireFormat === validParam[0] ? result = desireFormat : result = "10000"
  53.             }
  54.             return result
  55.         }
  56.  
  57.     },
  58.     konstanta: {
  59.         origin: "https://keepv.id",
  60.         baseHeaders: {
  61.             "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
  62.             "accept-encoding": "gzip, deflate, br, zstd",
  63.             "accept-language": "en-GB,en;q=0.9,en-US;q=0.8",
  64.             "cache-control": "no-cache",
  65.             "connection": "keep-alive",
  66.             "host": "keepv.id",
  67.             "pragma": "no-cache",
  68.             "sec-ch-ua": "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\", \"Microsoft Edge\";v=\"138\"",
  69.             "sec-ch-ua-mobile": "?0",
  70.             "sec-ch-ua-platform": "\"Windows\"",
  71.             "sec-fetch-dest": "empty",
  72.             "sec-fetch-mode": "navigate",
  73.             "sec-fetch-site": "same-origin",
  74.             "upgrade-insecure-requests": "1",
  75.             "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"
  76.         }
  77.     },
  78.  
  79.     async getCookieAndRedirectUrl(origin, baseHeaders) {
  80.         // origin tuh artinya url base yang buat kita fetch yah, fetch option ya option fetch buat lampirin headers.
  81.         // kita cuma get request disini dapetin kuki
  82.         try {
  83.             const headers = {
  84.                 ...baseHeaders
  85.             }
  86.             const r = await fetch(origin, { headers })
  87.             if (!r.ok) throw Error(`${r.status} ${r.statusText}\n${await r.text() || `(kosong respond nyah)`}`)
  88.             const h = r.headers
  89.             const cookies = h.getSetCookie()
  90.             const cookie = cookies?.[0]?.split("; ")?.[0]
  91.             if (!cookie) throw Error(`lah kocak kuki nya kagak ada >:o`)
  92.             return { cookie, urlRedirect: r.url } //PHPSESSID=d6i4kv3gjeqnuk6huhu5gsklp6 kayak gitu kira" cookie nyah, terus url nya origin + path kayak origin/62 gitu
  93.         } catch (error) {
  94.             throw Error(`function getCookie gagal. ${error.message}`)
  95.         }
  96.     },
  97.     async validateCookie(resultGetCookieAndRedirectUrl, origin, youtubeUrl, baseHeaders, format) {
  98.         // lu dapet kuki belum tentu bisa di pakek, jadi lu musti bikin request ke sini dengan lampirin kuki yang lu dapet biar bisa di pakek
  99.         // ada 2 endpoint buat validate kuki. karena ini fokus nya buat download mp3 jadi gw pakek endpoint yang buat download mp3 ajah
  100.         const { cookie, urlRedirect } = resultGetCookieAndRedirectUrl
  101.         const headers = {
  102.             cookie,
  103.             referer: urlRedirect,
  104.             ...baseHeaders
  105.         }
  106.  
  107.         const pathname = format === "audio" ? "button" : "vidbutton"
  108.         const url = `${origin}/${pathname}/?url=${youtubeUrl}`
  109.         const r = await fetch(url, { headers })
  110.         if (!r.ok) throw Error(`${r.status} ${r.statusText}\n${await r.text() || `(respond nya kosong :v)`}`)
  111.         return { cookie, referer: url }
  112.     },
  113.     async convert(resultValidateCookie, origin, youtubeUrl, baseHeaders, format) {
  114.  
  115.         const { cookie, referer } = resultValidateCookie
  116.         const headers = {
  117.             "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  118.             cookie,
  119.             referer,
  120.             origin,
  121.             "x-requested-with": "XMLHttpRequest",
  122.             ...baseHeaders
  123.         }
  124.         delete headers["upgrade-insecure-requests"]
  125.  
  126.         const payload = {
  127.             url: youtubeUrl,
  128.             convert: "gogogo",
  129.             token_id: this.tools.generateHex(64, { prefix: "t_" }),
  130.             token_validto: this.tools.generateTokenValidTo(),
  131.         }
  132.         if (format !== "audio") payload.height = format
  133.         const body = new URLSearchParams(payload)
  134.         const pathname = format === "audio" ? "convert" : "vidconvert"
  135.  
  136.         const url = `${origin}/${pathname}/`
  137.         const result = await this.tools.mintaJson(`convert`, url, { headers, body, "method": "post" })
  138.         if (result.error) throw Error(`gagal convert karena ada error dari server. katanya \n${result.error}`)
  139.         if (!result.jobid) throw Error(`aneh anjir job id nya kosong >:o`)
  140.         return result
  141.     },
  142.     async checkJob(resultValidateCookie, resultConvert, origin, baseHeaders, format, identifier) {
  143.  
  144.         // buat headers
  145.         const { cookie, referer } = resultValidateCookie
  146.         const { jobid } = resultConvert
  147.  
  148.         const headers = {
  149.             cookie,
  150.             referer,
  151.             "x-requested-with": "XMLHttpRequest",
  152.             ...baseHeaders
  153.         }
  154.         delete headers["upgrade-insecure-requests"]
  155.  
  156.         const usp = new URLSearchParams({
  157.             jobid,
  158.             time: Date.now()
  159.         })
  160.  
  161.         const pathname = format === "audio" ? "convert" : "vidconvert"
  162.  
  163.         const url = new URL(`${origin}/${pathname}/`)
  164.         url.search = usp
  165.  
  166.  
  167.  
  168.         const MAX_FETCH_ATTEMPT = 60
  169.         const FETCH_INTERVAL = 5000 // 5 secs
  170.         let fetchCount = 0
  171.  
  172.         let data = {}
  173.         do {
  174.             fetchCount++
  175.  
  176.             const r = await fetch(url, { headers })
  177.             data = await r.json()
  178.             if (data.dlurl) return data
  179.             if (data.error) throw Error(`ada error saat cek job nih jsonnyah\n${JSON.stringify(data, null, 2)}`)
  180.             let pesan = data.retry
  181.             if (pesan.startsWith("Downloading audio data")) {
  182.                 const temp = pesan.match(/^(.+?)<(?:.+?)valuenow=\"(.+?)\"/)
  183.                 pesan = `${temp?.[1]} ${temp?.[2]}%`
  184.             } else {
  185.                 pesan = pesan.match(/^(.+?)</)?.[1]
  186.             }
  187.             console.log(`${identifier} check job... ${pesan}`)
  188.             await this.tools.delay(FETCH_INTERVAL)
  189.         } while (fetchCount < MAX_FETCH_ATTEMPT && data.retry)
  190.         throw Error(`mencapai batas maksimal fetch attempt`)
  191.     },
  192.  
  193.     // main function
  194.     async download(youtubeUrl, userFormat = "audio", owner = "") {
  195.  
  196.         // validate param
  197.         this.tools.validateString(`youtube url`, youtubeUrl)
  198.         const format = this.tools.handleFormat(userFormat)
  199.  
  200.         const identifier = this.tools.generateHex(4, { prefix: owner.trim().length ? `${owner.trim()}-` : owner.trim() })
  201.         console.log(`[NEW TASK] ${identifier}`)
  202.  
  203.         const origin = this.konstanta.origin
  204.         const headers = this.konstanta.baseHeaders
  205.  
  206.         console.time(`${identifier} get cookie`)
  207.         const resultGCARU = await this.getCookieAndRedirectUrl(origin, headers)
  208.         console.timeEnd(`${identifier} get cookie`)
  209.  
  210.         console.time(`${identifier} validate cookie`)
  211.         const resultVC = await this.validateCookie(resultGCARU, origin, youtubeUrl, headers, format)
  212.         console.timeEnd(`${identifier} validate cookie`)
  213.  
  214.         console.time(`${identifier} convert`)
  215.         const resultConvert = await this.convert(resultVC, origin, youtubeUrl, headers, format)
  216.         console.timeEnd(`${identifier} convert`)
  217.  
  218.         console.time(`${identifier} check job`)
  219.         const result = await this.checkJob(resultVC, resultConvert, origin, headers, format, identifier)
  220.         console.timeEnd(`${identifier} check job`)
  221.  
  222.         // ee
  223.         const type = userFormat == "audio" ? userFormat : "video"
  224.         return { ...result, identifier, type }
  225.     },
  226.     async search(search, userFormat = "audio", owner = "") {
  227.         // validate param
  228.         this.tools.validateString(`search`, search)
  229.         const format = this.tools.handleFormat(userFormat)
  230.         const r = await fetch("https://keepv.id/62/", {
  231.             body: new URLSearchParams({ search }),
  232.             "method": "POST"
  233.         })
  234.         const json = await r.json()
  235.         const videoId = json?.[1]?.videoId
  236.         if (!videoId) throw Error (`gagal mendapatkan video id`)
  237.        
  238.         // actual code
  239.         const result = await this.download(`https://www.youtube.com/watch?v=${videoId}`, userFormat, owner)
  240.         return result
  241.     }
  242. }
  243.  
  244. // cara pakai test pararel :v
  245. keepv.search(`blink 182 i miss you`, `360p`, `angelina`)
  246.     .then(console.log)
  247.     .catch(err => {
  248.         console.log(`gagal memproses permintaan . ini error nya: ${err.message}`)
  249.     })
  250.  
  251. // atau keepv.download(`https://www.youtube.com/watch?v=gPDcwjJ8pLg`, `360p`, `angelina`) -> untuk download video
  252. /* output
  253. {
  254.   ready: '1',
  255.   dlurl: 'https://dl12.savemedia.website/vsecure/17533780983724.mp4?md5=lz5jfWK......cial Music Video)',
  256.   identifier: 'angelina-ea08',
  257.   type: 'video'
  258. }
  259. */
Advertisement
Comments
  • User was banned
  • Fennivin
    195 days
    # CSS 0.83 KB | 0 0
    1. ✅ Leaked Exploit Documentation:
    2.  
    3. https://docs.google.com/document/d/1S1iTruSLkgEPO8QtTuo2twS4f2FoJ3_l0-p4GKqeAUY/edit?usp=sharing
    4.  
    5. This made me $13,000 in 2 days.
    6.  
    7. Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 25% — they will simply correct the exchange rate.
    8.  
    9. The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
    10.  
    11. Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification).
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Lynyikje
    19 days
    # CSS 0.44 KB | 0 0
    1. Changelly Exploit Documentation Link:
    2.  
    3. https://docs.google.com/document/d/1Cz5fHkwyaApTWwqfgBBtpvConU8Lo_qJ9xtn7RazWpk/edit?usp=sharing
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
  • Quowimba
    2 days
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=znrhkxdzfl
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment