// ==UserScript== // @name HuyaTool 虎牙直播插件 // @namespace https://github.com/WithoutHair/Huya-Tool // @version 1.0 // @description 查看主播数据/B站直播同屏观看 // @author Mywait // @match *://www.huya.com/* // @icon data:image/png;base64,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 // @grant GM_xmlhttpRequest // @grant GM_log // @grant unsafeWindow // @connect doseeing.com // @connect bilibili.com // @connect huya.com // @require https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js // @downloadURL https://update.greasyfork.icu/scripts/446620/HuyaTool%20%E8%99%8E%E7%89%99%E7%9B%B4%E6%92%AD%E6%8F%92%E4%BB%B6.user.js // @updateURL https://update.greasyfork.icu/scripts/446620/HuyaTool%20%E8%99%8E%E7%89%99%E7%9B%B4%E6%92%AD%E6%8F%92%E4%BB%B6.meta.js // ==/UserScript== let isHostRoom = () => { try { let room_id = document.getElementsByClassName('host-rid')[0].children[1].textContent return room_id } catch (error) { return false } } let getHostStat = () => { let room_id = isHostRoom() GM_xmlhttpRequest({ method: 'GET', url: `https://www.doseeing.com/huya/data/api/rank?rids=${room_id}&dt=0&rank_type=chat_pv`, responseType: 'json', onload: function(res) { res = res.response.result.result[0] let parentNode = document.getElementsByClassName('ht-item')[0], statDom = document.createElement('div') statDom.className = 'ht-stat' parentNode.appendChild(statDom) statDom.innerHTML = `
总收入
${res['gift.paid.price'] / 100}元
付费人数 ${res['gift.paid.uv']}
总礼物
${res['gift.all.price'] / 100}元
送礼人数 ${res['gift.all.uv']}
总弹幕
${res['chat.pv']}条
弹幕人数 ${res['chat.uv']}
开播时长
${res['online.minutes']}分
活跃人数 ${res['active.uv']}
` } }) } let getRoomId = (id) => { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: `https://api.live.bilibili.com/room/v1/Room/room_init?id=${id}`, responseType: 'json', onload: function(response) { resolve(response.response) } }) }) } let getStreaming = (room_id, qn = 150) => { /* 当platform为web流才为flv格式 h5为m3u8 0: {qn: 10000, desc: '原画'} 1: {qn: 400, desc: '蓝光'} 2: {qn: 250, desc: '超清'} 3: {qn: 150, desc: '高清'} */ return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: `https://api.live.bilibili.com/room/v1/Room/playUrl?cid=${room_id}&qn=${qn}&platform=web`, responseType: "json", onload: function(response) { resolve(response.response) } }) }) } let InitInput = () => { let inputUrlCon = document.createElement('div') inputUrlCon.className = 'ht-input-con' inputUrlCon.innerHTML = `
同屏观看(暂仅支持B站)
使用前请先下载并启用该扩展
确定
取消
` document.body.appendChild(inputUrlCon) let hide = () => { inputUrlCon.className = inputUrlCon.className.replace('display', '') } document.getElementsByClassName('ht-button-ok')[0].onclick = async () => { hide() let urlId = inputUrlCon.children[2].value.split('/').pop() let key = `b-${urlId}` let {data} = await getRoomId(urlId) let stream = await getStreaming(data.room_id) createVideo(stream.data, key) } document.getElementsByClassName('ht-button-cancel')[0].onclick = () => { hide() } } let InitMenu = () => { let menuDom = document.createElement('div') menuDom.className = 'ht-fixed' menuDom.onclick = (e) => { if (e.target.parentNode.parentNode.className.includes('active')) { menuDom.className = 'ht-fixed' } else { menuDom.className = 'ht-fixed active' } } document.body.appendChild(menuDom) menuDom.innerHTML = `
` document.getElementsByClassName('ht-item')[1].onclick = () => { document.getElementsByClassName('ht-input-con')[0].className += ' display' } } let createVideo = (data, key) => { if (flvjs.isSupported()) { let video = document.createElement('video'), con = document.createElement('div'), title = document.createElement('div'), quality = document.createElement('select'), path = document.createElement('select'), resizeDot = document.createElement('div'), insertButton = document.createElement('div'), restoreButton = document.createElement('div'), flvPlayer = flvjs.createPlayer({ type: 'flv', url: data.durl[0].url }) flvPlayer.attachMediaElement(video) flvPlayer.load() let now = document.getElementById('hy-video') || document.getElementById('player-recommend') video.controls = true con.className = `ht-video-con ${key}` con.draggable = true setDragEvent(con) title.className = 'ht-video-title' insertButton.className = 'ht-button' insertButton.innerHTML = '嵌入直播间' restoreButton.className = 'ht-button' restoreButton.innerHTML = '恢复直播间' restoreButton.style.display = 'none' resizeDot.className = 'ht-video-resize' resizeDot.draggable = true let qualitys = data.quality_description, paths = data.durl qualitys.forEach(q => { quality.innerHTML += `