您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Bilibili赛事预测统计,统计胜场和收益等
// ==UserScript== // @name Bilibili赛事预测统计 // @namespace https://www.bilibili.com/ // @version 0.3 // @icon https://www.bilibili.com/favicon.ico // @description Bilibili赛事预测统计,统计胜场和收益等 // @author Ethan // @match https://www.bilibili.com/v/game/match/competition* // @grant unsafeWindow // @supportURL https://greasyfork.org/zh-CN/scripts/445877 // @license MIT // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js /* globals $ */ // ==/UserScript== (function() { 'use strict'; $.ajaxSetup({ xhrFields: { withCredentials: true } }) function getPromise(url) { return new Promise((resolve, reject) => { $.get(url, (data, status) => { if (status === "success") { resolve(data) } else { reject(data) } }) }) } $(document).ready(async () => { // 获取预测信息 console.log("获取预测信息...") const recordList = [] let finishedPageNumber = 1 while (true) { const data = await getPromise(`https://api.bilibili.com/x/esports/guess/collection/record?type=2&pn=${finishedPageNumber}&ps=100`) if (data.code !== 0) { throw "请求失败~" } else if (data.data.record !== null) { finishedPageNumber += 1 recordList.push(...data.data.record) } else { break } } // 统计赛季记录 const seasonRecord = {} for (const record of recordList) { const guess = record.guess[0] const contest = record.contest if (seasonRecord[contest.season.title] === undefined) { seasonRecord[contest.season.title] = { logo: contest.season.logo, totalTime: 0, totalStake: 0, totalIncome: 0, rightTime: 0, rightStake: 0, } } const statistics = seasonRecord[contest.season.title] statistics.totalTime += 1 statistics.totalStake += guess.stake statistics.totalIncome += guess.income if (guess.income !== 0) { statistics.rightTime += 1 statistics.rightStake += guess.stake } } console.log(seasonRecord) // 统计总预测记录 const totalRecord = { totalTime: 0, totalStake: 0, totalIncome: 0, rightTime: 0, rightStake: 0, } for (const key in seasonRecord) { const season = seasonRecord[key] totalRecord.totalTime += season.totalTime totalRecord.totalStake += season.totalStake totalRecord.totalIncome += season.totalIncome totalRecord.rightTime += season.rightTime totalRecord.rightStake += season.rightStake } console.log(totalRecord) /* 渲染DOM */ // 预测历史DOM const competitionDom = document.querySelector("#server-game-app > div.competition-home > div.container-box > div.container-right > div.competition-history") // 总预测标题 const totalRecordTitle = competitionDom.children[0].cloneNode(true) totalRecordTitle.style.marginTop = "30px" totalRecordTitle.children[0].innerText = "总预测" competitionDom.appendChild(totalRecordTitle) // 总预测内容 const totalRecordDom = $(` <div data-v-0c2783df="" data-v-1a97262b="" style="margin-top: 0px"> <ul data-v-0c2783df="" class="tab-content" style="border-top-color: #00a1d6";> <li data-v-0c2783df=""> <div data-v-5f3148a6="" data-v-1a97262b="" class="bili-scroll-box" data-v-0c2783df="" style="height: 108px"> <div data-v-5f3148a6=""> <div data-v-5458153b="" data-v-1a97262b="" data-v-5f3148a6=""> <ul data-v-5458153b="" class="competition-history"> <li data-v-5458153b=""> <ul data-v-5458153b="" class="competition-history-infos"> <li data-v-5458153b=""> <a data-v-5458153b=""> <h3 data-v-5458153b="">历史总预测 --Power By Ethan & 赌狗510</h3> <ul data-v-7b05d613="" data-v-5458153b="" class="competition-history-info"> <li data-v-7b05d613=""> <span data-v-7b05d613="">总预测数</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${totalRecord.totalStake}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">败场预测</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${totalRecord.totalStake - totalRecord.rightStake}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">硬币盈亏</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${(totalRecord.totalIncome - totalRecord.totalStake).toFixed(2)}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> </ul> </a> </li> </ul> </li> </ul> </div> </div> <div class="bscroll-vertical-scrollbar" style="position: absolute; z-index: 9999; width: 7px; bottom: 2px; top: 2px; right: 1px; overflow: hidden; display: none"> <div class="bscroll-indicator" style=" box-sizing: border-box; position: absolute; background: rgba(0, 0, 0, 0.5); border: 1px solid rgba(255, 255, 255, 0.9); border-radius: 3px; width: 100%; transition-duration: 0ms; height: 439px; transform: translateY(0px) translateZ(0px); " ></div> </div> </div> </li> </ul> </div> `)[0] competitionDom.appendChild(totalRecordDom) // 赛季预测标题 const seasonRecordTitle = competitionDom.children[0].cloneNode(true) seasonRecordTitle.style.marginTop = "30px" seasonRecordTitle.children[0].innerText = "赛季预测" competitionDom.appendChild(seasonRecordTitle) // 赛季预测内容 const seasonRecordDom = $(` <div data-v-0c2783df="" data-v-1a97262b="" style="margin-top: 0px"> <ul data-v-0c2783df="" class="tab-content" style="border-top-color: #00a1d6";> <li data-v-0c2783df=""> <div data-v-5f3148a6="" data-v-1a97262b="" class="bili-scroll-box" data-v-0c2783df=""> <div data-v-5f3148a6=""> <div data-v-5458153b="" data-v-1a97262b="" data-v-5f3148a6=""> <ul data-v-5458153b="" class="competition-history"> <li data-v-5458153b=""> <ul data-v-5458153b="" class="competition-history-infos"> <!--此处写入li--> </ul> </li> </ul> </div> </div> </div> </li> </ul> </div> `)[0] competitionDom.appendChild(seasonRecordDom) // 赛季预测元素 const seasonRecordUlDom = seasonRecordDom.children[0].children[0].children[0].children[0].children[0].children[0].children[0].children[0] for (const key in seasonRecord) { const season = seasonRecord[key] seasonRecordUlDom.appendChild($(` <li data-v-5458153b=""> <div data-v-5458153b="" class="competition-history-top" style="padding-top: 24px"> <h3 data-v-5458153b="">${key}</h3> </div> <ul data-v-5458153b="" class="competition-history-infos"> <li data-v-5458153b="" style="padding-top: 5px"> <a data-v-5458153b=""> <ul data-v-7b05d613="" data-v-5458153b="" class="competition-history-info"> <li data-v-7b05d613=""> <span data-v-7b05d613="">总场数</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${season.totalTime}</span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">胜场数</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${season.rightTime}</span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">胜率</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${(season.rightTime / season.totalTime * 100).toFixed(2) + "%"}</span> </i> </li> </ul> </a> </li> <li data-v-5458153b="" style="padding-top: 5px"> <a data-v-5458153b=""> <ul data-v-7b05d613="" data-v-5458153b="" class="competition-history-info"> <li data-v-7b05d613=""> <span data-v-7b05d613="">总硬币</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${season.totalStake}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">败场硬币</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${season.totalStake - season.rightStake}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> <li data-v-7b05d613=""> <span data-v-7b05d613="">硬币盈亏</span> <i data-v-7b05d613=""> <span data-v-7b05d613="">${(season.totalIncome - season.totalStake).toFixed(2)}</span> <span data-v-7b05d613="" class="icon-coin"></span> </i> </li> </ul> </a> </li> </ul> </li> `)[0]) } }) })();