您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动记录当前直播间的sc 发言
// ==UserScript== // @name bilibili直播SC 记录脚本 // @namespace http://tampermonkey.net/ // @version 0.1 // @description 自动记录当前直播间的sc 发言 // @author xue6474 // @match https://live.bilibili.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com // @grant none // @license MIT // ==/UserScript== (async function () { const findElement = ((lastDoc,frames) => { return function (selectors,isAll = false) { let res,doc if (lastDoc) { if (isAll) { res = lastDoc.querySelectorAll(selectors) if (res.length > 0) return res } else { res = lastDoc.querySelector(selectors) if (res) return res } } for (let i = 0; i < frames.length; i++) { try { doc = frames[i].document } catch (error) { continue } if (isAll) { res = doc.querySelectorAll(selectors) if (res.length > 0) { lastDoc = doc return res } } else { res = doc.querySelector(selectors) if (res) { lastDoc = doc return res } } } console.log('未找到元素',selectors) } })(window.document,window.frames); const log = (...msg) => console.log(`[${new Date().toLocaleTimeString()}]:`,...msg) const cb_test = obj => { log('新SC',obj); saveSC(obj) } const asleep = (t) => new Promise(res => setTimeout(res,t)) await asleep(8000) const panel_vm = findElement('#pay-note-panel-vm') if (!panel_vm) return log('findElement 未找到元素 #pay-note-panel-vm') createScBtn(panel_vm) start() const Panel_Vm_OB = new MutationObserver(records => { const childListRecord = records.find(v => v.type === 'childList') // console.log('childListRecord',childListRecord) if (childListRecord.removedNodes.length > 0) { log('SC 面板消失') } if (childListRecord.addedNodes.length > 0) { const isNew = [...childListRecord.addedNodes].some(addedNode => addedNode.classList.contains('pay-note-panel')) if (isNew) { log('SC 面板出现') start() } } }) Panel_Vm_OB.observe(panel_vm,{ childList: true }) function start() { const panel = panel_vm.querySelector('.pay-note-panel') if (panel) { getCurrentSc(panel,cb_test) //开始监听 .card-list .card-wrapper const SC_Wrapper = panel.querySelector('.card-list .card-wrapper') const SC_Wrapper_OB = new MutationObserver(records => { const childListRecord = records.find(v => v.type === 'childList') childListRecord.addedNodes.forEach(addedNode => { getCardInfo(addedNode,panel,cb_test) }) }) SC_Wrapper_OB.observe(SC_Wrapper,{ childList: true }) } else { // 若没有panel 监听 #pay-note-panel-vm log('当前没有SC panel,监听 #pay-note-panel-vm 。。。') } } async function getCurrentSc(panel,cb) { const cardList = panel.querySelectorAll('.card-item') for await (let card of generator(cardList,1000)) { getCardInfo(card,panel,cb) } } function* generator(arr = [],t = 500) { for (let i = 0; i < arr.length; i++) { yield new Promise(res => setTimeout(res,t,arr[i])) } } async function getCardInfo(card,panel,cb) { card.click() await asleep(300) let obj = { name: panel.querySelector('.detail-info .name')?.textContent, price: panel.querySelector('.detail-info .price')?.textContent, text: panel.querySelector('.detail-info .text')?.textContent } cb(obj) card.click() await asleep(300) } function saveSC(obj) { obj.time=new Date().toLocaleString() let data = localStorage.getItem('SC') if (data === null) { data = [obj] } else { data = JSON.parse(data) data.push(obj) } localStorage.setItem('SC',JSON.stringify(data)) } window.generateTable=generateTable function generateTable(data = []) { let style = document.createElement('style') style.innerText = `td { border: 1px solid; text-align: center; padding: 0.5em; }` let a = data.map(v => { return (` <tr> <td>${v.name}</td> <td>${v.price}</td> <td>${v.text}</td> <td>${v.time}</td> </tr> `) }) let htmlStr = `<table style="border-collapse: collapse;"> <thead> <tr> <td>昵称</td> <td>sc价格</td> <td>内容</td> <td>时间</td> </tr> </thead> <tbody> ${a.join('')} </tbody> </table>` let div = document.createElement('div') div.innerHTML = htmlStr return { div,style } } function createScBtn(parentEL) { let btn = document.createElement('button') parentEL.appendChild(btn) btn.style.cssText='position:absolute;right:0px;z-index:999;' btn.textContent = '查看SC' btn.onclick = function () { let data = JSON.parse(localStorage.getItem('SC')) if (!data) return const { div,style } = generateTable(data) let w1 = window.open() w1.document.head.appendChild(style) w1.document.body.appendChild(div) } } })()