含羞草研究所免费看

针对 含羞草研究所 的优化脚本,此脚本可以让用户观看VIP视频

As of 2022-06-10. See the latest version.

// ==UserScript==
// @license MIT
// @name         含羞草研究所免费看
// @namespace    http://tampermonkey.net/
// @version      0.3.3
// @description  针对 含羞草研究所 的优化脚本,此脚本可以让用户观看VIP视频
// @author       You
// @match        https://www.hxcbb101.com/*
// @match        https://h5.hxcbb101.com/*
// @include        /^https://www.hxcbb\d+\.com.+$/
// @include        /^https://h5.hxcbb\d+\.com.+$/
// @include        /^http://www.hxcbb\d+\.com.+$/
// @include        /^http://h5.hxcbb\d+\.com.+$/
// @include        /^https://www.hxcpp\d+\.com.+$/
// @include        /^https://h5.hxcpp\d+\.com.+$/
// @include        /^http://www.hxcpp\d+\.com.+$/
// @include        /^http://h5.hxcpp\d+\.com.+$/
// @match        https://fi11.com/*
// @match        https://fi11.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=hxcbb101.com
// @grant        none
// ==/UserScript==

let Global = {
    deviceType: "pc",
    pageType: "live",
    isReloadVideo: false
}

function importLib() {
    importJS("https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js")
    importJS("https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.1.5/hls.min.js")
    importJS("https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.6.2/flv.min.js")
    importJS("https://cdnjs.cloudflare.com/ajax/libs/dplayer/1.26.0/DPlayer.min.js")
}
function importJS(src) {
    let script = document.createElement('script');
    script.src = src;
    document.body.appendChild(script);
}

async function getLiveUrl(token, videoId){
    var myHeaders = new Headers();
    myHeaders.append("auth", token);
    myHeaders.append("Content-Type", "application/json");

    var raw = JSON.stringify({
        "liveuid": parseInt(videoId)
    });

    var requestOptions = {
        method: 'POST',
        headers: myHeaders,
        body: raw,
        redirect: 'follow'
    };

    let res = await fetch("https://www.hxc-api.com/live/getLiveInfo", requestOptions);
    res = res.text();
    return res;
}

async function getPreUrl(token, videoId) {
    var myHeaders = new Headers();
    myHeaders.append("auth", token);
    myHeaders.append("Content-Type", "application/json");

    var raw = JSON.stringify({
        "videoId": parseInt(videoId)
    });

    var requestOptions = {
        method: 'POST',
        headers: myHeaders,
        body: raw,
        redirect: 'follow'
    };

    let res = await fetch("https://www.hxc-api.com/videos/getPreUrl", requestOptions);
    res = res.text();
    return res;
}

function getVideoId() {
    let url = window.location.href;
    let urlSplited = url.split("/");
    let videoId = urlSplited[urlSplited.length - 1];
    return videoId;
}

function getStorage(deviceType) {
    let key = null;
    if (deviceType === 'pc') {
        key = "newPCVideoWithLiveStore"
    } else {
        key = "liveDarkH5Store"
    }
    let storage = localStorage.getItem(key)
    let json = JSON.parse(storage);
    return json;
}

function getToken(storage) {
    let res = storage;
    let token = res.userToken;
    return token;
}
function closeDplayer() {
    if (window.dp) {
        window.dp.pause()
        window.dp.destroy()
        window.dp = null;
    }
    if (window.retBtn) {
        window.retBtn.removeEventListener("click", closeDplayer)
    }
    if (window.items) {
        if (window.items.length > 0) {
            window.items.forEach(item => {
                item.removeEventListener("click", closeDplayer)
            })
        } else {
            window.items.removeEventListener("click", initMobile)
        }
    }
    if (window.items2) {
        window.items2.forEach(item => {
            item.removeEventListener("click", initMobile)
        })
    }
    if (window.items3) {
        window.items3.forEach(item => {
            item.removeEventListener("click", initMobile)
        })
    }
    setTimeout(() => {
        window.items = document.querySelector(".videoListBox")
        if (window.items) {
            window.items.addEventListener("click", initMobile)
        }

    }, 300)

}


function h5play(playerUrl, pic) {
    // document.querySelector(".videoContentContainer").style = "width: 1200px; height: 550px;"
    window.items = document.querySelector(".videoListBox")
    window.items.addEventListener("click", initMobile)

    window.retBtn = document.querySelector(".van-icon.van-icon-arrow-left")
    if (window.retBtn) {
        window.retBtn.addEventListener("click", initMobile, true)
    }
    if (window.dp != null) {
        dp.switchVideo(
            {
                url: playerUrl,
                pic: pic,
                type: 'hls'
            }
        );
    } else {
        let videoContentContainer = document.querySelector(".VideoAuthAdminBg")
        if (videoContentContainer) {
            window.dp = new DPlayer({
                element: document.querySelector(".VideoAuthAdminBg"),                       // 可选,player元素
                autoplay: false,                                                   // 可选,自动播放视频,不支持移动浏览器
                theme: '#FADFA3',                                                  // 可选,主题颜色,默认: #b7daff
                loop: true,                                                        // 可选,循环播放音乐,默认:true
                lang: 'zh',                                                        // 可选,语言,`zh'用于中文,`en'用于英语,默认:Navigator language
                screenshot: true,                                                  // 可选,启用截图功能,默认值:false,注意:如果设置为true,视频和视频截图必须启用跨域
                hotkey: true,                                                      // 可选,绑定热键,包括左右键和空格,默认值:true
                preload: 'auto',                                                   // 可选,预加载的方式可以是'none''metadata''auto',默认值:'auto'
                video: {                                                           // 必需,视频信息
                    url: playerUrl,                                         // 必填,视频网址
                    pic: pic,                                      // 可选,视频截图
                    type: 'hls'
                }
            });
        }

    }

    Global.isReloadVideo = false;
}


function play(playerUrl, pic,element,playType) {

    if (window.dp != null) {
        dp.switchVideo(
            {
                url: playerUrl,
                pic: pic,
                type: playType
            }
        );
    } else {
        window.dp = new DPlayer({
            element: element,                       // 可选,player元素
            autoplay: false,                                                   // 可选,自动播放视频,不支持移动浏览器
            theme: '#FADFA3',                                                  // 可选,主题颜色,默认: #b7daff
            loop: true,                                                        // 可选,循环播放音乐,默认:true
            lang: 'zh',                                                        // 可选,语言,`zh'用于中文,`en'用于英语,默认:Navigator language
            screenshot: true,                                                  // 可选,启用截图功能,默认值:false,注意:如果设置为true,视频和视频截图必须启用跨域
            hotkey: true,                                                      // 可选,绑定热键,包括左右键和空格,默认值:true
            preload: 'auto',                                                   // 可选,预加载的方式可以是'none''metadata''auto',默认值:'auto'
            video: {                                                           // 必需,视频信息
                url: playerUrl,                                         // 必填,视频网址
                pic: pic,                                      // 可选,视频截图

            }
        });
    }
    Global.isReloadVideo = false;
}

async function loadAndPlay(playerUrl, pic, playType,pageType) {
    let intervalNum = setInterval(() => {
        if (typeof DPlayer !== 'undefined') {
            clearInterval(intervalNum);
            if (Global.deviceType === 'mobile') {
                h5play(playerUrl, pic);
            } else {
                let element = null;
                if(pageType === 'live'){
                    element = document.querySelector(".publicVideoContentBigBox");
                    element.style = "height: 550px;"
                }else{
                    element = document.querySelector(".split");
                    element.style = "width: 1200px; height: 550px;"
                }

                play(playerUrl, pic, element,playType);
            }
        }
    }, 300);
}

function isLogin(deviceType) {
    let storage = getStorage(deviceType)
    if (storage) {
        let isLogin = storage.isLogin
        return isLogin;
    }
    return false;
}


function randomPhoneNumber() {
    let prefixArray = new Array("130", "131", "132", "133", "135", "137", "138", "170", "187", "189");
    let i = parseInt(10 * Math.random());
    let prefix = prefixArray[i];

    for (var j = 0; j < 8; j++) {
        prefix = prefix + Math.floor(Math.random() * 10);
    }

    return prefix;
}

function getAccount(deviceType) {
    let account = {};
    let storage = getStorage(deviceType)
    if (storage != null && storage.userName != null && storage.password != null) {
        account.userName = storage.userName;
        account.password = storage.password;
        return account;
    }
    return null;
}

function genAccount() {
    let account = {};
    let phone = randomPhoneNumber();
    account.userName = phone;
    account.password = "123456";
    return account;
}


function registerLogin(account) {
    document.querySelectorAll(".topLoginButtonLine > p")[1].click();
    setTimeout(() => {
        let event = new Event('input', { bubbles: true, cancelable: true, composed: true });
        let accountDom = document.querySelectorAll(".el-form input")[0]
        accountDom.value = account.userName;
        accountDom.dispatchEvent(event)
        let passwordDom = document.querySelectorAll(".el-form input")[1]
        passwordDom.value = account.password;
        passwordDom.dispatchEvent(event)
        let confirmPasswordDom = document.querySelectorAll(".el-form input")[2]
        confirmPasswordDom.value = account.password;
        confirmPasswordDom.dispatchEvent(event)
        document.querySelectorAll(".el-form button")[0].click()
    }, 600);

}

function h5Login(account) {
    // document.querySelector(".van-button").click()
    let event = new Event('input', { bubbles: true, cancelable: true, composed: true });
    let usernameDom = document.querySelector(".publicLoginContentBox input[placeholder='请输入您的手机号或邮箱号']")
    usernameDom.value = account.username
    usernameDom.dispatchEvent(event)
    let passwordDom = document.querySelector(".publicLoginContentBox input[type='password']")
    passwordDom.value = passwordDom.password
    passwordDom.dispatchEvent(event)
    document.querySelector(".publicLoginContentBox button").click()
}


function h5Register(account) {
    setTimeout(()=>{
        // document.querySelector(".loginAboutTextLine").click()
        let event = new Event('input', { bubbles: true, cancelable: true, composed: true });
        let usernameDom = document.querySelector(".publicRegisterContentBox input[placeholder='请输入您的手机号或邮箱号']")
        usernameDom.value = account.username
        usernameDom.dispatchEvent(event)
        let passwordDom = document.querySelector(".publicRegisterContentBox input[type='password']")
        passwordDom.value = account.password
        passwordDom.dispatchEvent(event)
        let confirmPasswordDom = document.querySelector(".publicRegisterContentBox input[placeholder='请在此输入您的密码以确保两次输入一致']")
        confirmPasswordDom.value = account.password
        confirmPasswordDom.dispatchEvent(event)
        setTimeout(()=>{
           document.querySelector(".regButtonLine button").click()
        },600)
    },600)
}

function judgeLocation() {
    let urlpath = window.location.pathname
    if (urlpath === "/") {
        return "home"
    } else if (urlpath.indexOf("/login") > -1) {
        return "login"
    } else if (urlpath.indexOf("/register") > -1) {
        return "register"
    } if (urlpath.indexOf("/videoContent") > -1) {
        return "videoContent"
    } if (urlpath.indexOf("/live") > -1) {
        return "live"
    } else {
        return "other"
    }
}

function login(account) {
    document.querySelectorAll(".topLoginButtonLine > p")[0].click();
    setTimeout(() => {
        let event = new Event('input', { bubbles: true, cancelable: true, composed: true });
        let accountDom = document.querySelector("input[placeholder='请输入手机号/电子邮箱']")
        accountDom.value = account.userName;
        accountDom.dispatchEvent(event);
        let passwordDom = document.querySelector("input[type='password'")
        passwordDom.value = account.password;
        passwordDom.dispatchEvent(event);
        document.querySelectorAll(".el-form button")[0].click()
    }, 600)

}


function storageAccount(account) {
    localStorage.setItem("account", JSON.stringify(account))
}

// function getAccount() {
//     let str = localStorage.getItem("account")
//     let account = JSON.parse(str)
//     return account
// }

function getLocalStorage() {
    let str = localStorage.getItem("liveDarkH5Store")
    if (str) {
        return JSON.parse(str)
    }
    return null;
}

function h5isLogin() {
    let liveDarkH5Store = getLocalStorage()
    if (liveDarkH5Store == null) {
        return false
    }
    return liveDarkH5Store.isLogin
}
async function initMobile() {
    closeDplayer()
    // if (h5isLogin()) {
    //     let urlpath = window.location.pathname
    //     if (urlpath === "/") {
    //         window.items = document.querySelectorAll(".videoListStyle")
    //         window.items.forEach(item => {
    //             item.addEventListener("click", initMobile)
    //         })
    //     } else if (urlpath.indexOf("/videoContent") > -1) {
    //         let localStorage = getLocalStorage()
    //         let token = localStorage.userToken
    //         let dom = document.querySelector(".publicAuthBox")
    //         Global.isReloadVideo = true
    //         reloadVideo(token, Global.deviceType);
    //     }
    //     return
    // }
    setTimeout(async () => {
        let res = judgeLocation();
        if (res === "home") {
            // closeDplayer()
            setTimeout(() => {
                window.items = document.querySelectorAll(".videoListBox")
                window.items.forEach(item => {
                    item.addEventListener("click", initMobile)
                })
                window.items2 = document.querySelectorAll(".van-tab")
                window.items2.forEach(item => {
                    item.addEventListener("click", initMobile)
                })
                window.items3 = document.querySelectorAll(".van-tabbar-item")
                window.items3.forEach(item => {
                    item.addEventListener("click", initMobile)
                })
            }, 100)
        } else if (res === 'login') {
            let account = getAccount()
            if (account) {
                h5Login(account)
            } else {
                let account = {
                    username: randomPhoneNumber(),
                    password: "123456"
                }
                document.querySelector(".loginAboutTextLine").click()
                let res = await h5Register(account)
                if (res.code === 0) {
                    storageAccount(account)
                    h5Login(account)
                }
                alert("请手动注册")
                return
            }
            // closeDplayer()
        } else if (res === 'register') {
            let account = {
                username: randomPhoneNumber(),
                password: "1123456"
            }
            h5Register(account)
            // closeDplayer()
        } else if (res === 'videoContent') {
            if (!h5isLogin()) {
                document.querySelector(".publicAuthBox button").click()
                setTimeout(() => {
                    initMobile()
                }, 300)
                return
            }
            reloadVideo("mobile");
        } if (res === 'live') {
            if (!h5isLogin()) {
                document.querySelector(".publicAuthBox button").click()
                setTimeout(() => {
                    initMobile()
                }, 300)
                return
            }
            reloadVideo("mobile",res);
        }else {
            closeDplayer()
        }
    }, 600)

}


async function reloadVideo(deviceType,pageType) {
    let storage = getStorage(deviceType)
    let token = getToken(storage)
    let videoId = getVideoId()
    let preUrl = '';
    let playType = 'hls'
    if(pageType == 'live'){
        preUrl = await getLiveUrl(token, videoId);
        preUrl = JSON.parse(preUrl)
        if (preUrl.code === 0) {
            let liveUrl = preUrl.data.pull
            let pic = preUrl.data.thumb
            if (deviceType === 'pc') {
                //pic = document.querySelector(".backImg img").getAttribute("src")
            } else {
                let picdom = document.querySelector(".VideoAuthAdminBg img")
                if (picdom) {
                    pic = picdom.getAttribute("src")
                }
            }
            playType = 'flv'
            loadAndPlay(liveUrl, pic, playType,pageType )
        }
    }else{
        preUrl = await getPreUrl(token, videoId)
        preUrl = JSON.parse(preUrl)
        if (preUrl.code === 0) {
            let m3u8Url = preUrl.data.url
            let splited = m3u8Url.split("?")
            let m3u8UrlParams = splited[1]
            let urlSearchParams = new URLSearchParams(m3u8UrlParams)
            urlSearchParams.delete("start")
            urlSearchParams.delete("end")
            let newM3U8Url = splited[0] + "?" + urlSearchParams.toString()
            let pic;
            if (deviceType === 'pc') {
                pic = document.querySelector(".backImg img").getAttribute("src")
            } else {
                let picdom = document.querySelector(".VideoAuthAdminBg img")
                if (picdom) {
                    pic = picdom.getAttribute("src")
                }

            }
            loadAndPlay(newM3U8Url, pic)
        }
    }

}

async function initPC() {
    let deviceType = 'pc'
    if (!isLogin(deviceType)) {
        let account = getAccount(deviceType);
        if (account !== null) {
            login(account);
        } else {
            account = genAccount(deviceType)
            registerLogin(account);
        }
    }
    let pageType = judgeLocation();
    reloadVideo(deviceType,pageType);
}

function init() {
    let localStorage = getLocalStorage();
    if (localStorage == null) {
        initPC()
        return
    }
    Global.deviceType = 'mobile'
    if (!Global.isReloadVideo) {
        initMobile()
    }
    // setInterval(() => {

    // }, 600)
}

(function () {
    'use strict';
    importLib();
    setTimeout(() => {
        init();
    }, 1200)
    console.log("插件已启动")
})();