您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
获取直播弹幕信息并发送详情
// ==UserScript== // @name 弹幕助手 // @namespace http://tampermonkey.net/ // @version 1.0.6 // @description 获取直播弹幕信息并发送详情 // @match https://liveplatform.taobao.com/* // @icon https://cdn.52ym.vip/temp/a0whr-l6z8y-001.ico // @grant GM_xmlhttpRequest // @license MIT // ==/UserScript== const TIME = 2000; const platformMap = new Map([ ['taobao', handleTaoBaoBarrage] ]); let barrageIds = []; // 存储已处理的弹幕ID let requestData = { "rommId": 0,//直播间ID "username":"",//用户 "content":"",//评论 "onlineCount":0,//在线人数 "isSub":false,//是否关注 } //发送弹幕消息 function handleRequest(params) { // 构造弹幕数据对象 let data = { nickname: params.username, content: params.content, time: params.time }; console.log(data); // 将已处理的弹幕ID添加到列表中 barrageIds.push(params.username+params.content+params.time+params.top); if (barrageIds.length > 1) { barrageIds.splice(0, 1); } httpRequest({ method:"post", url:"https://dev.zb.51szr.com/api/live/comment/push/", data:params, async:true, },(res)=>{ console.log('res:',res) },(err)=>{ console.log("err:",err) }) } //查询直播间ID function getQueryName(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) { return decodeURI(r[2]); } return null; } function getTokeFromCookie(e) { var t = new RegExp("(?:^|;\\s*)" + e + "\\=([^;]+)(?:;\\s*|$)").exec(document.cookie); return t ? t[1] : void 0 } //获取在线人数 function getOnlineCount(roomId) { let _ = "_m_h5_c" , k = "_m_h5_tk" , P = "_m_h5_tk_enc"; const token = getTokeFromCookie(k); const appKey ="12574478"; const t = new Date().getTime(); const data = {"checkedUserId":null,"checkedUserOrderFactor":null,"liveId":roomId,"algorithmScore":null,"sort":"time"} const sign = getSign(token + "&" + t + "&" + appKey + "&"+ JSON.stringify(data)); const params = { "jsv": "2.7.0", "appKey": appKey, "t": t, "sign": sign, "api": "mtop.taobao.iliad.live.user.list", "v": "2.0", "preventFallback": true, "type": "jsonp", "dataType": "jsonp", "callback": "mtopjsonp100000", "data":JSON.stringify(data) } let url="https://h5api.m.taobao.com/h5/mtop.taobao.iliad.live.user.list/2.0/" // 将参数拼接到URL中 let queryString = Object.keys(params).map(function(key) { if (key ==="data"){ return key + "=" + encodeURIComponent(params[key]) } return key + "=" + params[key]; }).join("&"); url += "?" + queryString; console.log("request url:",url); // GET请求示例 // 在脚本中发送带有 Cookie 的请求 /**GM_xmlhttpRequest({ method: "GET", url: url, headers: { "Cookie": document.cookie, // 使用当前页面的 Cookie }, data: params, onload: function(response) { // 处理响应 console.log(response.responseText); } });**/ } function getSign(e) { function t(e, t) { return e << t | e >>> 32 - t } function n(e, t) { var n, r, o, i, a; return o = 2147483648 & e, i = 2147483648 & t, a = (1073741823 & e) + (1073741823 & t), (n = 1073741824 & e) & (r = 1073741824 & t) ? 2147483648 ^ a ^ o ^ i : n | r ? 1073741824 & a ? 3221225472 ^ a ^ o ^ i : 1073741824 ^ a ^ o ^ i : a ^ o ^ i } function r(e, t, n) { return e & t | ~e & n } function o(e, t, n) { return e & n | t & ~n } function i(e, t, n) { return e ^ t ^ n } function a(e, t, n) { return t ^ (e | ~n) } function s(e, o, i, a, s, l, c) { return e = n(e, n(n(r(o, i, a), s), c)), n(t(e, l), o) } function l(e, r, i, a, s, l, c) { return e = n(e, n(n(o(r, i, a), s), c)), n(t(e, l), r) } function c(e, r, o, a, s, l, c) { return e = n(e, n(n(i(r, o, a), s), c)), n(t(e, l), r) } function u(e, r, o, i, s, l, c) { return e = n(e, n(n(a(r, o, i), s), c)), n(t(e, l), r) } function d(e) { for (var t, n = e.length, r = n + 8, o, i = 16 * ((r - r % 64) / 64 + 1), a = new Array(i - 1), s = 0, l = 0; n > l; ) s = l % 4 * 8, a[t = (l - l % 4) / 4] = a[t] | e.charCodeAt(l) << s, l++; return s = l % 4 * 8, a[t = (l - l % 4) / 4] = a[t] | 128 << s, a[i - 2] = n << 3, a[i - 1] = n >>> 29, a } function p(e) { var t, n, r = "", o = ""; for (n = 0; 3 >= n; n++) r += (o = "0" + (t = e >>> 8 * n & 255).toString(16)).substr(o.length - 2, 2); return r } function f(e) { e = e.replace(/\r\n/g, "\n"); for (var t = "", n = 0; n < e.length; n++) { var r = e.charCodeAt(n); 128 > r ? t += String.fromCharCode(r) : r > 127 && 2048 > r ? (t += String.fromCharCode(r >> 6 | 192), t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224), t += String.fromCharCode(r >> 6 & 63 | 128), t += String.fromCharCode(63 & r | 128)) } return t } var h, m, v, g, y, b, w, x, E, C = [], S = 7, O = 12, T = 17, _ = 22, k = 5, P = 9, N = 14, I = 20, M = 4, R = 11, j = 16, A = 23, D = 6, L = 10, F = 15, V = 21, B; for (C = d(e = f(e)), b = 1732584193, w = 4023233417, x = 2562383102, E = 271733878, h = 0; h < C.length; h += 16) m = b, v = w, g = x, y = E, b = s(b, w, x, E, C[h + 0], 7, 3614090360), E = s(E, b, w, x, C[h + 1], O, 3905402710), x = s(x, E, b, w, C[h + 2], T, 606105819), w = s(w, x, E, b, C[h + 3], _, 3250441966), b = s(b, w, x, E, C[h + 4], 7, 4118548399), E = s(E, b, w, x, C[h + 5], O, 1200080426), x = s(x, E, b, w, C[h + 6], T, 2821735955), w = s(w, x, E, b, C[h + 7], _, 4249261313), b = s(b, w, x, E, C[h + 8], 7, 1770035416), E = s(E, b, w, x, C[h + 9], O, 2336552879), x = s(x, E, b, w, C[h + 10], T, 4294925233), w = s(w, x, E, b, C[h + 11], _, 2304563134), b = s(b, w, x, E, C[h + 12], 7, 1804603682), E = s(E, b, w, x, C[h + 13], O, 4254626195), x = s(x, E, b, w, C[h + 14], T, 2792965006), b = l(b, w = s(w, x, E, b, C[h + 15], _, 1236535329), x, E, C[h + 1], 5, 4129170786), E = l(E, b, w, x, C[h + 6], 9, 3225465664), x = l(x, E, b, w, C[h + 11], N, 643717713), w = l(w, x, E, b, C[h + 0], I, 3921069994), b = l(b, w, x, E, C[h + 5], 5, 3593408605), E = l(E, b, w, x, C[h + 10], 9, 38016083), x = l(x, E, b, w, C[h + 15], N, 3634488961), w = l(w, x, E, b, C[h + 4], I, 3889429448), b = l(b, w, x, E, C[h + 9], 5, 568446438), E = l(E, b, w, x, C[h + 14], 9, 3275163606), x = l(x, E, b, w, C[h + 3], N, 4107603335), w = l(w, x, E, b, C[h + 8], I, 1163531501), b = l(b, w, x, E, C[h + 13], 5, 2850285829), E = l(E, b, w, x, C[h + 2], 9, 4243563512), x = l(x, E, b, w, C[h + 7], N, 1735328473), b = c(b, w = l(w, x, E, b, C[h + 12], I, 2368359562), x, E, C[h + 5], 4, 4294588738), E = c(E, b, w, x, C[h + 8], R, 2272392833), x = c(x, E, b, w, C[h + 11], j, 1839030562), w = c(w, x, E, b, C[h + 14], A, 4259657740), b = c(b, w, x, E, C[h + 1], 4, 2763975236), E = c(E, b, w, x, C[h + 4], R, 1272893353), x = c(x, E, b, w, C[h + 7], j, 4139469664), w = c(w, x, E, b, C[h + 10], A, 3200236656), b = c(b, w, x, E, C[h + 13], 4, 681279174), E = c(E, b, w, x, C[h + 0], R, 3936430074), x = c(x, E, b, w, C[h + 3], j, 3572445317), w = c(w, x, E, b, C[h + 6], A, 76029189), b = c(b, w, x, E, C[h + 9], 4, 3654602809), E = c(E, b, w, x, C[h + 12], R, 3873151461), x = c(x, E, b, w, C[h + 15], j, 530742520), b = u(b, w = c(w, x, E, b, C[h + 2], A, 3299628645), x, E, C[h + 0], 6, 4096336452), E = u(E, b, w, x, C[h + 7], L, 1126891415), x = u(x, E, b, w, C[h + 14], F, 2878612391), w = u(w, x, E, b, C[h + 5], V, 4237533241), b = u(b, w, x, E, C[h + 12], 6, 1700485571), E = u(E, b, w, x, C[h + 3], L, 2399980690), x = u(x, E, b, w, C[h + 10], F, 4293915773), w = u(w, x, E, b, C[h + 1], V, 2240044497), b = u(b, w, x, E, C[h + 8], 6, 1873313359), E = u(E, b, w, x, C[h + 15], L, 4264355552), x = u(x, E, b, w, C[h + 6], F, 2734768916), w = u(w, x, E, b, C[h + 13], V, 1309151649), b = u(b, w, x, E, C[h + 4], 6, 4149444226), E = u(E, b, w, x, C[h + 11], L, 3174756917), x = u(x, E, b, w, C[h + 2], F, 718787259), w = u(w, x, E, b, C[h + 9], V, 3951481745), b = n(b, m), w = n(w, v), x = n(x, g), E = n(E, y); return (p(b) + p(w) + p(x) + p(E)).toLowerCase() } let xmlHttp="" //推送数据 function httpRequest(requestObj,successFun,failFun) { let { url:httpUrl, method, data, async } = requestObj xmlHttp = checkBrowser(xmlHttp); //请求方式, 转换为大写 var httpMethod = (method || "Get").toUpperCase(); //post请求时参数处理 if (httpMethod === "POST") requestData = JSON.stringify(data) xmlHttp.onreadystatechange = function () { if (xmlHttp.readyState === 4 && xmlHttp.status === 200) { // 请求成功的回调函数 successFun(xmlHttp.responseText); } else { //请求失败的回调函数 failFun(xmlHttp.responseText); } } // 发送请求 sendRequest(httpUrl, requestData, httpMethod, async ); } /** * 校验浏览器创建xmlHttp对象 * @param xmlHttp */ function checkBrowser(xmlHttp) { //创建 XMLHttpRequest 对象,老版本的 Internet Explorer (IE5 和 IE6) //使用 ActiveX 对象:xmlhttp=new ActiveXObject("Microsoft.XMLHTTP") if (window.XMLHttpRequest) { //code for all new browsers xmlHttp = new XMLHttpRequest; } else if (window.ActiveXObject) { //code for IE5 and IE6 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } // console.log(xmlHttp) return xmlHttp; } /** * 发送请求 * @param xmlHttp * @param requestData */ function sendRequest(httpUrl, requestData, httpMethod, async) { if (httpMethod === "GET") { xmlHttp.open("GET", httpUrl, async); //xmlHttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xmlHttp.send(requestData); } else if (httpMethod === "POST") { xmlHttp.open("POST", httpUrl, async); xmlHttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xmlHttp.setRequestHeader("Access-Control-Allow-Origin", "*"); // 用来解决跨域 xmlHttp.send(requestData); } } //处理弹幕消息 function handleTaoBaoBarrage() { let barrageContainer = document.querySelector('#rc-tabs-1-panel-AssistantCommentCard > div.alpw-container > div > div:last-child'); if (!barrageContainer) { return; // Exit if the barrage container element is not found } let top = barrageContainer.style.top; let usernameElement = barrageContainer.querySelector('div.alpw-userinfo > div > div > div.alpw-username-text'); let usernickElement = barrageContainer.querySelector('div.alpw-userinfo > div > div > div.alpw-username-nick'); let timeElement = barrageContainer.querySelector('div.alpw-userinfo > span'); let contentElement = barrageContainer.querySelector('div.alpw-comment-content'); let username = usernameElement.textContent.trim()+usernickElement.textContent.trim(); let content = contentElement.textContent.trim(); let time = timeElement.textContent.trim(); // 检查是否已处理过该弹幕 if (barrageIds.includes((username+content+time+top))) { return; } const roomId = getQueryName("liveId"); let is_sub=false; if(content.indexOf("关注了主播")!==-1){ is_sub=true } //getOnlineCount(roomId); requestData = { "roomId":roomId, "username":username,//用户 "content":content,//评论 "onlineCount": 0,//在线人数 "isSub":is_sub,//是否关注, "time":time, "top":top, } handleRequest(requestData); } (function () { setTimeout(()=>{ const currUrl = window.location.href; platformMap.forEach((value, key) => { if (currUrl.indexOf(key) !== -1) { setInterval(value, TIME); } }); },5000) })();