B站大会员影视+弹幕

解除B站大会员观影限制

目前為 2021-07-03 提交的版本,檢視 最新版本

// ==UserScript==
// @name         B站大会员影视+弹幕
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  解除B站大会员观影限制
// @author       Polygon
// @match        https://www.cuan.la/m3u8.php*
// @match        https://vip.parwix.com/*
// @require      https://gf.qytechs.cn/scripts/407985-ajax-hook/code/Ajax-hook.js?version=940269
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @include      https://www.bilibili.com/bangumi/play/*
// @include      https://www.bilibili.com/video/BV*
// @require      http://code.jquery.com/jquery-1.11.0.min.js
// @connect      *
// @run-at       document-idle
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// ==/UserScript==
; (function () {
    'use strict'
    const origin = [{ regex: 'barrage', api: 'https://www.cuan.la/m3u8.php?url=', color: '#a62aee'},
                    { regex: 'dmku', api: 'https://vip.parwix.com:4433/player/?url=', color: '#ff6429'}
    ]
    var danmu, cid
    function parseDanmu() {
        cid = GM_getValue('cid')
        danmu = { code: 23, msg: "success", dannum: 0, danmuku: [], name: "" }
        danmu.name = cid
        let api = `https://api.bilibili.com/x/v1/dm/list.so?oid=${cid}`
        GM_xmlhttpRequest({
            method: "GET",
            url: api,
            onload: function (res) {
                let obj = res.responseText.match(/<d p=".+?">.+?<\/d>/g)
                danmu.danmuku = []
                obj.forEach(ele => {
                    let r = /<d p="(.+?)">(.+?)<\/d>/g.exec(ele)
                    let params = r[1].split(',')
                    let content = r[2]
                    let time = params[0]
                    let direction = parseInt(params[1])
                    let fontsize = params[2]
                    let color = '#' + parseInt(params[3]).toString(16)
                    let direction_info
                    if (direction <= 3) {
                        direction_info = 'right'
                    } else if (direction == 4) {
                        direction_info = 'bottom'
                    } else if (direction == 5) {
                        direction_info = 'top'
                    } else {
                        direction_info = 'right'
                    }
                    danmu.danmuku.push([time, direction_info, color, "", content, "", "", `${fontsize}px`])
                })
                danmu.dannum = danmu.danmuku.length
                danmu.danmuku.push(["0", 'bottom', '#FF616D', "", `替换弹幕源成功,前方共有${danmu.danmuku.length}条弹幕,请做好准备哟`, "", "", `30px`])
            }
        })
    }
    let get_danmu = (config, handler) => {
        parseDanmu()
        console.log(danmu)
        setTimeout(() => {
            handler.resolve({
                config: config,
                status: 200,
                headers: { 'content-type': 'text/text' },
                response: JSON.stringify(danmu)
            })
        }, 500)
    }
    // 替换弹幕
    ah.proxy({
        onRequest: (config, handler) => {
            let match = false
            for (let i = 0; i < origin.length; i++) {
                if (config.url.search(origin[i].regex) !== -1) {
                    match = true
                    break
                }
            }
            if (match) {
                console.log('拦截弹幕接口' + config.url)
                get_danmu(config, handler)
            } else handler.next(config)
        }
    })
    // 解析视频替换iframe
    let parentId = '#toolbar_module'
    //添加样式
    let style = document.createElement("style")
    style.innerHTML = (".coldrainf-get-dm{float:right;}.coldrainf-get-dm>div{display:inline-block;}.coldrainf-get-dm a{font-size:15px;color:#00a1d6;margin:0 12px;line-height:28px;}.coldrainf-get-dm a:hover{cursor:pointer;color:#f25d8e;}")
    document.head.appendChild(style)
    let clear = () => {
        if (!document.URL.startsWith('https://www.bilibili.com/')) return
        let parent
        // 删除已存在d的按钮
        parent = document.querySelector(parentId)
        let old = document.querySelector('#switch')
        if (old) parent.removeChild(old)
        // 删除div
        parent = document.querySelector('.plp-l')
        let diyDiv = document.querySelector('#diy_module')
        if (diyDiv) { parent.removeChild(diyDiv) }
    }
    let addButton = () => {
        if (!document.URL.startsWith('https://www.bilibili.com/')) return
        let ele = document.querySelector(parentId)
        let switchButton = document.createElement("div")
        switchButton.setAttribute('class', 'share-info')
        switchButton.setAttribute('id', 'switch')
        switchButton.innerHTML = '<i class="iconfont"></i><span style="background-color: #FB7299; border: 1px solid #FB7299; color: #fff; border-radius: 16px; text-align: center;">切换</span> <!---->'
        ele.appendChild(switchButton)
        let modules = document.querySelectorAll('.player-module')
        switchButton.addEventListener('click', function () {
            let activateIndex
            for (let i=0;i<modules.length;i++) {
                if (modules[i].style.display == 'block') {
                    activateIndex = i
                    modules[i].style.display = 'none'
                    break
                }
            }
            let nextIndex = (activateIndex < modules.length - 1) ? activateIndex + 1 : 0
            modules[nextIndex].style.display = 'block'
            // 按钮颜色
            let color
            if (nextIndex == 0) {
                color = '#fb7299'
            } else {
                color = origin[nextIndex - 1].color
            }
            switchButton.querySelector('span').style['background-color'] = color
            switchButton.querySelector('span').style['border-color'] = color
        })
        GM_addStyle(`
            #switch span:hover {
                background-color: #505050;
                border-color: #505050;
            }
        `)
    }
    let addFrame = (index) => {
        // 防止匹配到解析网址,控制台会输出错误
        if (!document.URL.startsWith('https://www.bilibili.com/')) return
        let biliDiv = document.querySelector('#player_module')
        biliDiv.style.display = 'block'
        // 创建新player_module
        let diyDiv = biliDiv.cloneNode(true)
        diyDiv.style['padding-left'] = '0px'
        diyDiv.style.display = 'none'
        diyDiv.innerHTML = ""
        diyDiv.setAttribute('id', `diy_module_${index}`)
        let iframe = document.createElement("iframe")
        iframe.id = 'video-iframe'
        iframe.style.height = biliDiv.style.height
        diyDiv.append(iframe)
        let read_url = location.href
        iframe.src = origin[index].api + read_url
        console.log(iframe.src)
        if (document.body.className.includes('player-mode-widescreen')) {
            iframe.style.position = 'absolute'
            iframe.style.top = '0px'
        }
        iframe.height = '0%'
        iframe.width = '100%'
        iframe.setAttribute('frameborder', 'no')
        iframe.setAttribute('border', '0')
        iframe.setAttribute('allowfullscreen', 'allowfullscreen')
        iframe.setAttribute('webkitallowfullscreen', 'webkitallowfullscreen')
        document.querySelector('.plp-l').insertBefore(diyDiv, document.querySelector('.media-wrapper'))
    }
    function getCid() {
        if (!document.URL.startsWith('https://www.bilibili.com/')) return
        if (typeof cid == "undefined") {
            cid = unsafeWindow.__INITIAL_STATE__.epInfo.cid
        }
        GM_setValue('cid', cid)
    }
    let init = () => {
        // 从bili获取cid存储,在解析网站可直接读取
        getCid()
        // 清除原有所有button,frmae
        clear()
        // 将所源作为frmae添加到页面
        for (let i=0;i<origin.length;i++){
            addFrame(i)
        }
        // 设置button
        addButton()
    }
    setTimeout(init, 800)
    let obs = document.querySelector('head title')
    if (obs) {
        new MutationObserver(function (mutations, observer) {
            setTimeout(() => { location.reload() }, 500)
        }).observe(obs, { childList: true })
    }

})()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址