Greasy Fork

Greasy Fork is available in English.

TikTok Video Save As (Full HD) + photo link redirect

Save TikTok video as a file with the video ID and username as the file name when middle-clicked or Alt+Right Clicked

当前为 2024-06-18 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         TikTok Video Save As (Full HD) + photo link redirect
// @namespace    http://tampermonkey.net/
// @version      0.9.4
// @description  Save TikTok video as a file with the video ID and username as the file name when middle-clicked or Alt+Right Clicked
// @match        https://www.tiktok.com/@*
// @match        tiktok.com/@*
// @match        https://discord.com/channels/*
// @grant        GM_xmlhttpRequest
// @grant        GM_openInTab
// @icon         https://tikwm.com/favicon.ico
// ==/UserScript==

(function() {
  'use strict';
  var tikTokVideoIdRegex = /\/video\/(\d+)(\/|$)/;
  var discordTikTokUrlRegex = /https:\/\/www.tiktok.com\/(\w+)\/video\/(\d+)/;
  var tikTokPhotoIdRegex = /\/@[\w.]+\/photo\/(\d+)/;

  document.addEventListener('auxclick', function(event) {
    if (event.button === 1 || (event.button === 2 && event.altKey)) { // middle click or Alt+Right Click
      var link = event.target.closest('a');
      if (link && link.href) {
        var tikTokVideoIdMatch = link.href.match(tikTokVideoIdRegex);
        var discordTikTokUrlMatch = link.href.match(discordTikTokUrlRegex);
        var tikTokPhotoIdMatch = link.href.match(tikTokPhotoIdRegex);
        if (tikTokVideoIdMatch) {
          var videoId = tikTokVideoIdMatch[1];
          var username = link.href.match(/\/@([\w.]+)/)[1];
          var newUrl = `https://tikwm.com/video/media/hdplay/${videoId}.mp4`; // Replace with your new link
          var fileName = `${videoId} @${username}.mp4`; // Change made here
          downloadFile(newUrl, fileName);
          event.stopPropagation();
          event.preventDefault();
          return false;
        } else if (discordTikTokUrlMatch) {
          // Handle Discord's URL pattern
          var videoId = discordTikTokUrlMatch[2];
          var username = discordTikTokUrlMatch[1];
          var newUrl = `https://tikwm.com/video/media/hdplay/${videoId}.mp4`; // Replace with your new link
          var fileName = `${videoId} @${username}.mp4`; // Change made here
          downloadFile(newUrl, fileName);
          event.stopPropagation();
          event.preventDefault();
          return false;
        } else if (tikTokPhotoIdMatch) {
          var photoId = tikTokPhotoIdMatch[1];
          var tikwmUrl = `https://tikwm.com/video/${photoId}.html`;
          GM_openInTab(tikwmUrl, {active: false});
          event.stopPropagation();
          event.preventDefault();
          return false;
        }
      }
    }
  });

  function downloadFile(url, fileName) {
    GM_xmlhttpRequest({
      method: 'GET',
      url: url,
      responseType: 'arraybuffer',
      onload: function(response) {
        var blob = new Blob([response.response], {type: 'video/mp4'});
        var url = URL.createObjectURL(blob);
        var a = document.createElement('a');
        a.href = url;
        a.download = fileName;
        a.click();
      },
      onerror: function(response) {
        console.error('Error downloading file:', response.status, response.statusText);
      }
    });
  }
})();