Advertisement
Guest User

Untitled

a guest
Feb 7th, 2021
1,540
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Tiktok-Downloader
  3. // @version      1.0.2
  4. // @description  tiktok.com Video Downloader
  5. // @match        https://www.tiktok.com/*
  6. // @match        https://tiktok.com/*
  7. // @grant        GM_download
  8. // @grant        GM_addStyle
  9. // @grant        GM_xmlhttpRequest
  10. // @connect      tiktok.com
  11. // @connect      api-t2.tiktokv.com
  12. // @icon         https://s16.tiktokcdn.com/musical/resource/wap/static/image/logo_144c91a.png?v=2
  13. // @original     https://greasyfork.org/users/209098
  14. // @license      MIT
  15. // ==/UserScript==
  16.  
  17. (function () {
  18.     'use strict'
  19.  
  20.     GM_addStyle(
  21.         "#anastasia-i-love-u { position: absolute;  top: 20px; left: 20px; z-index: 9001; width: 48px; height: 48px; opacity: 0.95; font-size: 15px; line-height: 50%; border: none; " +
  22.         "background: #545454; color: #FFF; cursor: pointer; border-radius: 100%; transition: opacity 0.4s; } #anastasia-i-love-u:disabled { opacity: 0.01; background-color: #c0392b; } " +
  23.         ".vid_height_add { top: 78px !important; width: 40px !important; height: 40px !important;}"
  24.     );
  25.  
  26.     GM_addStyle(".logo { display: none !important; } .mute-icon { opacity: 1 !important; } ");
  27.  
  28.     /*///////////////////////////////////
  29.           WORKING AS OF 07/02/2021
  30.     /*///////////////////////////////////
  31.     function generateBase62(length) {
  32.         var i = 0, r = "", base62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  33.         while (i < length) {
  34.             r += base62.charAt(Math.floor(Math.random() * 62));
  35.             i++;
  36.         }
  37.         return r;
  38.     }
  39.  
  40.     function generateDeviceId() {
  41.         var i = 1, a = new Array(19); //Math.floor(Math.random() * 9) + 11
  42.         a[0] = 54; //Math.floor(Math.random() * 9) + 49
  43.         while (i < a.length) {
  44.             a[i++] = Math.floor(Math.random() * 10) + 48;
  45.         }
  46.         return String.fromCharCode.apply(null, a);
  47.     }
  48.  
  49.     function getAPIData(ID) {
  50.         const d = new Date();
  51.         const t = d.getTime() - d.getTimezoneOffset() * 60000;
  52.         const deviceVersion = generateBase62(8);
  53.         const deviceId = generateDeviceId();
  54.         const iId = generateDeviceId();
  55.         const url = "https://api-t2.tiktokv.com/aweme/v1/multi/aweme/detail/?aweme_ids="
  56.         + "[" + ID + "]"
  57.         + "&region=US"
  58.         + "&ts=" + Math.floor(t / 1000)
  59.         + "&timezone_name=Etc%2FGMT"
  60.         + "&device_type=Pixel%20" + deviceVersion
  61.         + "&iid=" + iId
  62.         + "&locale=en"
  63.         + "&app_type=normal"
  64.         + "&resolution=1080*1920"
  65.         + "&aid=1180"
  66.         + "&app_name=musical_ly"
  67.         + "&_rticket=" + t
  68.         + "&device_platform=android"
  69.         + "&version_code=100000"
  70.         + "&dpi=441"
  71.         + "&cpu_support64=false"
  72.         + "&sys_region=US"
  73.         + "&timezone_offset=0"
  74.         + "&device_id=" + deviceId
  75.         + "&pass-route=1"
  76.         + "&device_brand=google"
  77.         + "&os_version=8.0.0"
  78.         + "&op_region=US"
  79.         + "&app_language=en"
  80.         + "&pass-region=1"
  81.         + "&language=en"
  82.         + "&channel=googleplay"
  83.         console.log(url);
  84.  
  85.         GM_xmlhttpRequest({
  86.             method:     "GET",
  87.             url:        url,
  88.             headers:    {
  89.                 "User-Agent": "okhttp"
  90.             },
  91.             onload:  downloadLink
  92.         });
  93.     }
  94.  
  95.     function downloadLink(dat) {
  96.         const downloadBtn = document.getElementById('anastasia-i-love-u');
  97.         if (!downloadBtn) return;
  98.  
  99.         try {
  100.             dat = JSON.parse(dat.responseText);
  101.             const ID = dat.aweme_details[0].aweme_id
  102.  
  103.             dat = dat.aweme_details[0].video.play_addr.url_list
  104.             dat = dat[dat.length - 1]
  105.                 .replace("improve_bitrate=0", "improve_bitrate=1")
  106.                 .replace(/ratio=\d+p/i, "ratio=default");
  107.  
  108.             const fileName = `${ID}.mp4`;
  109.             GM_download({
  110.                 url: dat,
  111.                 name: fileName,
  112.                 headers:    {
  113.                     "User-Agent": "okhttp"
  114.                 },
  115.                 onload: setTimeout(() => { downloadBtn.disabled = !1; }, 2000)
  116.             });
  117.  
  118.         }
  119.         catch(e) { console.log(e); return; }
  120.     }
  121.  
  122.     function addDownloadButton(videoCardTag) {
  123.         if (document.getElementById('anastasia-i-love-u')) return;
  124.  
  125.         const downloadBtn = document.createElement('button');
  126.         downloadBtn.innerHTML = '▼';
  127.         downloadBtn.id = 'anastasia-i-love-u';
  128.         if (document.querySelector(".trending-title")) {
  129.             downloadBtn.classList.add('vid_height_add');
  130.         }
  131.  
  132.         downloadBtn.onclick = () => {
  133.             downloadBtn.disabled = !0;
  134.             const vidId = document.location.href.match(/video\/(6\d+)/i)[1];
  135.             getAPIData(vidId);
  136.         }
  137.  
  138.         videoCardTag
  139.             .parentNode
  140.             .appendChild(downloadBtn);
  141.     }
  142.  
  143.     const bodyObserver = new MutationObserver(() => {
  144.         const card = document.querySelector('.video-card-browse > video');
  145.         card && addDownloadButton(card);
  146.     });
  147.  
  148.     bodyObserver.observe(document.body, {
  149.         childList: !0,
  150.         subtree: !0,
  151.         attributes: !1
  152.     });
  153.  
  154.  
  155. })();
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement