Greasy Fork镜像 支持简体中文。

咪咕奥运小助手——实时比赛数据立刻了解

添加实时热门赛事比分等详细信息;切换标签时静音上一个标签,方便多赛事切换观看;屏蔽聊天室默认热词和报比分的弱智。

  1. // ==UserScript==
  2. // @name 咪咕奥运小助手——实时比赛数据立刻了解
  3. // @version 0.0.0025_a
  4. // @namespace https://gf.qytechs.cn/users/58790
  5. // @description 添加实时热门赛事比分等详细信息;切换标签时静音上一个标签,方便多赛事切换观看;屏蔽聊天室默认热词和报比分的弱智。
  6. // @author mission522
  7. // @license MIT
  8. // @match https://www.miguvideo.com/mgs/website/prd/sportLive.html?mgdbId=*
  9. // @icon https://www.google.com/s2/favicons?domain=miguvideo.com
  10. // @require https://cdn.bootcss.com/qs/6.7.0/qs.min.js
  11. // @connect app.sports.qq.com
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // @grant GM_addStyle
  15. // @grant GM_addElement
  16. // @grant GM_xmlhttpRequest
  17. // ==/UserScript==
  18.  
  19. // 静音
  20. function vedioMute() {
  21. document.addEventListener('visibilitychange', function () {
  22. //浏览器切换事件
  23. const mVedioPlayer = document.querySelector('#m-player');
  24. if (document.visibilityState == 'hidden') {
  25. console.log('离开当前tab标签');
  26. mVedioPlayer.muted = true; // 使音频静音
  27. } else {
  28. console.log('回到当前tab标签');
  29. mVedioPlayer.muted = false; // 取消音频静音
  30. }
  31. });
  32. }
  33.  
  34. //聊天室过滤,去多余信息(vip,app等)
  35. function chatRoomFilter() {
  36. //去多余
  37. // console.log('here');
  38. GM_addStyle('.user-guide-app , .list_box>.name{display:none!important}');
  39.  
  40. let filterList = [
  41. '(\\d){1,2}(-|比|:|:|/|s)(\\d){1,2}',
  42. 'slay东京',
  43. '这才是真正的高手',
  44. '奔跑自由是方向',
  45. '期待破纪录',
  46. '运动永无止境',
  47. // 'watch out',
  48. '见证奥林匹克精神!',
  49. '这水花绝了',
  50. '队?这就叫',
  51. '这就是压水花天',
  52. '军团,全力',
  53. '奋力一搏',
  54. // '不留遗憾',
  55. '就是要拼',
  56. '运健儿取得',
  57. '决战奥运,',
  58. '马,卫冕东京',
  59. '战斗从未停止,2020奥运会',
  60. '预祝举办成功!',
  61. '携手破浪,冲',
  62. '憾,年轻就',
  63. ];
  64. let filterReg = new RegExp(`(${filterList.join('|')})`);
  65.  
  66. document.querySelector('.__view>ul>div.list_item').addEventListener(
  67. //插入事件。'DOMSubtreeModified',
  68. 'DOMNodeInserted',
  69. (e) => {
  70. // console.log('ec:', e.target.textContent, ';;;');
  71. if (filterReg.test(e.target.textContent)) {
  72. // e.target.style.display = 'none';
  73. e.target.remove();
  74. console.log('ec_block:', e.target.textContent);
  75. }
  76. },
  77. false
  78. );
  79. }
  80.  
  81. //获取今天日期
  82. function getNowFormatDate() {
  83. var date = new Date();
  84. var seperator1 = '-';
  85. var year = date.getFullYear();
  86. var month = date.getMonth() + 1;
  87. var strDate = date.getDate();
  88. if (month >= 1 && month <= 9) {
  89. month = '0' + month;
  90. }
  91. if (strDate >= 0 && strDate <= 9) {
  92. strDate = '0' + strDate;
  93. }
  94. var currentdate = year + seperator1 + month + seperator1 + strDate;
  95. return currentdate;
  96. }
  97.  
  98. // 添加赛程元素
  99. function creatScheduleElement(resultObject) {
  100. const tabColumn = document.querySelector('.tabColumn');
  101. const vedioTitle = tabColumn.children[1];
  102. if (vedioTitle != undefined) {
  103. vedioTitle.style.display = 'none';
  104. }
  105.  
  106. let chatRoom = document.querySelector('#chat');
  107. if (chatRoom === null) {
  108. //chatRoom不在,选live-review
  109. chatRoom = document.querySelector('.live-review');
  110. }
  111.  
  112. let scheduleTitle = GM_addElement(tabColumn, 'li', { 'data-v-66839cfa': '', title: '点击立即刷新数据' });
  113. scheduleTitle.innerHTML = '热门赛程';
  114. scheduleTitle.addEventListener('click', (e) => {
  115. chatRoom.style.display = 'none';
  116. scheduleList.style.display = 'block';
  117. scheduleTitle.style.color = '#007AFF';
  118. chatTitle.style.color = '#999';
  119. });
  120.  
  121. let chatTitle = tabColumn.children[0];
  122. if (chatTitle === null || (chatTitle.innerHTML !== '聊天室' && chatTitle.innerHTML !== '精彩回顾')) {
  123. chatTitle = GM_addElement(tabColumn, 'li', { 'data-v-66839cfa': '' });
  124. chatTitle.innerHTML = '聊天室';
  125. GM_addStyle('.vipInfo{ display:none;}');
  126. }
  127. chatTitle && chatTitle.addEventListener('click', switchToChatroom);
  128. function switchToChatroom() {
  129. chatRoom.style.display = 'block';
  130. scheduleList.style.display = 'none';
  131. chatTitle.style.color = '#007AFF';
  132. scheduleTitle.style.color = '#999';
  133. }
  134.  
  135. let rightBox = document.querySelector('.right-box');
  136. let scheduleList = GM_addElement(rightBox, 'ul', { class: 'scheduleList', style: 'display: none;' });
  137.  
  138. //样式
  139. GM_addStyle(
  140. '::-webkit-scrollbar { width: 6px}::-webkit-scrollbar-thumb { border-radius: 10px; background: #555555;}.right-box { background-color: #333;}.scheduleList { padding: 0 1rem; height: 382px; overflow-y: scroll; color: white;}.scheduleItem { min-height: 5rem; color: #fcf7f7; font-size: 12px; padding: .3rem .1rem; border-bottom: .5px solid #969ba3 ;}.scheduleItemGroup{ display: flex; flex-direction: row; align-items: center; text-align:left;}.scheduleItemMatch { padding: .5em 0; color:#969ba3 ; box-sizing:border-box;height:30px;}.scheduleItemTeams { overflow: hidden; font-size:1.2em; flex: 8; cursor: pointer;}.scheduleitemScores { flex: 1; font-size:1.2em; }'
  141. );
  142. //去vip条,加回高度
  143. GM_addStyle(
  144. '@media screen and (max-width: 1680px) { .vipInfo { display: none; } .scheduleList, .live-review .review .review-content { height: 440px!important; } .chat .room-content[data-v-9945c5b2] { height: 380px!important; }}'
  145. );
  146.  
  147. function add_schedule(obj) {
  148. // console.log('add_schedule');
  149. obj.forEach((element) => {
  150. let matchInfo = element.matchInfo;
  151.  
  152. function add_scheduleItem() {
  153. let scheduleItem = GM_addElement(scheduleList, 'li', { class: 'scheduleItem' });
  154.  
  155. //match
  156. let scheduleItemMatch = GM_addElement(scheduleItem, 'div', { class: 'scheduleItemMatch' });
  157. // scheduleItemMatch.innerHTML = matchInfo.cnSportName + matchInfo.cnGenderName + matchInfo.cnEventName + matchInfo.cnPhaseName;
  158. scheduleItemMatch.innerHTML = matchInfo.matchDesc;
  159.  
  160. // 添加图标
  161. let icon = {
  162. isChina:
  163. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABNVBMVEVHcEzhKBLgKRLeKhLfKBLgJxLgKBLeKBLhJxLhJxHeKRLgJxHdLhPgPBXhLhPdURffRRXeLRHgfR3fKRHcNxbhYh7eQRfeMA7hKxPjdB7bMRHhJxDhKRHgLQ3gRBjZLxLfPBXeMhPbOxbgMRThLBPcVxjfaB3fNBPeKBHdLBLaSBneORTdKRHfKg/dKw3dLhLgKQ3dQxTgKA/cLRLfKgzdKBLcSRffWhbhKQzeLQ/ePxPdLhHbMxPeLRLbRRLbKhLeWRTcMxLdLRLdKhLqnA7cPRDdKxLbNxX0xw372QbeUxbcThXgVBHdXRPsqhP3zgrmfhXfOBLrlxbeSxHnhxPeMxLeKRDytw3wrxHhMRLdMBLnlBfiTRPtog/dKRPdThfcKhLaMxTcKRLdYhvdSBbgbxnaMxPoqwMqAAAAAXRSTlMAQObYZgAAALRJREFUGNNjYEAH7HCQkAQiIQJuzuxcickpcVAB5iivUBautNR4a00WkIBtoE9QTCRzmJONlhITCwO7vXd0uH9EgDsbh7aaqqw0A7upo6+HZ2ywJQeHirqiDCdQi7Gdn0uIlREHh7KcmAQHUEDfzMHV3JCVlU1BUpQPJKCjZ2JhoMvOLi8lLsgIEmDX4AQCJhEhfmE2DrAAOwsHBwcjjwAvNwdUgB3I4GDl5ORAEYACTAF0AACPpxf6y2UvAwAAAABJRU5ErkJggg==',
  164. isGold:
  165. 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAACZ1BMVEVHcEzubUjuxojsYUP0b07rYkHrbEfzfFDwcUvzfU/78szPn2Dfr3Dnv3D925nvv4D232fw0HHvzpv135PjuXr15aHvz4/y3qXfr3D33Y/u16Drw4Dty3DpUjzwyZHPl1jspGT14arkvmv65JjPnlvZrmTDi0j44Xb65aDFikrDiUjEi0n5s2X8wW7qWD7x2Jjx1pfpVz3/2p/o0JLixYXmv3Dryof21pvivnjnyobw2n3lym/tZUT04KLdvmbcvGzxdkzva0fwcEn14oLt1nn034H46cHoz4Ls03fyd0314YLt1Xn864rv26Tq0HXs1JLq0nb66Yjo0oTkxnHmynDy3p3rWz/qWj/ywYvmzYbuakb35ITrX0HpVDzz4an76Lbvy4/wjVX35YXy3X7257nmzH3jx23gwm32333iwnjdvHrqXT/tzITtZkXp0IXpy4Tq0pn76r7fwWjs1IT78Lfy3X/44LLp0I7bu2Tjxmz977vTtUf12Kvto2Djwn757bTv2Xvp0HTwcUrev2bz2E3py5Tlyonx2Z3z5KjoyX7647Przn3hv3fs0Ij04JbwqGPqWD7y1Jzev2v347HYunHznmfsYELy3aDoVzzpzI3q0XXr1ZP1453657bp0pzev2f33lru0J/dvXXiyobgv3XpWj7467HoznPu253lyXjtt3rVt0725azkyG7u1pPZt2DtY0Pz1Zns2Zr23pj65n7y4qX44prr0Zfo05Lua0fqWj72ypTt1ZLrXUDo0IPueEzrXkHtbkfrunzsZEPhw2rn0I3q0JPw2pnr04jbwWXixX3nz4XexW22FZx5AAAAOnRSTlMA9NihF3Xaw0SX9xAQgI8Q/dDe4aPxEOBAysZA4CLAIMr0v/CrsEDz/jCAcKuVtv79iWDUulDOqaHfyEwpxgAAAQVJREFUGNNj4PRs2mlzQI+BwXDvhignB3YGFsbcabsO79fRPbh0QoyNIwcDA2tY9tTdh/QNVvUnxoYzMwABW0Th5D371k2PT6idIQsSYHKLzLOd02cbVz1TAcTn5fJ1D01OirYqnr3a2BQoIJUS5O/h6hNYOmvl0ZMWQAHx9tRgPytnr4blR06dMWFgkBbt7Uy3DnDxblxrZ3/akoFBTLg7s6AoLcS6cv76YyfMgFokM/Kz2iY121XYz1tz3BwowCeQ0zpl0ZKeuvKSuYpGQAF+wZaJCxfvWNFRX1UmB3IHg4TMgo3bN21d1lUjxAMWYJBXUt+yeZuGsgg3AwyoaamqaGuCmQAaOFMafK95jQAAAABJRU5ErkJggg==',
  166. };
  167. GM_addStyle('.scheduleItemIcon{display: inline; padding-left:3px; width:12px; vertical-align:middle;}');
  168. if (matchInfo.isChina == 1) {
  169. // console.log(`${matchInfo.matchDesc}:${matchInfo.isChina}`);
  170. GM_addElement(scheduleItemMatch, 'img', { class: 'scheduleItemIcon', src: icon.isChina });
  171. }
  172. if (matchInfo.isGold == 1) {
  173. // console.log(`${matchInfo.matchDesc}:${matchInfo.isGold}`);
  174. GM_addElement(scheduleItemMatch, 'img', { class: 'scheduleItemIcon', src: icon.isGold });
  175. }
  176.  
  177. let scheduleItemGroup = GM_addElement(scheduleItem, 'div', { class: 'scheduleItemGroup', title: '点击立即刷新数据' });
  178.  
  179. //time
  180. let scheduleItemTime = GM_addElement(scheduleItemGroup, 'div', { class: 'scheduleItemTime' });
  181. // scheduleItemTime.innerHTML = matchInfo.startTime;
  182.  
  183. //Teams
  184. let scheduleItemTeams = GM_addElement(scheduleItemGroup, 'div', { class: 'scheduleItemTeams' });
  185.  
  186. let scheduleItemTeam1 = GM_addElement(scheduleItemTeams, 'div', { class: 'scheduleItemTeam' });
  187. scheduleItemTeam1.innerHTML = matchInfo.leftName;
  188.  
  189. let scheduleItemTeam2 = GM_addElement(scheduleItemTeams, 'div', { class: 'scheduleItemTeam' });
  190. scheduleItemTeam2.innerHTML = matchInfo.rightName;
  191.  
  192. //Score
  193. let scheduleItemScores = GM_addElement(scheduleItemGroup, 'div', { class: 'scheduleitemScores' });
  194.  
  195. let scheduleItemScore1 = GM_addElement(scheduleItemScores, 'div', { class: 'scheduleitemScore' });
  196. scheduleItemScore1.innerHTML = matchInfo.leftGoal;
  197.  
  198. let scheduleItemScore2 = GM_addElement(scheduleItemScores, 'div', { class: 'scheduleitemScore' });
  199. scheduleItemScore2.innerHTML = matchInfo.rightGoal;
  200.  
  201. //详细数据获取按钮
  202. // console.dir(scheduleItemTeams);
  203. scheduleItemTeams.addEventListener('click', () => {
  204. detailUrl = `https://app.sports.qq.com/TokyoOly/statDetail?mid=${matchInfo.mid}`;
  205. getStatsDetail(detailUrl, scheduleItem);
  206. });
  207. }
  208.  
  209. if (element.liveId === '' && element.matchInfo.quarter !== '') {
  210. // if (element.liveId === '') {
  211. add_scheduleItem();
  212. }
  213. });
  214. }
  215.  
  216. function update_schedule() {
  217. let newResultObject = {};
  218.  
  219. scheduleList.innerHTML = null;
  220.  
  221. getSchedule(getXhrUrl(), (responseText) => {
  222. let today = getNowFormatDate();
  223. newResultObject = JSON.parse(responseText).data.matches[`${today}`].list;
  224. add_schedule(newResultObject);
  225. });
  226. }
  227.  
  228. //第一次获取数据
  229. add_schedule(resultObject);
  230.  
  231. // 每3分钟更新数据
  232. setInterval(() => {
  233. update_schedule();
  234. }, 1000 * 60 * 3);
  235.  
  236. scheduleTitle.addEventListener('click', update_schedule);
  237. }
  238.  
  239. function getXhrUrl() {
  240. let urlData = {
  241. // 130003热门
  242. columnId: 130003,
  243. dateNum: 1,
  244. flag: 2,
  245. // sportID:null,
  246. // venueID:null,
  247. // nocID:null,
  248. // parentChildType:1,
  249. date: getNowFormatDate(),
  250. };
  251. return 'https://app.sports.qq.com/match/list?' + Qs.stringify(urlData);
  252. }
  253.  
  254. //xhr获取赛程信息
  255. function getSchedule(url, success, fail) {
  256. // 执行xhr
  257. GM_xmlhttpRequest({
  258. method: 'GET',
  259. url: url,
  260. onload: (result) => {
  261. if (result.readyState === 4 && result.status === 200) {
  262. success && success(result.responseText);
  263. } else {
  264. fail && fail(new Error('接口请求失败'));
  265. }
  266. },
  267. });
  268. }
  269.  
  270. function getStatsDetail(url, parentElement) {
  271. function addDetailElement(responseText) {
  272. let response = JSON.parse(responseText);
  273. let stats = '';
  274.  
  275. //删掉原来的
  276. if (parentElement.lastChild.classList[0] === 'statsTable') {
  277. parentElement.lastChild.remove();
  278. }
  279. let statsTable = GM_addElement(parentElement, 'table', { class: 'statsTable' });
  280.  
  281. if (response.code === 4) {
  282. return (statsTable.innerHTML = '暂无数据');
  283. } else {
  284. stats = response.data.stats['0'];
  285. // console.dir(stats);
  286. }
  287. // statsTable.innerHTML = stats['0'];
  288.  
  289. let statsTbody = GM_addElement(statsTable, 'tbody', { class: 'statsTbody' });
  290.  
  291. for (let i = 0; i < stats.rowCount; i++) {
  292. let statsTr = GM_addElement(statsTable, 'tr', { class: 'statsTr' });
  293.  
  294. for (let j = 0; j < stats.rows[i].length; j++) {
  295. let statsTd = GM_addElement(statsTr, 'td', { class: 'statsTd' });
  296. // console.log(`i:${i},j:${j}`);
  297. statsTd.innerHTML = stats.rows[i][j].html;
  298. }
  299. }
  300.  
  301. GM_addStyle(
  302. '.statsTable { text-align: left; margin: 2px 0; min-width: 3.75rem; border-collapse: separate; font-size: 12px;}.scheduleItemGroup { padding-bottom: 10px;}.statsTr { border-bottom: 1px solid #f5f5f5;}.statsTd { min-width: 5em; white-space: normal; text-align: left; padding-right: .5em; padding-bottom:.5em; overflow: hidden;}'
  303. );
  304. }
  305. getSchedule(url, addDetailElement);
  306. }
  307.  
  308. window.onload = function myPromise() {
  309. new Promise((resolve, reject) => {
  310. vedioMute();
  311. setTimeout(() => {
  312. chatRoomFilter();
  313. }, 300);
  314. resolve();
  315. })
  316. .then((res) => {
  317. getSchedule(getXhrUrl(), (responseText) => {
  318. let today = getNowFormatDate();
  319. let responseDataList = JSON.parse(responseText).data.matches[`${today}`].list;
  320. creatScheduleElement(responseDataList);
  321. });
  322. return new Promise((resolve, reject) => {
  323. resolve('end');
  324. });
  325. })
  326. .then((res) => {
  327. // console.log(res);
  328. });
  329. };

QingJ © 2025

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