含羞草

含羞草-解析脚本

As of 08. 07. 2023. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         含羞草
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  含羞草-解析脚本
// @author       院长
// @match       *://*.fi11av29.com/*
// @match       *://*.fi11tv29.com/*
// @match       *://*.网站域名/*
// @match       *://*.失效后自行替换域名,如上面的fi11av29.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=3kjs.com
// @grant        none
// @require      https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js
// ==/UserScript==

//若是脚本网址失效,请在在上方的@match标签,自行在替换网址,附上一个导航http://www.Fi11.tv
//遇到播放地址为旧播放地址,请自行刷新当前页面,重新播放即可


/**********************************/
/*
含羞草-解析脚本
参考来源https://yaohuo.me/bbs-1210512.html

实现游客无限试用,无限获取真实播放地址

已兼容手机和电脑

*/
/**********************************/
(function() {
    'use strict';
    // 权限认证标识
    const TOKEN = 'hxc_1.0.0_token';
    // 服务地址
    let baseUrl = location.origin;
    // 视频试看地址
    const PRE_URL = baseUrl + '/api/videos/getPreUrl';
    // 用户注册地址
    const REG_URL = baseUrl + '/api/login/userReg';




    // 参数加密
    function Encrypt(word) {
        let keyStr = 'B77A9FF7F323B5404902102257503C2F';
        const key = CryptoJS.enc.Utf8.parse(keyStr);
        const iv = CryptoJS.enc.Utf8.parse(keyStr);
        const srcs = CryptoJS.enc.Utf8.parse(word);
        const encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
    }

    // 请求封装
    const fetchData = (url, body) => {
        return fetch(url, {
            method: 'post',
            body: JSON.stringify({
                endata: Encrypt(JSON.stringify(body))
            }),
            headers: {
                // 携带认证头
                auth: localStorage.getItem(TOKEN)?.replace(/"/g, ''),
                'Content-Type': 'application/json'
            }
        });
    };




    /**********************************/
    // hook: 拦截路由地址变化
    const _historyWrap = function (type) {
        const orig = history[type];
        const e = new Event(type);
        return function () {
            const rv = orig.apply(this, arguments);
            e.arguments = arguments;
            window.dispatchEvent(e);
            return rv;
        };
    };
    // 监听路由操作
    ['pushState', 'replaceState'].forEach(method => {
        history[method] = _historyWrap(method);
        window.addEventListener(method, () => {
            setValue();
        });
    });

    window.addEventListener('popstate', function(event) {
        console.log('当前URL为:', document.location.href);
        setValue();
    });

    /**********************************/



    // 去除限制
    const setValue = () => {
        let isDetail = location.href.includes('play/video');


        if (isDetail) {
            //判断是h5还是电脑
            let videoId = location.href.match(/.+\/h5\..+\/play\/video\/(\d+)\/.+/);
            console.log(videoId)
            if(!videoId){
                videoId = location.href.match(/.+\/play\/video\/(\d+)/)[1];


                //电脑
                console.log("电脑")
                var preInfo = localStorage.getItem("preInfo");
                if(preInfo){
                    preInfo = JSON.parse(preInfo)
                    preInfo.count = 0;
                    preInfo = JSON.stringify(preInfo)
                    localStorage.setItem("preInfo", preInfo);
                }


                //先删除按键
                let delete_el = document.querySelector('.el-divider.el-divider--horizontal');
                if(delete_el){
                    delete_el.remove();
                }
                fetchData(PRE_URL, {
                    videoId: Number(videoId)
                }).then(response => {
                    response.json().then(json => {
                        const isSuccess = !!json.data.url;
                        var el = document.querySelector('.el-divider.el-divider--horizontal');
                        let a = document.createElement('a');
                        a.style =
                            'display:block;font-size:18px;padding:12px;color:#1890ff;';
                        a.text = isSuccess ? '视频地址' : '获取失败';
                        a.target = "_blank";
                        if (isSuccess) {
                            let parseUrl = json.data.url.replace(/start=\d+&end=\d+/, '');
                            a.href = parseUrl;
                            // 获取ts切片
                            fetch(parseUrl).then(async res => {
                                let m3u8Str = await res.text();
                                // 提取第一条记录
                                let tsUrl = m3u8Str.split('\n').find(item => {
                                    return /^[^#]/.test(item);
                                });
                                // 拼接
                                const linkUrl =
                                      'https://m3u8play.com/?play=' +
                                      new URL(parseUrl).origin +
                                      tsUrl;
                                let external = document.createElement('a');
                                external.style =
                                    'display:block;font-size:18px;padding:12px;color:#1890ff;';
                                external.text = '外部播放';
                                external.href = linkUrl;
                                external.target = "_blank";
                                el.parentNode.insertBefore(external, el);
                            });
                        }
                        el.parentNode.insertBefore(a, el);
                    });
                });


            }else{
                //手机
                console.log("手机")
                videoId = videoId[1];
                var tryPlayNum = localStorage.getItem("tryPlayNum");
                if(tryPlayNum){
                    tryPlayNum = JSON.parse(tryPlayNum)
                    tryPlayNum.num = 0;
                    tryPlayNum = JSON.stringify(tryPlayNum)
                    localStorage.setItem("tryPlayNum", tryPlayNum);
                }

                //先删除按键
                let delete_el = document.querySelector('.tendency-row');
                if(delete_el){
                    delete_el.remove();
                }
                fetchData(PRE_URL, {
                    videoId: Number(videoId)
                }).then(response => {
                    response.json().then(json => {
                        const isSuccess = !!json.data.url;
                        var el = document.querySelector('.tendency-row');
                        let a = document.createElement('a');
                        a.style =
                            'display:block;font-size:18px;padding:12px;color:#1890ff;';
                        a.text = isSuccess ? '视频地址' : '获取失败';
                        a.target = "_blank";
                        if (isSuccess) {
                            let parseUrl = json.data.url.replace(/start=\d+&end=\d+/, '');
                            a.href = parseUrl;
                            // 获取ts切片
                            fetch(parseUrl).then(async res => {
                                let m3u8Str = await res.text();
                                // 提取第一条记录
                                let tsUrl = m3u8Str.split('\n').find(item => {
                                    return /^[^#]/.test(item);
                                });
                                // 拼接
                                const linkUrl =
                                      'https://m3u8play.com/?play=' +
                                      new URL(parseUrl).origin +
                                      tsUrl;
                                let external = document.createElement('a');
                                external.style =
                                    'display:block;font-size:18px;padding:12px;color:#1890ff;';
                                external.text = '外部播放';
                                external.href = linkUrl;
                                external.target = "_blank";
                                el.parentNode.insertBefore(external, el);
                            });
                        }
                        el.parentNode.insertBefore(a, el);
                    });
                });
            }

            console.log(videoId)
            var videoId_File = localStorage.getItem("videoId");
            //console.log("===========================")
            if(videoId_File && videoId_File === videoId){
                //console.log("----------------------------")
                return
            }
            localStorage.setItem("videoId", videoId);
        }


    }



})();