新球体育网亚盘统计

新球体育网(球探)手机端网页,在对赛往绩和近期战绩点击输赢直接跳转到让球页面,让球水位高亮显示,并加入多场比赛的让球命中率统计功能。

// ==UserScript==
// @name         新球体育网亚盘统计
// @namespace    http://dol.freevar.com/
// @version      0.84
// @description  新球体育网(球探)手机端网页,在对赛往绩和近期战绩点击输赢直接跳转到让球页面,让球水位高亮显示,并加入多场比赛的让球命中率统计功能。
// @author       Dolphin
// @run-at       document-idle
// @match        https://m.titan007.com/analy/Analysis/*
// @match        https://m.titan007.com/asian/*
// @match        https://m.titan007.com/Analy/Analysis/*
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // 添加控制按钮
    function addButtons() {
        const parentDiv = document.querySelector('div.btns');

        // 定义按钮配置数组
        const buttons = [
            { id: 'clearBtn', text: '清除', handler: clearStats },
            { id: 'showBtn', text: '显示', handler: showTable },
            { id: 'statBtn', text: '统计', handler: tongJi }
        ];

        // 批量创建并插入按钮
        buttons.forEach(({ id, text, handler }) => {
            const btn = document.createElement('div');
            btn.className = 'btn ctrlStats';
            btn.id = id;
            btn.textContent = text;
            parentDiv.insertBefore(btn,parentDiv.firstChild);
            btn.addEventListener('click', handler);
        });
    }
    // 样式定义
    GM_addStyle(`
        .stats-table {border-collapse: collapse; margin:auto;}
        .stats-table tr:nth-child(odd) {background-color: #eee;}
        .stats-table td, .stats-table th {
            border: 1px solid #ccf;
            font-size: 16px;
            text-align: center;
        }
        .btns .btn {min-width: 50px !important;}
        #clearBtn {background-color:#c00;}
        #showBtn {background-color:#00c;}
        #statBtn {background-color:#0c0;}
        .highlight-green { background-color: #cfc; }
        .highlight-red { background-color: #fcc; }
    `);

    // 清除统计数据
    function clearStats() {
        localStorage.removeItem('asianStats');
        alert("已清除所有统计数据!");
    }

    // 辅助函数:解析让球数值
    function parseHandicap(handicapStr) {
        if (!handicapStr || handicapStr === '-') return null;
        if (!handicapStr.includes('/')) return parseFloat(handicapStr);

        let isNegative = false;
        if (handicapStr.startsWith('-')) {
            isNegative = true;
            handicapStr = handicapStr.substring(1);
        }

        const parts = handicapStr.split('/').map(Number);
        const avg = (parts[0] + parts[1]) / 2;
        return isNegative ? -avg : avg;
    }

    // 辅助函数:判断是否命中
    function isHit(diff, handicapValue, homeOdds, awayOdds) {
        if (diff === handicapValue) return true;
        if (diff > handicapValue) return parseFloat(homeOdds) < parseFloat(awayOdds);
        if (diff < handicapValue) return parseFloat(awayOdds) < parseFloat(homeOdds);
        return false;
    }

    // 统计功能
    function tongJi() {
        const homeElem = document.getElementById('homeScore');
        const guestElem = document.getElementById('guestScore');
        if (!homeElem || !guestElem) return alert("没有比分!");

        const home = parseInt(homeElem.textContent);
        const guest = parseInt(guestElem.textContent);
        const diff = home - guest;

        // 获取所有公司数据
        const stats = JSON.parse(localStorage.getItem('asianStats')) || {};
        let allMiss = true;

        // 遍历公司
        document.querySelectorAll('#oddsCompany > div[id^="main_"][id$="_0"]').forEach(companyDiv => {
            const companyName = companyDiv.querySelector('.companyName').textContent.trim();
            const cid = companyDiv.id.split('_')[1];
            if (!stats[companyName]) stats[companyName] = { initial: { count:0, hit:0 }, immediate: { count:0, hit:0 } };

            // 获取盘口数据
            const dataDiv = document.querySelector(`#oddsData > div[onclick*="ShowMainOddsDetail(0,${cid}"]`);
            if (!dataDiv) return;

            // 处理初盘
            const initialData = dataDiv.querySelectorAll('.oddsdata')[0];
            if (initialData) {
                const homeOdds = initialData.children[0].textContent;
                const handicap = initialData.children[1].textContent;
                const awayOdds = initialData.children[2].textContent;
                const handicapValue = parseHandicap(handicap);

                if (handicapValue !== null && homeOdds !== '-' && awayOdds !== '-') {
                    stats[companyName].initial.count++;
                    if (isHit(diff, handicapValue, homeOdds, awayOdds)) {
                        stats[companyName].initial.hit++;
                        allMiss = false;
                    }
                }
            }

            // 处理即时盘
            const immediateData = dataDiv.querySelectorAll('.oddsdata')[1];
            if (immediateData) {
                const homeOdds = immediateData.children[0].textContent;
                const handicap = immediateData.children[1].textContent;
                const awayOdds = immediateData.children[2].textContent;
                const handicapValue = parseHandicap(handicap);

                if (handicapValue !== null && homeOdds !== '-' && awayOdds !== '-') {
                    stats[companyName].immediate.count++;
                    if (isHit(diff, handicapValue, homeOdds, awayOdds)) {
                        stats[companyName].immediate.hit++;
                    }
                }
            }
        });

        localStorage.setItem('asianStats', JSON.stringify(stats));
        if (allMiss) alert("本场比赛全部公司的初盘均未命中!");
        window.close();
    }

    // 显示/隐藏功能
    let tablesVisible = false;
    function showTable() {
        const contentDiv = document.getElementById('content');
        if (tablesVisible) {
            contentDiv.querySelectorAll('.stats-table').forEach(t => t.remove());
            tablesVisible = false;
            document.getElementById('showBtn').textContent = '显示';
            return;
        }

        const stats = JSON.parse(localStorage.getItem('asianStats')) || {};

        // 创建表格
        const createTable = (type) => {
            let typeCap = type === 'initial'? '初':'即';
            const table = document.createElement('table');
            table.className = 'stats-table';
            table.innerHTML = `<tr><th>公司</th><th>${typeCap}开</th><th>${typeCap}中</th><th>命中率</th><th>主队</th><th>让球</th><th>客队</th></tr>`;

            Object.entries(stats).forEach(([name, data]) => {
                const row = table.insertRow();
                const typeData = data[type];
                const oddsDiv = [...document.querySelectorAll('#oddsCompany > div[id^="main_"][id$="_0"]')]
                    .find(d => d.querySelector('.companyName').textContent.trim() === name);

                // 获取当前盘口数据
                let home = '-', handicap = '-', away = '-';
                if (oddsDiv) {
                    const cid = oddsDiv.id.split('_')[1];
                    const dataDiv = document.querySelector(`#oddsData > div[onclick*="ShowMainOddsDetail(0,${cid}"]`);
                    const targetData = dataDiv.querySelectorAll('.oddsdata')[type === 'initial' ? 0 : 1];
                    if (targetData) {
                        home = targetData.children[0].textContent;
                        handicap = targetData.children[1].textContent;
                        away = targetData.children[2].textContent;
                    }
                }

                // 添加数据
                row.innerHTML = `
                    <td>${name}</td>
                    <td>${typeData.count}</td>
                    <td>${typeData.hit}</td>
                    <td>${typeData.count ? (typeData.hit/typeData.count*100).toFixed(1)+'%' : '-'}</td>
                    <td class="home-cell">${home}</td>
                    <td>${handicap}</td>
                    <td class="away-cell">${away}</td>
                `;

                // 设置颜色
                if (home !== '-' && away !== '-') {
                    const homeCell = row.querySelector('.home-cell');
                    const awayCell = row.querySelector('.away-cell');
                    if (parseFloat(home) < parseFloat(away)) {
                        homeCell.style.backgroundColor = '#cfc';
                        awayCell.style.backgroundColor = '#fcc';
                    } else if (parseFloat(home) > parseFloat(away)) {
                        homeCell.style.backgroundColor = '#fcc';
                        awayCell.style.backgroundColor = '#cfc';
                    }
                }
            });

            return table;
        };

        contentDiv.insertBefore(createTable('immediate'), contentDiv.firstChild);
        contentDiv.insertBefore(createTable('initial'), contentDiv.firstChild);
        tablesVisible = true;
        document.getElementById('showBtn').textContent = '隐藏';
    }

    // 提取参数并绑定点击事件
    function bindClicks() {
        // 选择所有包含 GoAnalyUrl(数字) 的 tr 元素
        const targetTrs = document.querySelectorAll('tr[onclick*="GoAnalyUrl("]');

        targetTrs.forEach(tr => {
            // 提取 onclick 中的数字参数
            const onClickAttr = tr.getAttribute('onclick');
            const paramMatch = onClickAttr.match(/GoAnalyUrl\((\d+)\)/);
            if (!paramMatch) return;

            const id = paramMatch[1]; // 提取 ID

            // 获取第五个 td(索引从 0 开始)
            const tds = tr.querySelectorAll('td');
            if (tds.length < 5) return;

            const fifthTd = tds[4];

            // 防止重复绑定
            if (fifthTd._hasClickHandler) return;
            fifthTd._hasClickHandler = true;

            // 添加点击事件
            fifthTd.addEventListener('click', (e) => {
                e.preventDefault();
                e.stopPropagation(); // 阻止冒泡触发 tr 的点击事件
                window.open(`https://m.titan007.com/asian/${id}.htm`, '_blank');
            });
        });
    }

    // 初始化
    if(location.href.startsWith('https://m.titan007.com/asian/')) {
        addButtons();
    }else if(location.href.startsWith('https://m.titan007.com/analy/Analysis/')||location.href.startsWith('https://m.titan007.com/Analy/Analysis/')){
        setTimeout(bindClicks,2000);
    }
})();

QingJ © 2025

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