Douyin_Kuaishou_Downloader

Download douyin and kuaishou video without watermark

// ==UserScript==
// @name         Douyin_Kuaishou_Downloader
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Download douyin and kuaishou video without watermark
// @author       gu0o00
// @include      https://www.iesdouyin.com/*
// @include      https://video.kuaishou.com/*
// @grant        GM_download
// @grant        GM_xmlhttpRequest
// ==/UserScript==

const MobileUA =
      "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";

function main() {
    const currUrl = location.href;
    if (currUrl.indexOf("kuaishou") != -1){
        solveKuaishou();
    }
    else if(currUrl.indexOf("douyin") != -1){
        solveDouyin();
    }
}
function solveKuaishou(){
    console.log("ks");
    const match = location.href.match(/featured\/(\w*)/);
    const id = match[1];

    if (!id) return;

    var json = {"operationName":"visionVideoDetail","variables":{"photoId":id,"page":"selected"},
                "query":"query visionVideoDetail($photoId: String, $type: String, $page: String) {  visionVideoDetail(photoId: $photoId, type: $type, page: $page) { status type author { id name headerUrl} photo { id caption coverUrl photoUrl }}}"};
    //console.log("-->" + JSON.stringify(json));
    GM_xmlhttpRequest({
        method: "POST",
        url: "https://video.kuaishou.com/graphql",
        data:JSON.stringify(json),
        headers: {"content-type": "application/json"},
        onload: function(response){
            //console.log("请求成功");
            var resp = response.responseText;
            //console.log("-->" + resp);
            var obj = JSON.parse(resp);
            var downUrl = obj.data.visionVideoDetail.photo.photoUrl;
            console.log("downUrl:" + downUrl);
            var file = obj.data.visionVideoDetail.photo.caption.replace("\n","").trim() + ".mp4"
            addDownloadButton(downUrl,file);
        },
        onerror: function(response){
            console.log("请求失败");
        }
    });
    return;
}
function solveDouyin(){
    console.log("douyin");
    const match = location.href.match(/share\/video\/(\d*)/);
    const id = match[1];

    if (!id) return;

    fetch("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=" + id)
        .then((res) => res.json())
        .then((json) => {
        console.log("[DouyinDownloader]", json);
        const info = json.item_list[0];
        const url = info.video.play_addr.url_list[0].replace("playwm", "play");
        const file = (info.desc || id) + ".mp4";
        addDownloadButton(url, file);
    });
}
function addDownloadButton(url, file) {

    const buttonEl = document.createElement("button");
    buttonEl.textContent = "Download";
    document.body.appendChild(buttonEl);

    buttonEl.style.position = 'fixed'
    buttonEl.style.zIndex = '10000'
    buttonEl.style.top = '0'
    buttonEl.style.left = '0'
    buttonEl.style.width = '100%'
    buttonEl.style.height = '60px'

    buttonEl.addEventListener("click", () => {
        GM_download({
            url: url,
            headers: {
                "user-agent": MobileUA,
            },
            name: file,
        });
    });
}

main();