Greasy Fork

TikTok Magic (simples e dinâmico)

Baixe vídeos sem logo/marca d'água com apenas um clique, diretamente do tiktok. Mais recursos em breve.

当前为 2024-02-10 提交的版本,查看 最新版本

// ==UserScript==
// @name            TikTok Magic (simples e dinâmico)
// @namespace       https://linkme.bio/jhonpergon/?userscript=tiktok_tools
// @version         1.1
// @author          Jhon Pérgon
// @description     Baixe vídeos sem logo/marca d'água com apenas um clique, diretamente do tiktok. Mais recursos em breve.

// @name:pt        TikTok Magic (simples e dinâmico)
// @name:pt-BR     TikTok Magic (simples e dinâmico)
// @name:pt-PT     TikTok Magic (simples e dinâmico)

// @description:pt        Baixe vídeos sem logo/marca d'água com apenas um clique, diretamente do tiktok. Mais recursos em breve.
// @description:pt-BR        Baixe vídeos sem logo/marca d'água com apenas um clique, diretamente do tiktok. Mais recursos em breve.
// @description:pt-PT        Baixe vídeos sem logo/marca d'água com apenas um clique, diretamente do tiktok. Mais recursos em breve.

// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue

// @license        MIT
// @match          https://*.tiktok.com/*
// @icon           https://cdn.iconscout.com/icon/free/png-256/free-tiktok-4069944-3365463.png

// @compatible      chrome
// @compatible      firefox
// @compatible      opera
// @compatible      edge
// @compatible      safari
// @compatible      berrybrowser
// ==/UserScript==

(function() {
    'use strict';

  let contagemK = 0;

  function addBToks(){

    // Criação do elemento <a>
    var linkElement = document.createElement('a');
    linkElement.setAttribute('href', '#');
    linkElement.setAttribute('class', 'linkTok');
    linkElement.setAttribute('target', '_blank');

    if(GM_getValue("statusVideo") == true && contagemK == 0){
      GM_setValue("statusVideo", false);
      linkElement.addEventListener('click', function() {
          setTimeout(() => {
              window.close(); // Fecha a aba após iniciar o download
          }, 1800);
      });
    }

    // Criação do elemento <button>
    var buttonElement = document.createElement('button');
    buttonElement.setAttribute('data-e2e', 'arrow-right');
    buttonElement.setAttribute('title', 'download magic');
    buttonElement.setAttribute('role', 'button');
    buttonElement.setAttribute('aria-label', 'Download Limpo');
    buttonElement.setAttribute('class', 'tiktokDL');

    // Criação do elemento <svg>
    var svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svgElement.setAttribute('width', '26');
    svgElement.setAttribute('height', '26');
    svgElement.setAttribute('viewBox', '0 0 48 48');
    svgElement.setAttribute('fill', '#fff');
    svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
    svgElement.setAttribute('style', '--darkreader-inline-fill: #d7d5d1;');

    // Criação do elemento <path> dentro do <svg>
    var pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');
    pathElement.setAttribute('d', 'M21.9 7.38v19.86l-6.73-6.73a.87.87 0 0 0-1.24 0l-1.73 1.73a.88.88 0 0 0 0 1.24l11.18 11.18c.34.35.9.35 1.24 0L35.8 23.48a.88.88 0 0 0 0-1.24l-1.73-1.73a.87.87 0 0 0-1.24 0l-6.73 6.73V7.38c0-.49-.4-.88-.87-.88h-2.45c-.49 0-.88.4-.88.88ZM10.88 37.13c-.49 0-.88.39-.88.87v2.63c0 .48.4.87.88.87h26.24c.49 0 .88-.4.88-.87V38c0-.48-.4-.87-.87-.87H10.86Z');

    svgElement.appendChild(pathElement);
    buttonElement.appendChild(svgElement);
    linkElement.appendChild(buttonElement);

    var styleElement1 = document.createElement('style');
    styleElement1.innerHTML = `
        .tiktokDL{
            position: absolute;
            z-index: 1;
            display: flex;
            -moz-box-pack: center;
            justify-content: center;
            -moz-box-align: center;
            align-items: center;
            background: rgba(84, 84, 84, 0.5);
            border-radius: 50%;
            cursor: pointer;
            border: medium;
            outline: none;
            width: 40px;
            height: 40px;
            top: calc(50% + 62px);
            margin-top: -24px;
            right: 20px;
            z-index: 10;
        }
    `;
    var styleElement2 = document.createElement('style');
    styleElement2.innerHTML = `
        .tiktokDL{
            position: absolute;
            z-index: 1;
            display: flex;
            -moz-box-pack: center;
            justify-content: center;
            -moz-box-align: center;
            align-items: center;
            background: rgba(84, 84, 84, 0.5);
            border-radius: 50%;
            cursor: pointer;
            border: medium;
            outline: none;
            width: 40px;
            height: 40px;
            top: calc(50% + -262px);
            margin-top: -24px;
            right: 20px;
            z-index: 10;
        }
    `;


    if(document.querySelector(".css-1s9jpf8-ButtonBasicButtonContainer-StyledVideoSwitch.e11s2kul11")){
      // Selecionar o elemento com a classe específica
      document.head.appendChild(styleElement1);
      const targetElement = document.querySelector('.css-1s9jpf8-ButtonBasicButtonContainer-StyledVideoSwitch.e11s2kul11');
      targetElement.insertAdjacentElement('afterend', linkElement);
    }else if(document.querySelector(".css-ty9aj4-DivVideoContainer.eqrezik7")){
      document.head.appendChild(styleElement2);
      const targetElement = document.querySelector('.css-ty9aj4-DivVideoContainer.eqrezik7');
      targetElement.insertAdjacentElement('afterend', linkElement);
    }else{
      document.head.appendChild(styleElement1);
      document.querySelector("#app-header").appendChild(linkElement);
    }

  }


    // Armazena o valor após a última "/" no endereço do site
    var lastSegment = window.location.pathname.split('/').filter(function(segment) {
        return segment !== '';
    }).pop();

    function minhaFuncao() {
        console.log('O valor após a última "/" mudou para:', lastSegment);

        if(document.querySelector(".linkTok")){
          document.querySelector(".linkTok").remove();
        }

        if(window.location.href.includes("/video/")){
          addBToks();
          const videoTikTok = document.querySelector('video');
          if (videoTikTok && videoTikTok.src.includes("-prime.tiktok.com/video/")) {
              const videoSrc = videoTikTok.src;
              document.querySelector(".linkTok").href = videoSrc;
          } else {
              /*let cancellLink = document.querySelector(".linkTok");
                cancellLink.addEventListener('click', function(event) {
                event.preventDefault();
              });*/
              const linkTokElement = document.querySelector('.tiktokDL');
              linkTokElement.addEventListener('click', function() {
                  GM_setValue("statusVideo", true);
                  alert('A mágica falhou. Clique para baixar de novo na próxima aba.');
                  //window.location.reload();
             });
          }
        }
    }

    // Monitora as mudanças no valor após a última "/"
    function tokChck() {
        var newLastSegment = window.location.pathname.split('/').filter(function(segment) {
            return segment !== '';
        }).pop();

        // Se o valor mudou, chama a função
        if (lastSegment !== newLastSegment) {
            lastSegment = newLastSegment;
            contagemK++;
            minhaFuncao();
        }
    };


    if(window.location.href.includes("-prime.tiktok.com/video/")){
      const videoElement = document.querySelector('video');

        if (videoElement) {
            videoElement.pause();
            const videoSrc = videoElement.src;
            const uniqueId = Math.floor(Math.random() * 10000); // Gera um ID único com quatro números
            const downloadFileName = `TikTok-Bruxo_${uniqueId}.mp4`;
            const downloadLink = document.createElement('a');
            downloadLink.href = videoSrc;
            downloadLink.download = downloadFileName;

            downloadLink.addEventListener('click', () => {
                setTimeout(() => {
                    window.close(); // Fecha a aba após iniciar o download
                }, 1300); // Defina um intervalo de tempo suficiente para o download começar
            });
            downloadLink.click();

        } else {
            console.log('Elemento de vídeo não encontrado.');
        }
    }else{
      setTimeout(function(){
        minhaFuncao();
        setInterval(tokChck, 1500)
      },2500)
    }



  function carregarStatus() {
      const statusTK = GM_getValue("statusVideo");
      if (statusTK) {
        if(GM_getValue("statusVideo") == true){
          if(contagemK == 0){
            var dwstyle = document.createElement('style');
            dwstyle.innerHTML = `
                .tiktokDL{
                    border: 1px solid transparent;
                    animation: picbord .5s infinite;
                }
                @keyframes picbord {
                    0% {
                        border: 1px solid transparent;
                    }
                    100% {
                        border: 1px solid lightgreen;
                    }
                }
            `;
            document.head.appendChild(dwstyle);
          }
        }
      }else{
         GM_setValue("statusVideo", false);
      }
  }

  carregarStatus();

})();