// ==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 += `