含羞草研究所免费看

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

// ==UserScript==
// @name         含羞草研究所免费看
// @namespace    http://tampermonkey.net/
// @version      2.1.3
// @description  针对 含羞草研究所 的优化脚本,此脚本可以让用户观看VIP视频
// @description  中转页 https://www.Fi11.tv ; https://www.Fi11.live
// @description  一位网友推荐:https://5z4qc0.91hub.one:2096/index?ref=40951 
// @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.+$/
// @include        /^https://www.fi11sm\d+\.com.+$/
// @include        /^https://h5.fi11sm\d+\.com.+$/
// @include        /^https://www.yashenggd.com.+$/
// @include        /^https://h5.yashenggd.com.+$/
// @include        /^https://www.fi11av\d+\.com.+$/
// @include        /^https://h5.fi11av\d+\.com.+$/
// @include        /^https://www.fi11tv\d+\.com.+$/
// @include        /^https://h5.fi11tv\d+\.com.+$/
// @include        /^https://www.hxx-new-retail\d*\.com.+$/
// @include        /^https://h5.hxx-new-retail\d*\.com.+$/
// @include        /^https://www.jianguomuye\d*\.com.+$/
// @include        /^https://h5.jianguomuye\d*\.com.+$/
// @include        /^https://www.laccogh\d*\.com.+$/
// @include        /^https://h5.laccogh\d*\.com.+$/
// @include        /^https://www.pangrj\d*\.vip.+$/
// @include        /^https://h5.pangrj\d*\.vip.+$/
// @include        /^https://www.fi11sm\d*\.com.+$/
// @include        /^https://h5.fi11sm\d*\.com.+$/
// @include        /^https://www.fi11cc\d*\.com.+$/
// @include        /^https://h5.fi11cc\d*\.com.+$/
// @include        /^https://www.hada\d*\.com.+$/
// @include        /^https://h5.hada\d*\.com.+$/
// @match        https://fi11.com/*
// @match        https://fi11.cn/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=hxcbb101.com
// @grant        none
// @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js
// ==/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/dplayer/1.26.0/DPlayer.min.js")
}

function importJS(src) {
    let script = document.createElement('script');
    script.src = src;
    document.head.appendChild(script);
}

VITE_APP_AES_KEY = 'B77A9FF7F323B5404902102257503C2F'
VITE_APP_AES_IV = 'B77A9FF7F323B5404902102257503C2F'
VITE_APP_AES_PASSWORD_KEY = "0123456789123456"
VITE_APP_AES_PASSWORD_IV = "0123456789123456"
defaultPassword = "123456"
baseURL = "https://api.qianyuewenhua.xyz"

registerParam = {
    user_login: "",
    user_pass: "",
    source: "pc",
    channel: "P",
    //visitorId: null == (d = t.visitorInfo) ? void 0 : d.visitorId
    visitorId: 10000000 + Math.floor(Math.random() * 10000000)
}

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 genRegisterData() {
    registerParam.user_login = randomPhoneNumber()
    encryptParam = {
        key: VITE_APP_AES_PASSWORD_KEY,
        iv: VITE_APP_AES_PASSWORD_IV
    }
    registerParam.user_pass = encrypt(defaultPassword, encryptParam)
    return registerParam;
}


function encrypt(ciphertext, { key: key, iv: iv } = {}) {
    var a = CryptoJS.enc.Utf8.parse(ciphertext)
        , i = CryptoJS.AES.encrypt(a, CryptoJS.enc.Utf8.parse(key || VITE_APP_AES_KEY), {
            iv: CryptoJS.enc.Utf8.parse(iv || VITE_APP_AES_IV),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    return CryptoJS.enc.Base64.stringify(i.ciphertext)
}

function getVideoId() {
    let url = window.location.href;
    //集合类视频
    url = url.split('?')[0];
    if (url.endsWith("0")) {
        let urlSplited = url.split("play/video")
        urlSplited = urlSplited[1].split("/")
        let videoId = urlSplited[1]
        return parseInt(videoId);
    }
    let urlSplited = url.split("/");
    let videoId = urlSplited[urlSplited.length - 1];
    console.log('The videoId is',videoId);
    return parseInt(videoId);
}


async function getVideoUrl(token, videoId) {
    window.videoId = videoId
    path = "/videos/getPreUrl"
    let myHeaders = new Headers();
    myHeaders.append("Content-Type", "application/json;charset=UTF-8;");
    myHeaders.append("Auth", token);
    let videoUrlParam = {
        videoId: videoId
    }
    videoUrlParam = JSON.stringify(videoUrlParam)
    let now = new Date()
    data = {
        endata: encrypt(videoUrlParam || {}),
        ents: encrypt(parseInt(now.getTime() / 1e3) + 60 * now.getTimezoneOffset())
    }

    let requestOptions = {
        method: 'POST',
        headers: myHeaders,
        body: JSON.stringify(data),
        //    redirect: 'follow'
    };

    let res = await fetch(baseURL + path, requestOptions);
    let json = await res.json()
    m3u8Url = json.data.url
    try {
        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()
        return newM3U8Url
    } catch (error) {
        return null
    }
}

function setCopyBtn(elementClass,newM3U8Url){
    document.querySelector(elementClass).innerHTML='<button id="copyM3U8" style="color: red;">复制地址</button>'
    document.querySelector("#copyM3U8").addEventListener("click", async (e) => {
        await navigator.clipboard.writeText(newM3U8Url);
        alert("复制成功")
  });
}

function play(playerUrl, pic, container, playType) {
    container.style.zIndex = 99999
    container.style.position="relative";
    var videoObject = {
        container: '#v_prism', //容器的ID或className
        // live: true,//指定为直播
        seek: 'cookie',//指定跳转到cookie记录的时间,使用该属性必需配置属性cookie
        cookie: 'abcdefg',//cookie名称,请在同一域中保持唯一
        plug: 'hls.js',//使用hls.js插件播放m3u8
        video: playerUrl//视频地址
    }
    window.ck = new ckplayer(videoObject);
    window.ck.play()
}

function mobilePlay(playerUrl, pic, container, playType) {
    container.style.zIndex = 99999
    window.dp = new DPlayer({
        container: container,                       // 可选,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,                                   // 可选,视频截图
            thumbnails: pic
        }
    });
}

async function pc() {
    if (window.location.href.endsWith("home")) {
        return
    }
    let videoId = getVideoId()
    let videoUrl = await getVideoUrl(null, videoId)
    if (videoUrl == null) {
        return
    }
    setCopyBtn(".video-icon",videoUrl)
    pic = document.querySelector(".el-image.overflow-hidden > img")
    if (pic) {
        pic = pic.getAttribute("src")
    }
    container = document.querySelector("#v_prism")
    playType = 'live'
    elem = document.querySelector(".vip-mask")
    if (elem) {
        elem.remove()
    }
    elem = document.querySelector(".el-image.overflow-hidden")
    if (elem) {
        elem.remove()
    }
    elem = document.querySelector(".relative.bg-overlay>.overflow-hidden ")
    if (elem) {
        elem.remove()
    }
    elem = document.querySelector(".vip-mask")
    if (elem) {
        elem.remove()
    }
    elem = document.querySelector(".el-image.absolute ")
    if (elem) {
        elem.remove()
    }
    elem = document.querySelector(".absolute.bg-overlay")
    if (elem) {
        elem.remove()
    }

    play(videoUrl, pic, container, playType)
}


async function mobile() {
    if (!window.location.href.endsWith("0")) {
        return
    }
    let videoUrl = await getVideoUrl(null, getVideoId())
    if (videoUrl == null) {
        return
    }
    setCopyBtn(".tendency-row",videoUrl)
    pic = document.querySelector(".pub-video-poster")
    if (pic) {
        pic = pic.getAttribute("src")
    }
    //container = document.querySelector(".van-sticky")
    container = document.querySelector("#video1")
    playType = 'live'
    //document.querySelector(".try-detail-video").remove()
    mobilePlay(videoUrl, pic, container, playType)
}

async function main() {
    setTimeout(async () => {
        if(window.navigator.appVersion.includes("Windows")){
            window.addEventListener("click", () => {
                setTimeout(() => {
                    let videoId = getVideoId()
                    if (window.videoId == videoId) {
                        return
                    }
                    pc()
                }, 300)
            }, true)
            pc()
        } else {
            importLib()
            window.addEventListener("click", () => {
                setTimeout(() => {
                    if (!window.location.href.endsWith("0")) {
                        return
                    }
                    let videoId = getVideoId()
                    if (window.videoId == videoId) {
                        return
                    }
                    mobile()
                }, 100)

            }, true)
            mobile()
        }
    }, 1800)
}


main()