Greasy Fork

来自缓存

Greasy Fork is available in English.

抖音去水印视频下载-黑狗伴侣

解析web版抖音,获取抖音去水印视频下载地址,多分辨率识别。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         抖音去水印视频下载-黑狗伴侣
// @namespace    https://vt.javadev.top/
// @version      3.4.0
// @description  解析web版抖音,获取抖音去水印视频下载地址,多分辨率识别。
// @author       北封
// @match        https://www.douyin.com/video/*
// @match        https://www.douyin.com/search/*
// @require      http://greasyfork.icu/scripts/447699-spop/code/spop.js?version=1069143
// @license GPLv3
// @icon         data:image/png;base64,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
// @grant        none
// ==/UserScript==
var hgWebSocket = null;
var lockReconnect = false;  //避免ws重复连接
var defaultWsPort = 12888;
var connectSocketSucceed = false;
var sendMessageInternal;
function connectSocket() {
    try {
        hgWebSocket = new WebSocket("ws://127.0.0.1:" + defaultWsPort + "/plugin.sph-download");
        initEvent();
    } catch (e) {
        reconnect();
        // console.log(e);
        // console.log('111111')
    }
}
function suggestPort() {
    if (defaultWsPort == 12888) {
        defaultWsPort = 8899;
    } else if (defaultWsPort == 8899) {
        defaultWsPort = 12888;
    }
    return defaultWsPort;
}
//重连
function reconnect() {

    if (lockReconnect) return;
    lockReconnect = true;
    setTimeout(function () {     //没连接上会一直重连,设置延迟避免请求过多
        connectSocket();
        lockReconnect = false;
    }, 2000);
}
function closeConnectSocket() {
    hgWebSocket.close();
    connectSocketSucceed = false;
}
function initEvent() {
    //连接发生错误的回调方法
    hgWebSocket.onerror = function (e) {
        spop({
            template: '<a href="https://wcmyxpl8xu.feishu.cn/docx/doxcnUweuEbh4Vbo3h0xXgQWFCd" target="_blank" >未检测到黑狗客户端,请启动客户端</a>',// string required. Without it nothing happens!
            style: 'error',// success, warning or error
            autoclose: 150000,// miliseconds
            group: 'one-pop',
            position: 'top-right',// top-left top-center bottom-left bottom-center bottom-right
            icon: true// or false
        });
        suggestPort();
        reconnect();
        console.log("llws连接错误!");
    };

    //连接成功建立的回调方法
    hgWebSocket.onopen = function (event) {
        connectSocketSucceed = true;
        // 链接成功,消去之前的toast
        spop({
            template: '一大波狗粮在路上,汪汪~~~',// string required. Without it nothing happens!
            style: 'success',// success, warning or error
            autoclose: 2000,// miliseconds
            group: 'one-pop',
            position: 'top-right',// top-left top-center bottom-left bottom-center bottom-right
            icon: true// or false
        });
        console.log("llws连接成功!" + new Date().toLocaleString());
    }

    //接收到消息的回调方法
    hgWebSocket.onmessage = function (event) {
        console.log("llws收到消息啦:" + event.data);
        connectSocketSucceed = true;
        var data = JSON.parse(event.data);
        if (data.command == 'message') {
            spop({
                template: data.text,// string required. Without it nothing happens!
                style: 'success',// success, warning or error
                autoclose: 5000,// miliseconds
                group: 'one-pop',
                position: 'top-right',// top-left top-center bottom-left bottom-center bottom-right
                icon: true// or false
            });
        } else if (data.command == 'alert') {
            spop({
                template: data.text,// string required. Without it nothing happens!
                style: 'error',// success, warning or error
                autoclose: 15000,// miliseconds
                group: 'one-pop',
                position: 'top-right',// top-left top-center bottom-left bottom-center bottom-right
                icon: true// or false
            });
        }
        // document.getElementById('down_a_back').innerHTML='喂狗粮(自动带标题下载)'+data.text;

    }

    //连接关闭的回调方法
    hgWebSocket.onclose = function (e) {
        console.log("llws连接关闭!" + new Date().toLocaleString());
        connectSocketSucceed = false;
    }
    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function () {
        hgWebSocket.close();
    }
}


(function () {
    'use strict';
    window.autoRefresh = function autoRefresh(time){
        if(time<=0){
            time = Math.floor(Math.random() * (20000 - 3000 + 1)) + 3000;
        }
        console.log("下次执行时间间隔:"+time)
        // alert(1)
        var height = document.body.scrollHeight;
        document.scrollingElement.scrollTo(0,height +2000);
        // var autoButton = document.getElementById('auto_refresh_a_id');
        setTimeout(function () {
            var afterHeight = document.body.scrollHeight;
            if(afterHeight>height) {
                autoRefresh(Math.floor(Math.random() * (20000 - 3000 + 1)) + 3000);
            }
        },time);

    }
    window.addStyle = function addStyle(cssText) {
        let a = document.createElement('style');
        a.textContent = cssText;
        let doc = document.head || document.documentElement;
        doc.appendChild(a);
    }
    window.copyToClipboard = function copyToClipboard(content, message) {
        let $input = document.createElement('textarea')
        $input.style.opacity = '0'
        $input.value = content
        document.body.appendChild($input)
        $input.select()
        document.execCommand('copy', true)
        document.body.removeChild($input)
        $input = null
        if (message) {
            spop({
                template: message ? message : '复制成功',// string required. Without it nothing happens!
                style: 'success',// success, warning or error
                autoclose: 2000,// miliseconds
                group: 'one-pop',
                position: 'top-right',// top-left top-center bottom-left bottom-center bottom-right
                icon: true// or false
            });
        }
    }
    window.sendToHeiGouDown = function sendToHeiGouDown(url, text) {
        if ('WebSocket' in window) {
            if (!connectSocketSucceed) {
                connectSocket();
            }
            sendMessageInternal = setInterval(function () {
                if (connectSocketSucceed) {
                    var sendMessage = { 'command': 'down', 'type': 'dy_plugin', data: [{ 'url': url, 'text': text }] };
                    sendMessage = encodeURIComponent(JSON.stringify(sendMessage));
                    hgWebSocket.send(sendMessage);
                    clearInterval(sendMessageInternal);
                } else {
                    console.log('等待黑狗张嘴~');
                }
            }, 500)
        } else {
            alert('Not support websocket');
            return;
        }

    }
    var data = document.getElementById('RENDER_DATA');
    if (data) {
        addStyle(`
    .spop-container{z-index:2000;position:fixed}.spop-container,.spop-container *,.spop-container :after,.spop-container :before{box-sizing:border-box}.spop--top-left{top:0;left:0}.spop--top-left .spop{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.spop--top-center{top:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.spop--top-center .spop{-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0}.spop--top-right{top:0;right:0}.spop--top-right .spop{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.spop--center{top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.spop--center .spop{-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0}.spop--bottom-left{bottom:0;left:0}.spop--bottom-left .spop{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.spop--bottom-center{bottom:0;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.spop--bottom-center .spop{-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%}.spop--bottom-right{bottom:0;right:0}.spop--bottom-right .spop{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}@media screen and (max-width:30em){.spop--bottom-center,.spop--bottom-left,.spop--bottom-right,.spop--top-center,.spop--top-left,.spop--top-right{top:auto;bottom:0;left:0;right:0;margin-left:0;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.spop--bottom-center .spop,.spop--bottom-left .spop,.spop--bottom-right .spop,.spop--top-center .spop,.spop--top-left .spop,.spop--top-right .spop{-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%}.spop{border-bottom:1px solid rgba(0,0,0,.15)}}.spop{position:relative;min-height:56px;line-height:1.25;font-size:14px;-webkit-transform:translateZ(0);transform:translateZ(0)}@media screen and (min-width:30em){.spop{border-radius:2px;width:320px;margin:.7em}}.spop--error,.spop--info,.spop--success,.spop--warning{color:#fff;background-color:#454A56}@-webkit-keyframes spopIn{0%{-webkit-transform:scale(.2,.2);transform:scale(.2,.2)}95%{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}100%{-webkit-transform:scale(1,1);transform:scale(1,1)}}@keyframes spopIn{0%{-webkit-transform:scale(.2,.2);transform:scale(.2,.2)}95%{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}100%{-webkit-transform:scale(1,1);transform:scale(1,1)}}@-webkit-keyframes spopOut{0%{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}20%{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}100%{opacity:0;-webkit-transform:scale(0,0);transform:scale(0,0)}}@keyframes spopOut{0%{opacity:1;-webkit-transform:scale(1,1);transform:scale(1,1)}20%{-webkit-transform:scale(1.1,1.1);transform:scale(1.1,1.1)}100%{opacity:0;-webkit-transform:scale(0,0);transform:scale(0,0)}}.spop--out{-webkit-animation:spopOut .4s ease-in-out;animation:spopOut .4s ease-in-out}.spop--in{-webkit-animation:spopIn .4s ease-in-out;animation:spopIn .4s ease-in-out}.spop-body{padding:1.4em}.spop-body p{margin:0}.spop-body a{color:#fff;text-decoration:underline}.spop-body a:hover{color:rgba(255,255,255,.8);text-decoration:none}.spop-title{margin-top:0;margin-bottom:.25em;color:#fff}.spop-close{position:absolute;right:0;top:0;height:32px;width:32px;padding-top:7px;padding-right:7px;font-size:22px;font-weight:700;text-align:right;line-height:.6;color:#fff;opacity:.5}.spop-close:hover{opacity:.7;cursor:pointer}.spop-icon{position:absolute;top:13px;left:16px;width:30px;height:30px;border-radius:50%;-webkit-animation:spopIn .4s .4s ease-in-out;animation:spopIn .4s .4s ease-in-out}.spop-icon:after,.spop-icon:before{content:"";position:absolute;display:block}.spop-icon+.spop-body{padding-left:4.2em}.spop-icon--error,.spop-icon--info{border:2px solid #3a95ed}.spop-icon--error:before,.spop-icon--info:before{top:5px;left:11px;width:4px;height:4px;background-color:#3a95ed}.spop-icon--error:after,.spop-icon--info:after{top:12px;left:11px;width:4px;height:9px;background-color:#3a95ed}.spop-icon--error{border-color:#ff5656}.spop-icon--error:before{top:16px;background-color:#ff5656}.spop-icon--error:after{top:5px;background-color:#ff5656}.spop-icon--success{border:2px solid #2ecc54}.spop-icon--success:before{top:7px;left:7px;width:13px;height:8px;border-bottom:3px solid #2ecc54;border-left:3px solid #2ecc54;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spop-icon--warning{border:2px solid #fcd000}.spop-icon--warning:before{top:7px;left:7px;width:0;height:0;border-style:solid;border-color:transparent transparent #fcd000;border-width:0 6px 10px}
    `);
        setTimeout(function () {
            var decodeData = decodeURIComponent(data.innerText);
            var json = JSON.parse(decodeData);
            for (var item in json) {
                if (json[item]['aweme']) {
                    var detail = json[item]['aweme']['detail'];
                    console.log(detail)
                    var video = detail.video;
                    let showInfo = { bitRate: 0 };
                    if (video.bitRateList) {
                        var bitRateList = video.bitRateList;
                        for (var i = 0; i < bitRateList.length; i++) {
                            var bitRate = +bitRateList[i].gearName.split('_')[1];
                            var text = '视频下载:' + bitRate + 'p';
                            var url = bitRateList[i].playApi
                            if (bitRate > showInfo.bitRate) {
                                showInfo = {
                                    text: text,
                                    url: url,
                                    bitRate: bitRate
                                }
                            }
                        }
                    }
                    var defaultUrl = video.playApi;
                    var defaultRatio = +video.ratio.replace('p', '');
                    if (defaultRatio > showInfo.bitRate) {
                        var text = '视频下载:' + defaultRatio + 'p';
                        showInfo = {
                            text: text,
                            url: defaultUrl,
                            bitRate: defaultRatio
                        }
                    }
                    console.log(defaultRatio)
                    var buttons = document.getElementsByTagName('button')
                    for (var i = 0; i < buttons.length; i++) {
                        if (buttons[i].innerText == '关注' || buttons[i].innerText == '已关注') {
                            var classNames = buttons[i].className;
                            console.log(classNames)
                            var btnGrand = buttons[i].parentNode.parentNode;
                            const div = document.createElement('div');

                            var downA = document.createElement('a');
                            downA.href = showInfo.url;
                            downA.target = '_blank';
                            downA.innerHTML = showInfo.text;
                            downA.className = classNames;
                            div.appendChild(downA);


                            var copyText = document.createElement('a');
                            copyText.href = 'javascript:copyToClipboard(\'' + detail.desc + '\',\'视频标题复制成功\')';
                            copyText.innerHTML = '复制视频标题';
                            copyText.className = classNames;
                            div.appendChild(copyText);

                            var br = document.createElement('br');
                            div.appendChild(br);
                            var br2 = document.createElement('br');
                            div.appendChild(br2);

                            var sentToBackDown = document.createElement('a');
                            sentToBackDown.href = 'javascript:sendToHeiGouDown(\'' + defaultUrl + '\',\'' + detail.desc + '\')';
                            sentToBackDown.innerHTML = '喂狗粮(一键带标题下载)';
                            sentToBackDown.id = 'down_a_back';
                            sentToBackDown.className = classNames;
                            div.appendChild(sentToBackDown);

                            // var processP = document.createElement('p');
                            // processP.className=classNames;
                            // processP.id='progress_con_p';
                            // // processP.style='display: none;';
                            // var processSpan = document.createElement('span');
                            // processSpan.innerHTML='下载进度';
                            // processP.appendChild(processSpan);
                            // var processMeter = document.createElement('meter');
                            // processMeter.min=0;
                            // processMeter.max=100;
                            // processMeter.id='process_meter_m';
                            // processP.appendChild(processMeter);
                            // div.appendChild(processP);


                            btnGrand.after(div);
                            console.log('add btn');
                            // 复制标题按钮
                        }
                    }
                }
            }
        }, 1500);
        setTimeout(function() {
            // var auto_class_names='';
            // var buttons = document.getElementsByTagName('button')
            // for (var i = 0; i < buttons.length; i++) {
            //     if (buttons[i].innerText == '关注' || buttons[i].innerText == '已关注') {
            //         auto_class_names = buttons[i].className;
            //         break;
            //     }
            // }
            var spans = document.getElementsByTagName('span')
            for (var i = 0; i < spans.length; i++) {
                if (spans[i].innerText == '搜索' ) {
                    // var classNames = auto_class_names;
                    var classNames = spans[i].className;;
                    console.log(classNames)
                    var btnGrand = spans[i].parentNode.parentNode;
                    console.log(btnGrand)
                    var downA = document.createElement('a');
                    downA.href = 'javascript:autoRefresh(0)';
                    downA.innerHTML = '开启自动刷新';
                    downA.id="auto_refresh_a_id";
                    downA.className = classNames;
                    btnGrand.appendChild(downA);
                    // document.scrollingElement.scrollTo(0,document.body.scrollHeight +2000)
                    break;
                }
            }
        },1500);
    }
})();