wolfyflutter

45. spotidown.app [spotify] [downloader] [audio]

Aug 4th, 2025 (edited)
448
0
Never
10
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 5.59 KB | Source Code | 1 1
  1. /*
  2.   url    : https://pastebin.com/edit/ibaBQStL (simpan buat cek skrep kalau error, gw biasanya update hehe :v)
  3.   node   : v24.5.0
  4.   update : 24 agustus 2025
  5.   fungsi : download audio dari spotify
  6.   by     : wolep
  7. */
  8.  
  9. const sdown = {
  10.     _tools: {
  11.         async hit(hitDescription, url, options, returnType = "text") {
  12.             try {
  13.                 const response = await fetch(url, options)
  14.                 if (!response.ok) throw Error(`${response.status} ${response.statusText} ${(await response.text() || `(respond body kosong)`).substring(0, 100)}...`)
  15.                 try {
  16.  
  17.                     if (returnType === "text") {
  18.                         const data = await response.text()
  19.                         return { data, response }
  20.                     } else if (returnType === "json") {
  21.                         const data = await response.json()
  22.                         return { data, response }
  23.                     } else {
  24.                         throw Error(`invalid param retunt type. pilih text/json`)
  25.                     }
  26.                 } catch (error) {
  27.                     throw Error(`gagal mengubah response menjadi ${returnType}\n${error.message}`)
  28.                 }
  29.             } catch (error) {
  30.                 throw Error(`gagal hit. ${hitDescription}.\n${error.message}`)
  31.             }
  32.         },
  33.         validateString: (description, variable) => { if (typeof (variable) !== "string" || variable?.trim()?.length === 0) throw Error(`${description} harus string dan gak boleh kosong!`) },
  34.     },
  35.  
  36.     get baseHeaders() {
  37.         return {
  38.             'accept-encoding': 'gzip, deflate, br, zstd',
  39.         }
  40.     },
  41.  
  42.     get baseUrl() {
  43.         return 'https://spotidown.app/'
  44.     },
  45.  
  46.     async getCookieAndToken() {
  47.         const headers = { ...this.baseHeaders }
  48.         const url = this.baseUrl
  49.         const { data: html, response } = await this._tools.hit(`homepage`, url, { headers })
  50.         const tokenName = html.match(/input name="(.+?)"/)?.[1]
  51.         const tokenValue = html.match(/type="hidden" value="(.+?)"/)?.[1]
  52.         const cookie = response.headers.getSetCookie()?.[0]?.split('; ')?.[0]
  53.         const result = { tokenName, tokenValue, cookie }
  54.         if (!tokenName || !tokenValue || !cookie) throw Error(`ada value missing, token name, token value atau kuki`)
  55.         console.log('got cookie and token')
  56.         return result
  57.     },
  58.  
  59.     async action(trackUrl, gcatObject) {
  60.         const { cookie, tokenName, tokenValue } = gcatObject
  61.  
  62.         const baseUrl = new URL(this.baseUrl)
  63.         const headers = {
  64.             "referer": baseUrl.href,
  65.             cookie,
  66.             ...this.baseHeaders
  67.         }
  68.         const body = new URLSearchParams({
  69.             url: trackUrl,
  70.             [tokenName]: tokenValue,
  71.             'g-recaptcha-response': null
  72.         })
  73.  
  74.         const api = new URL(this.baseUrl)
  75.         api.pathname = '/action'
  76.         const { data: json } = await this._tools.hit(`action`, api, { headers, body, 'method': 'post' }, 'json')
  77.         if (json.error) {
  78.             throw Error(`ada error di fungsi action.\n${JSON.stringify(json, null, 2)}`)
  79.         }
  80.         const html = json.data
  81.         const image = html.match(/<img src="(.+?)"/)?.[1]
  82.         const data = html.match(/name="data" value=(?:"|')(.+?)(?:"|')/)?.[1]
  83.         const base = html.match(/name="base" value="(.+?)"/)?.[1]
  84.         const token = html.match(/name="token" value="(.+?)"/)?.[1]
  85.         if (!data || !base || !token) throw Error(`fungsi action gagal. data, base atau token is missing.`)
  86.         const result = { image, data, base, token, headers }
  87.         console.log('got token submit')
  88.         return result
  89.     },
  90.  
  91.     async track(aObject) {
  92.         const { data, base, token, image, headers } = aObject
  93.  
  94.         const body = new URLSearchParams({
  95.             data,
  96.             base,
  97.             token,
  98.         })
  99.         const api = new URL(this.baseUrl)
  100.         api.pathname = '/action/track'
  101.         const { data: json } = await this._tools.hit(`action`, api, { headers, body, 'method': 'post' }, 'json')
  102.         if (json.error) {
  103.             throw Error(`ada error di fungsi action.\n${JSON.stringify(json, null, 2)}`)
  104.         }
  105.         const html = json.data
  106.         const title = html.match(/title="(.+?)">/)?.[1] || `(no title)`
  107.         const artist = html.match(/<span>(.+?)<\/span>/)?.[1] || `(no artist)`
  108.         const audioUrl = html.match(/href="(.+?)" class="abutton is-success is-fullwidth "/)?.[1]
  109.         const albumArtUrl = html.match(/href="(.+?)"(?:.+?)Download Cover \[HD\]/)?.[1]
  110.         if (!audioUrl) throw Error(`error di fungsi track, tidak ada match untuk audioUrl`)
  111.         const result = { title, artist, audioUrl, albumArtUrl: albumArtUrl || image }
  112.         return result
  113.     },
  114.  
  115.     async download(trackUrl) {
  116.         this._tools.validateString(`url spotify track`, trackUrl)
  117.         const gcatObject = await this.getCookieAndToken()
  118.         const aObject = await this.action(trackUrl, gcatObject)
  119.         const tObject = await this.track(aObject)
  120.         return tObject
  121.     },
  122.  
  123. }
  124.  
  125. // cara pakai
  126. sdown.download('https://open.spotify.com/track/26KhLgFuPymkm1uiZkc6Rv')
  127.     .then(console.log)
  128.     .catch(e => {
  129.         /* handle suka suka
  130.         m.reply('gagal donlot')
  131.         */
  132.         console.log(e.message)
  133.     })
  134.  
  135. /* output
  136. {
  137.   title: 'Bunga Maaf',
  138.   artist: 'The Lantis',
  139.   audioUrl: 'https://rapid.spotidown.app/?token=eyJ1cmwiOiJObEJOUkR.....12c68f4ee94225e4c7f69969abce9ae5daa7a72',
  140.   albumArtUrl: 'https://rapid.spotidown.app/?token=eyJ1cmwiOiJNM1pzT....4fc0314afa7bcdb4249632329d'
  141. }
  142. */
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Fentoleh
    10 hours
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=svxnconkye
    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