您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
B城赛马小游戏自动投注,解放双手,新勋章兑换再也不是梦想!
// ==UserScript== // @name B城赛马自动投注 // @namespace https://imyes.cn/ // @version 1.2 // @description B城赛马小游戏自动投注,解放双手,新勋章兑换再也不是梦想! // @author 陈小锅 // @license MIT // @match *://*/horse_racing* // @icon data:image/gif;base64,R0lGODlhQABAAIABAAAAAP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYjdjNjRjY2Y5LCAyMDI0LzA3LzE2LTEyOjM5OjA0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjYuMCAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowRTU1NDgzMDhCOUExMUYwODkzMjlDREYzQUQ3RDZBOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowRTU1NDgzMThCOUExMUYwODkzMjlDREYzQUQ3RDZBOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjBFNTU0ODJFOEI5QTExRjA4OTMyOUNERjNBRDdENkE4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjBFNTU0ODJGOEI5QTExRjA4OTMyOUNERjNBRDdENkE4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAQAAAQAsAAAAAEAAQAAAAv+Mj6nL7Q+jnLTaiy/I3IK/daIDluOZlCZ6qi4rui+cyTNd2TKe6zsf8QVswIdw+CsujgaiMuWE3p66RlR5XSaBWe2W1mVUcWFrufNFrA7nWpq9br7dU2kcWefM5Sp7P7bH9+GV51GoAGIWCLFIMaZxiNFGEkn313PJMolYidbJmWkUSpg40Qj3qPbpNxjks7bJKvFKW2q6ilfLNLuqS2t4p2ji2+qIW6cLHCz2lno7ylwG7bosfKpcTO0MOE25rYfL2o2djXnNOM577m0LHs5eblltPE8e4t7OXa8dj59v/s/TPlGZiBGTl82gL4T3cincBTDhw1+SpkykCKngRYgN9OJs5PgkpMiRJB8UAAA7 // @grant none // ==/UserScript== (function() { 'use strict'; // 标记变量:是否正在执行投注操作 let isBetting = false; // 用于倒计时更新的定时器 let refreshCountdownTimer; // 初始为600秒(10分钟) let timeUntilRefresh = 600; // 'manual'表示自选,'random'表示随机,'odds'表示按赔率,默认为自选 let selectionMode = 'manual'; // 赔率选择类型:'high'高赔率, 'low'低赔率,默认为高赔率 let oddsSelectionType = 'high'; // 默认选号 const DEFAULT_NUMBERS = [22, 23, 24]; // 获取保存的选号设置(从localStorage读取或使用默认值) function getSavedNumbers() { const storedNumbers = localStorage.getItem('horseRacingNumbers'); if (storedNumbers) { try { const parsedNumbers = JSON.parse(storedNumbers); // 验证解析后的数字是否有效 if (Array.isArray(parsedNumbers) && parsedNumbers.length >= 3) { return parsedNumbers; } } catch (e) { console.error('解析选号设置失败:', e); } } return DEFAULT_NUMBERS; } // 更新刷新倒计时显示的函数 function updateRefreshCountdown() { const countdownElement = document.getElementById('refreshCountdown'); if (countdownElement) { // 将秒转换为分:秒格式 const minutes = Math.floor(timeUntilRefresh / 60); const seconds = timeUntilRefresh % 60; countdownElement.textContent = `下次刷新: ${minutes}:${seconds.toString().padStart(2, '0')}`; } // 倒计时减1 timeUntilRefresh--; // 当倒计时为0时重置为600秒 if (timeUntilRefresh < 0) { timeUntilRefresh = 600; } } // 工具函数:检查元素是否存在并包含特定文本 function checkElementExists(selector, textContent = null) { const element = document.querySelector(selector); if (!element) return false; if (textContent === null) return true; return element.textContent.includes(textContent); } // 获取奖池阈值(从localStorage读取或使用默认值) function getPrizePoolThreshold() { const storedThreshold = localStorage.getItem('horseRacingPrizePoolThreshold'); return storedThreshold ? parseInt(storedThreshold, 10) : 200000; } // 工具函数:获取元素文本内容 function getElementText(selector) { const element = document.querySelector(selector); return element ? element.textContent.trim() : ''; } // 工具函数:点击元素 function clickElement(selector) { const element = document.querySelector(selector); if (element) { element.click(); console.log(`点击了元素: ${selector}`); return true; } console.log(`元素未找到: ${selector}`); return false; } // 创建悬浮提示框函数 function createFloatTip(message) { // 检查是否已存在提示框,如果有则移除 const existingTip = document.getElementById('prizePoolTip'); if (existingTip) { existingTip.remove(); } // 创建新的提示框 const tip = document.createElement('div'); tip.id = 'prizePoolTip'; tip.style.position = 'fixed'; tip.style.top = '50px'; tip.style.left = '50%'; tip.style.transform = 'translateX(-50%)'; tip.style.padding = '20px'; // 设置为半透明背景色 (rgba格式,最后一个参数是透明度,0.8表示80%不透明) tip.style.backgroundColor = 'rgba(255, 107, 107, 0.8)' tip.style.color = 'white'; tip.style.borderRadius = '8px'; tip.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; tip.style.zIndex = '9999'; tip.style.fontSize = '16px'; tip.style.fontWeight = 'bold'; tip.textContent = message; // 添加到页面 document.body.appendChild(tip); // 3秒后自动移除 setTimeout(() => { if (document.body.contains(tip)) { tip.style.opacity = '0'; tip.style.transition = 'opacity 0.5s ease'; setTimeout(() => { if (document.body.contains(tip)) { document.body.removeChild(tip); } }, 500); } }, 3000); } // 全局变量,用于存储状态更新函数 let updateStatusFunction = null; // 全局变量,用于存储日志信息 let currentLog = ''; // 创建可拖拽的悬浮设定窗口 function createSettingsPanel() { // 检查是否已存在设置窗口,如果有则移除 const existingPanel = document.getElementById('settingsPanel'); if (existingPanel) { existingPanel.remove(); } // 创建设置窗口 const panel = document.createElement('div'); panel.id = 'settingsPanel'; panel.style.position = 'fixed'; panel.style.top = '150px'; panel.style.right = '50px'; panel.style.width = '220px'; panel.style.backgroundColor = '#ffffff'; panel.style.border = '2px solid #dddddd'; panel.style.borderRadius = '8px'; panel.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; panel.style.zIndex = '9998'; panel.style.fontSize = '13px'; panel.style.color = '#333333'; panel.style.userSelect = 'none'; // 添加标题栏(可拖拽区域) const titleBar = document.createElement('div'); titleBar.style.padding = '8px 12px'; titleBar.style.backgroundColor = '#4CAF50'; titleBar.style.color = 'white'; titleBar.style.borderTopLeftRadius = '6px'; titleBar.style.borderTopRightRadius = '6px'; titleBar.style.cursor = 'move'; titleBar.style.fontWeight = 'bold'; titleBar.style.fontSize = '12px'; titleBar.style.display = 'flex'; titleBar.style.alignItems = 'center'; const titleText = document.createElement('span'); titleText.textContent = '赛马自动投注'; titleBar.appendChild(titleText); // 添加折叠按钮 const collapseButton = document.createElement('div'); collapseButton.id = 'collapseButton'; collapseButton.style.marginLeft = 'auto'; collapseButton.style.width = '20px'; collapseButton.style.height = '20px'; collapseButton.style.display = 'flex'; collapseButton.style.alignItems = 'center'; collapseButton.style.justifyContent = 'center'; collapseButton.style.cursor = 'pointer'; collapseButton.style.borderRadius = '4px'; collapseButton.style.backgroundColor = 'rgba(255, 255, 255, 0.2)'; collapseButton.style.transition = 'all 0.2s ease'; const collapseIcon = document.createElement('span'); collapseIcon.textContent = '▼'; collapseIcon.style.fontSize = '10px'; collapseIcon.style.fontWeight = 'bold'; collapseIcon.id = 'collapseIcon'; collapseButton.appendChild(collapseIcon); titleBar.appendChild(collapseButton); panel.appendChild(titleBar); // 添加运行状态指示器 const statusIndicator = document.createElement('div'); statusIndicator.id = 'scriptStatusIndicator'; statusIndicator.style.padding = '6px 12px'; statusIndicator.style.backgroundColor = '#f5f5f5'; statusIndicator.style.display = 'flex'; statusIndicator.style.alignItems = 'center'; statusIndicator.style.gap = '6px'; const statusDot = document.createElement('div'); statusDot.style.width = '12px'; statusDot.style.height = '12px'; statusDot.style.borderRadius = '50%'; const statusText = document.createElement('span'); statusText.style.fontSize = '12px'; statusText.style.color = '#666'; // 添加刷新倒计时显示 const refreshCountdown = document.createElement('span'); refreshCountdown.id = 'refreshCountdown'; refreshCountdown.style.fontSize = '11px'; refreshCountdown.style.color = '#888'; refreshCountdown.style.marginLeft = 'auto'; // 右对齐 refreshCountdown.textContent = '下次刷新: --:--'; statusIndicator.appendChild(statusDot); statusIndicator.appendChild(statusText); statusIndicator.appendChild(refreshCountdown); panel.appendChild(statusIndicator); // 添加日志显示区域 const logDisplay = document.createElement('div'); logDisplay.id = 'scriptLogDisplay'; logDisplay.style.padding = '6px 12px'; logDisplay.style.backgroundColor = '#f9f9f9'; logDisplay.style.borderBottom = '1px solid #eee'; const logLabel = document.createElement('div'); logLabel.style.fontSize = '11px'; logLabel.style.color = '#888'; logLabel.style.marginBottom = '4px'; logLabel.textContent = '最新状态:'; logDisplay.appendChild(logLabel); const logText = document.createElement('div'); logText.id = 'currentLogText'; logText.style.fontSize = '11px'; logText.style.color = '#555'; logText.style.maxHeight = '60px'; logText.style.overflow = 'hidden'; logText.textContent = currentLog || '脚本已加载'; logDisplay.appendChild(logText); panel.appendChild(logDisplay); // 更新日志显示 window.updateLogDisplay = function(message) { currentLog = message; const logElement = document.getElementById('currentLogText'); if (logElement) { logElement.textContent = message; // 添加淡入动画效果 logElement.style.opacity = '0.5'; setTimeout(() => { if (logElement) logElement.style.opacity = '1'; }, 100); } }; // 更新状态显示 function updateStatusDisplay() { const isEnabled = localStorage.getItem('horseRacingScriptEnabled') === 'true'; const isActive = window.checkInterval !== null; if (isEnabled && isActive) { statusDot.style.backgroundColor = '#4CAF50'; // 绿色 statusText.textContent = '运行中'; } else { statusDot.style.backgroundColor = '#f44336'; // 红色 statusText.textContent = '已停止'; } } // 保存更新状态函数的引用到全局变量 updateStatusFunction = updateStatusDisplay; // 初始更新状态 updateStatusDisplay(); // 添加状态更新监听器 window.addEventListener('storage', function(e) { if (e.key === 'horseRacingScriptEnabled') { updateStatusDisplay(); } }); // 创建内容区域(可折叠的部分) const content = document.createElement('div'); content.id = 'settingsContent'; content.style.padding = '12px'; panel.appendChild(content); // 添加折叠/展开功能 // 从localStorage读取保存的折叠状态,如果没有则默认为false let isCollapsed = localStorage.getItem('horseRacingPanelCollapsed') === 'true'; // 初始化时应用保存的折叠状态 if (isCollapsed) { collapseIcon.textContent = '▶'; content.style.display = 'none'; panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.1)'; collapseButton.style.backgroundColor = 'rgba(255, 255, 255, 0.3)'; // 添加底部圆角效果 logDisplay.style.borderBottomLeftRadius = '6px'; logDisplay.style.borderBottomRightRadius = '6px'; } else { collapseIcon.textContent = '▼'; content.style.display = 'block'; panel.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; collapseButton.style.backgroundColor = 'rgba(255, 255, 255, 0.2)'; logDisplay.style.borderBottomLeftRadius = '0'; logDisplay.style.borderBottomRightRadius = '0'; } collapseButton.onclick = function(e) { e.stopPropagation(); // 防止触发拖拽 isCollapsed = !isCollapsed; if (isCollapsed) { // 折叠状态 collapseIcon.textContent = '▶'; content.style.display = 'none'; panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.1)'; collapseButton.style.backgroundColor = 'rgba(255, 255, 255, 0.3)'; // 添加底部圆角效果 logDisplay.style.borderBottomLeftRadius = '6px'; logDisplay.style.borderBottomRightRadius = '6px'; // 保存折叠状态到localStorage localStorage.setItem('horseRacingPanelCollapsed', 'true'); } else { // 展开状态 collapseIcon.textContent = '▼'; content.style.display = 'block'; panel.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)'; collapseButton.style.backgroundColor = 'rgba(255, 255, 255, 0.2)'; // 恢复原始样式 logDisplay.style.borderBottomLeftRadius = '0'; logDisplay.style.borderBottomRightRadius = '0'; // 保存展开状态到localStorage localStorage.setItem('horseRacingPanelCollapsed', 'false'); } }; // 悬停效果 collapseButton.onmouseenter = function() { this.style.backgroundColor = 'rgba(255, 255, 255, 0.4)'; }; collapseButton.onmouseleave = function() { this.style.backgroundColor = isCollapsed ? 'rgba(255, 255, 255, 0.3)' : 'rgba(255, 255, 255, 0.2)'; }; // 添加奖池阈值设置 const thresholdLabel = document.createElement('div'); thresholdLabel.style.marginBottom = '6px'; thresholdLabel.style.fontSize = '12px'; thresholdLabel.textContent = '奖池高于多少开始下注:'; content.appendChild(thresholdLabel); const thresholdInput = document.createElement('input'); thresholdInput.type = 'number'; thresholdInput.id = 'prizePoolThreshold'; // 从localStorage读取保存的值,如果没有则使用默认值200000 thresholdInput.value = getPrizePoolThreshold(); thresholdInput.style.width = 'calc(100% - 16px)'; // 考虑内边距 thresholdInput.style.padding = '6px'; thresholdInput.style.border = '1px solid #ccc'; thresholdInput.style.borderRadius = '4px'; thresholdInput.style.marginBottom = '12px'; thresholdInput.style.fontSize = '12px'; content.appendChild(thresholdInput); // 添加选择模式切换按钮(随机/自选) const modeContainer = document.createElement('div'); modeContainer.style.display = 'flex'; modeContainer.style.gap = '8px'; modeContainer.style.marginBottom = '12px'; content.appendChild(modeContainer); // 创建随机按钮 const randomButton = document.createElement('button'); randomButton.id = 'randomModeButton'; randomButton.textContent = '随机'; randomButton.style.flex = '1'; randomButton.style.padding = '6px'; randomButton.style.backgroundColor = '#f0f0f0'; randomButton.style.color = '#666'; randomButton.style.border = '1px solid #ccc'; randomButton.style.borderRadius = '4px'; randomButton.style.cursor = 'pointer'; randomButton.style.fontSize = '11px'; // 创建自选按钮 const manualButton = document.createElement('button'); manualButton.id = 'manualModeButton'; manualButton.textContent = '自选'; manualButton.style.flex = '1'; manualButton.style.padding = '6px'; manualButton.style.backgroundColor = '#4CAF50'; manualButton.style.color = 'white'; manualButton.style.border = '1px solid #4CAF50'; manualButton.style.borderRadius = '4px'; manualButton.style.cursor = 'pointer'; manualButton.style.fontSize = '11px'; // 创建按赔率按钮 const oddsButton = document.createElement('button'); oddsButton.id = 'oddsModeButton'; oddsButton.textContent = '按赔率'; oddsButton.style.flex = '1'; oddsButton.style.padding = '6px'; oddsButton.style.backgroundColor = '#f0f0f0'; oddsButton.style.color = '#666'; oddsButton.style.border = '1px solid #ccc'; oddsButton.style.borderRadius = '4px'; oddsButton.style.cursor = 'pointer'; oddsButton.style.fontSize = '11px'; // 添加点击事件处理 randomButton.onclick = function() { // 更新选择模式 selectionMode = 'random'; // 更新按钮样式 randomButton.style.backgroundColor = '#4CAF50'; randomButton.style.color = 'white'; randomButton.style.borderColor = '#4CAF50'; manualButton.style.backgroundColor = '#f0f0f0'; manualButton.style.color = '#666'; manualButton.style.borderColor = '#ccc'; oddsButton.style.backgroundColor = '#f0f0f0'; oddsButton.style.color = '#666'; oddsButton.style.borderColor = '#ccc'; // 隐藏选号部分 numbersContainer.style.display = 'none'; // 隐藏赔率选择部分 if (oddsSelectionContainer) { oddsSelectionContainer.style.display = 'none'; } // 隐藏赔率模式倍率选择容器 if (oddsMultiplierContainer) { oddsMultiplierContainer.style.display = 'none'; } // 如果随机倍率选择容器不存在,创建它 if (!randomMultiplierContainer) { randomMultiplierContainer = document.createElement('div'); randomMultiplierContainer.style.display = 'flex'; randomMultiplierContainer.style.flexDirection = 'column'; randomMultiplierContainer.style.marginBottom = '12px'; numbersLabel.parentNode.insertBefore(randomMultiplierContainer, numbersContainer); // 创建倍率选择标签 const multiplierLabel = document.createElement('div'); multiplierLabel.style.marginBottom = '6px'; multiplierLabel.style.fontSize = '12px'; multiplierLabel.textContent = '随机模式倍率:'; randomMultiplierContainer.appendChild(multiplierLabel); // 创建倍率选择下拉框 randomMultiplierSelect = document.createElement('select'); randomMultiplierSelect.id = 'randomMultiplierSelect'; randomMultiplierSelect.style.width = '100%'; randomMultiplierSelect.style.padding = '4px'; randomMultiplierSelect.style.fontSize = '11px'; // 添加倍率选项 const multiplierOptions = [1, 2, 3, 4, 5, 10, 20, 50]; multiplierOptions.forEach(multiplier => { const option = document.createElement('option'); option.value = multiplier; option.textContent = `${multiplier}倍`; randomMultiplierSelect.appendChild(option); }); // 从localStorage读取保存的随机模式倍率 const storedRandomMultiplier = localStorage.getItem('horseRacingRandomMultiplier'); if (storedRandomMultiplier) { randomMultiplierSelect.value = storedRandomMultiplier; } // 添加change事件以保存选择 randomMultiplierSelect.onchange = function() { localStorage.setItem('horseRacingRandomMultiplier', this.value); }; randomMultiplierContainer.appendChild(randomMultiplierSelect); } else { // 显示随机倍率选择容器 randomMultiplierContainer.style.display = 'flex'; } // 保存选择模式到localStorage localStorage.setItem('horseRacingSelectionMode', 'random'); }; manualButton.onclick = function() { // 更新选择模式 selectionMode = 'manual'; // 更新按钮样式 manualButton.style.backgroundColor = '#4CAF50'; manualButton.style.color = 'white'; manualButton.style.borderColor = '#4CAF50'; randomButton.style.backgroundColor = '#f0f0f0'; randomButton.style.color = '#666'; randomButton.style.borderColor = '#ccc'; oddsButton.style.backgroundColor = '#f0f0f0'; oddsButton.style.color = '#666'; oddsButton.style.borderColor = '#ccc'; // 启用选号输入框 const numberInputs = document.querySelectorAll('#horseNumber1, #horseNumber2, #horseNumber3'); numberInputs.forEach(input => { input.disabled = false; input.style.backgroundColor = 'white'; input.style.color = '#333'; }); // 显示选号部分,隐藏赔率选择部分、随机倍率选择部分和赔率模式倍率选择部分 if (oddsSelectionContainer) { oddsSelectionContainer.style.display = 'none'; } if (randomMultiplierContainer) { randomMultiplierContainer.style.display = 'none'; } if (oddsMultiplierContainer) { oddsMultiplierContainer.style.display = 'none'; } numbersContainer.style.display = 'flex'; // 保存选择模式到localStorage localStorage.setItem('horseRacingSelectionMode', 'manual'); }; // 添加按赔率按钮点击事件 let oddsSelectionContainer; let highOddsButton; let lowOddsButton; let oddsSelectionType = 'high'; // 默认选择高赔率 let randomMultiplierContainer; let randomMultiplierSelect; let oddsMultiplierContainer; let oddsMultiplierSelect; let defaultOddsMultiplier = 1; // 默认赔率模式倍率为1倍 oddsButton.onclick = function() { // 更新选择模式 selectionMode = 'odds'; // 更新按钮样式 oddsButton.style.backgroundColor = '#4CAF50'; oddsButton.style.color = 'white'; oddsButton.style.borderColor = '#4CAF50'; randomButton.style.backgroundColor = '#f0f0f0'; randomButton.style.color = '#666'; randomButton.style.borderColor = '#ccc'; manualButton.style.backgroundColor = '#f0f0f0'; manualButton.style.color = '#666'; manualButton.style.borderColor = '#ccc'; // 禁用选号输入框 const numberInputs = document.querySelectorAll('#horseNumber1, #horseNumber2, #horseNumber3'); numberInputs.forEach(input => { input.disabled = true; input.style.backgroundColor = '#f5f5f5'; input.style.color = '#999'; }); // 隐藏选号部分 numbersContainer.style.display = 'none'; // 隐藏随机倍率选择部分 if (randomMultiplierContainer) { randomMultiplierContainer.style.display = 'none'; } // 如果赔率选择容器不存在,创建它 if (!oddsSelectionContainer) { oddsSelectionContainer = document.createElement('div'); oddsSelectionContainer.style.display = 'flex'; oddsSelectionContainer.style.gap = '4px'; oddsSelectionContainer.style.marginBottom = '12px'; numbersLabel.parentNode.insertBefore(oddsSelectionContainer, numbersContainer); // 创建高赔率按钮 highOddsButton = document.createElement('button'); highOddsButton.id = 'highOddsButton'; highOddsButton.textContent = '高赔率'; highOddsButton.style.flex = '1'; highOddsButton.style.padding = '6px'; highOddsButton.style.backgroundColor = '#4CAF50'; highOddsButton.style.color = 'white'; highOddsButton.style.border = '1px solid #4CAF50'; highOddsButton.style.borderRadius = '4px'; highOddsButton.style.cursor = 'pointer'; highOddsButton.style.fontSize = '11px'; // 创建低赔率按钮 lowOddsButton = document.createElement('button'); lowOddsButton.id = 'lowOddsButton'; lowOddsButton.textContent = '低赔率'; lowOddsButton.style.flex = '1'; lowOddsButton.style.padding = '6px'; lowOddsButton.style.backgroundColor = '#f0f0f0'; lowOddsButton.style.color = '#666'; lowOddsButton.style.border = '1px solid #ccc'; lowOddsButton.style.borderRadius = '4px'; lowOddsButton.style.cursor = 'pointer'; lowOddsButton.style.fontSize = '11px'; // 添加高赔率按钮点击事件 highOddsButton.onclick = function() { oddsSelectionType = 'high'; highOddsButton.style.backgroundColor = '#4CAF50'; highOddsButton.style.color = 'white'; highOddsButton.style.borderColor = '#4CAF50'; lowOddsButton.style.backgroundColor = '#f0f0f0'; lowOddsButton.style.color = '#666'; lowOddsButton.style.borderColor = '#ccc'; localStorage.setItem('horseRacingOddsSelectionType', 'high'); }; // 添加低赔率按钮点击事件 lowOddsButton.onclick = function() { oddsSelectionType = 'low'; lowOddsButton.style.backgroundColor = '#4CAF50'; lowOddsButton.style.color = 'white'; lowOddsButton.style.borderColor = '#4CAF50'; highOddsButton.style.backgroundColor = '#f0f0f0'; highOddsButton.style.color = '#666'; highOddsButton.style.borderColor = '#ccc'; localStorage.setItem('horseRacingOddsSelectionType', 'low'); }; oddsSelectionContainer.appendChild(highOddsButton); oddsSelectionContainer.appendChild(lowOddsButton); // 从localStorage读取保存的赔率选择类型 const storedOddsType = localStorage.getItem('horseRacingOddsSelectionType'); if (storedOddsType === 'low') { lowOddsButton.click(); } else { highOddsButton.click(); } } else { // 显示赔率选择容器 oddsSelectionContainer.style.display = 'flex'; } // 如果赔率模式倍率选择容器不存在,创建它 if (!oddsMultiplierContainer) { oddsMultiplierContainer = document.createElement('div'); oddsMultiplierContainer.style.display = 'flex'; oddsMultiplierContainer.style.flexDirection = 'column'; oddsMultiplierContainer.style.marginBottom = '12px'; numbersLabel.parentNode.insertBefore(oddsMultiplierContainer, numbersContainer); // 创建赔率模式倍率选择标签 const oddsMultiplierLabel = document.createElement('div'); oddsMultiplierLabel.style.marginBottom = '6px'; oddsMultiplierLabel.style.fontSize = '12px'; oddsMultiplierLabel.textContent = '赔率模式倍率:'; oddsMultiplierContainer.appendChild(oddsMultiplierLabel); // 创建赔率模式倍率选择下拉框 oddsMultiplierSelect = document.createElement('select'); oddsMultiplierSelect.id = 'oddsMultiplierSelect'; oddsMultiplierSelect.style.width = '100%'; oddsMultiplierSelect.style.padding = '4px'; oddsMultiplierSelect.style.fontSize = '11px'; // 添加倍率选项 const multiplierOptions = [1, 2, 3, 4, 5, 10, 20, 50]; multiplierOptions.forEach(multiplier => { const option = document.createElement('option'); option.value = multiplier; option.textContent = `${multiplier}倍`; oddsMultiplierSelect.appendChild(option); }); // 从localStorage读取保存的赔率模式倍率 const storedOddsMultiplier = localStorage.getItem('horseRacingOddsMultiplier'); if (storedOddsMultiplier) { oddsMultiplierSelect.value = storedOddsMultiplier; } else { oddsMultiplierSelect.value = defaultOddsMultiplier; } // 添加change事件以保存选择 oddsMultiplierSelect.onchange = function() { localStorage.setItem('horseRacingOddsMultiplier', this.value); }; oddsMultiplierContainer.appendChild(oddsMultiplierSelect); } else { // 显示赔率模式倍率选择容器 oddsMultiplierContainer.style.display = 'flex'; } // 保存选择模式到localStorage localStorage.setItem('horseRacingSelectionMode', 'odds'); }; modeContainer.appendChild(randomButton); modeContainer.appendChild(manualButton); modeContainer.appendChild(oddsButton); // 添加选号设置 const numbersLabel = document.createElement('div'); numbersLabel.style.marginBottom = '6px'; numbersLabel.style.fontSize = '12px'; numbersLabel.textContent = '选号:'; content.appendChild(numbersLabel); // 创建选号输入框容器 const numbersContainer = document.createElement('div'); numbersContainer.style.display = 'flex'; numbersContainer.style.gap = '4px'; numbersContainer.style.marginBottom = '12px'; content.appendChild(numbersContainer); // 创建三个选号输入框 const numberInputs = []; const multiplierSelects = []; const savedNumbers = getSavedNumbers(); // 获取保存的倍数设置(从localStorage读取或使用默认值[1, 1, 1]) function getSavedMultipliers() { const storedMultipliers = localStorage.getItem('horseRacingMultipliers'); if (storedMultipliers) { try { const parsedMultipliers = JSON.parse(storedMultipliers); // 验证解析后的倍数是否有效 if (Array.isArray(parsedMultipliers) && parsedMultipliers.length >= 3) { return parsedMultipliers; } } catch (e) { console.error('解析倍数设置失败:', e); } } return [1, 1, 1]; // 默认都是1倍 } const savedMultipliers = getSavedMultipliers(); for (let i = 0; i < 3; i++) { // 创建输入框和倍数选择的容器 const inputContainer = document.createElement('div'); inputContainer.style.display = 'flex'; inputContainer.style.flexDirection = 'column'; inputContainer.style.width = 'calc(33.33% - 3px)'; // 考虑间距 const numberInput = document.createElement('input'); numberInput.type = 'number'; numberInput.id = `horseNumber${i + 1}`; numberInput.min = '1'; numberInput.max = '36'; numberInput.value = savedNumbers[i] || DEFAULT_NUMBERS[i]; numberInput.style.width = '100%'; numberInput.style.padding = '6px'; numberInput.style.border = '1px solid #ccc'; numberInput.style.borderRadius = '4px'; numberInput.style.fontSize = '12px'; numberInput.style.boxSizing = 'border-box'; // 添加输入验证,确保只能输入1-36的数字 numberInput.oninput = function() { let value = parseInt(this.value, 10); if (isNaN(value) || value < 1) { this.value = 1; } else if (value > 36) { this.value = 36; } }; // 创建倍数选择下拉菜单 const multiplierSelect = document.createElement('select'); multiplierSelect.id = `multiplier${i + 1}`; multiplierSelect.style.width = '100%'; multiplierSelect.style.padding = '4px'; multiplierSelect.style.border = '1px solid #ccc'; multiplierSelect.style.borderRadius = '4px'; multiplierSelect.style.fontSize = '10px'; multiplierSelect.style.marginTop = '2px'; multiplierSelect.style.boxSizing = 'border-box'; // 倍数选项 const multipliers = [1, 2, 3, 4, 5, 10, 20, 50]; multipliers.forEach(multiplier => { const option = document.createElement('option'); option.value = multiplier; option.textContent = `${multiplier}倍`; multiplierSelect.appendChild(option); }); // 使用保存的倍数设置,如果没有则默认为1倍 multiplierSelect.value = savedMultipliers[i] || 1; // 将输入框和倍数选择添加到容器中 inputContainer.appendChild(numberInput); inputContainer.appendChild(multiplierSelect); numbersContainer.appendChild(inputContainer); numberInputs.push(numberInput); multiplierSelects.push(multiplierSelect); } // 添加保存按钮 const saveButton = document.createElement('button'); saveButton.textContent = '保存设置'; saveButton.style.width = 'calc(100%)'; // 与阈值输入框保持一致的宽度计算 saveButton.style.padding = '8px'; saveButton.style.margin = '0'; saveButton.style.backgroundColor = '#4CAF50'; saveButton.style.color = 'white'; saveButton.style.border = 'none'; saveButton.style.borderRadius = '4px'; saveButton.style.cursor = 'pointer'; saveButton.style.fontWeight = 'bold'; saveButton.style.fontSize = '12px'; saveButton.onclick = function() { const newThreshold = parseInt(thresholdInput.value, 10); if (!isNaN(newThreshold) && newThreshold > 0) { // 保存奖池阈值到localStorage localStorage.setItem('horseRacingPrizePoolThreshold', newThreshold); // 保存选号到localStorage const numbers = numberInputs.map(input => parseInt(input.value, 10)); localStorage.setItem('horseRacingNumbers', JSON.stringify(numbers)); // 保存倍数设置到localStorage const multipliers = multiplierSelects.map(select => parseInt(select.value, 10)); localStorage.setItem('horseRacingMultipliers', JSON.stringify(multipliers)); createFloatTip('设置已保存!即将刷新页面...'); console.log(`奖池阈值已更新为: ${newThreshold}`); console.log(`选号已更新为: ${numbers.join(', ')}`); console.log(`倍数设置已更新为: ${multipliers.join(', ')}`); // 1秒后刷新页面 setTimeout(() => { location.reload(); }, 1000); } else { createFloatTip('请输入有效的数字!'); } }; content.appendChild(saveButton); // 添加分隔线 const divider = document.createElement('div'); divider.style.height = '1px'; divider.style.backgroundColor = '#ddd'; divider.style.margin = '12px 0'; content.appendChild(divider); // 添加按钮容器 const buttonContainer = document.createElement('div'); buttonContainer.style.display = 'flex'; buttonContainer.style.gap = '10px'; content.appendChild(buttonContainer); // 添加开始按钮 const startButton = document.createElement('button'); startButton.textContent = '开始'; startButton.style.width = '50%'; startButton.style.padding = '8px'; startButton.style.backgroundColor = '#2196F3'; startButton.style.color = 'white'; startButton.style.border = 'none'; startButton.style.borderRadius = '4px'; startButton.style.cursor = 'pointer'; startButton.style.fontWeight = 'bold'; startButton.style.fontSize = '12px'; startButton.onclick = function() { localStorage.setItem('horseRacingScriptEnabled', 'true'); createFloatTip('脚本已开始运行!'); console.log('脚本已开始运行'); // 确保定时器正常工作 if (!window.checkInterval) { window.checkInterval = setInterval(checkAndBet, 5000); } // 立即更新状态显示 updateStatusDisplay(); // 更新日志显示 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('脚本已开始运行'); } }; buttonContainer.appendChild(startButton); // 添加停止按钮 const stopButton = document.createElement('button'); stopButton.textContent = '停止'; stopButton.style.width = '50%'; stopButton.style.padding = '8px'; stopButton.style.backgroundColor = '#f44336'; stopButton.style.color = 'white'; stopButton.style.border = 'none'; stopButton.style.borderRadius = '4px'; stopButton.style.cursor = 'pointer'; stopButton.style.fontWeight = 'bold'; stopButton.style.fontSize = '12px'; stopButton.onclick = function() { localStorage.setItem('horseRacingScriptEnabled', 'false'); createFloatTip('脚本已停止运行!'); console.log('脚本已停止运行'); // 清除检查定时器 if (window.checkInterval) { clearInterval(window.checkInterval); window.checkInterval = null; } // 立即更新状态显示 updateStatusDisplay(); // 更新日志显示 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('脚本已停止运行'); } }; buttonContainer.appendChild(stopButton); // 添加到页面 document.body.appendChild(panel); // 实现拖拽功能 let isDragging = false; let offsetX, offsetY; titleBar.addEventListener('mousedown', function(e) { isDragging = true; // 计算鼠标相对于面板的位置 offsetX = e.clientX - panel.getBoundingClientRect().left; offsetY = e.clientY - panel.getBoundingClientRect().top; // 提升z-index防止被其他元素遮挡 panel.style.zIndex = '9999'; }); document.addEventListener('mousemove', function(e) { if (!isDragging) return; // 防止文本选择 e.preventDefault(); // 计算面板新位置 const x = e.clientX - offsetX; const y = e.clientY - offsetY; // 限制在视口内 const maxX = window.innerWidth - panel.offsetWidth; const maxY = window.innerHeight - panel.offsetHeight; const boundedX = Math.max(0, Math.min(x, maxX)); const boundedY = Math.max(0, Math.min(y, maxY)); // 设置新位置 panel.style.left = boundedX + 'px'; panel.style.top = boundedY + 'px'; panel.style.right = 'auto'; panel.style.transform = 'none'; }); document.addEventListener('mouseup', function() { isDragging = false; panel.style.zIndex = '9998'; // 保存面板位置到localStorage const position = { x: panel.style.left, y: panel.style.top }; localStorage.setItem('horseRacingPanelPosition', JSON.stringify(position)); }); // 从localStorage读取保存的面板位置并应用 const storedPosition = localStorage.getItem('horseRacingPanelPosition'); if (storedPosition) { try { const position = JSON.parse(storedPosition); panel.style.left = position.x; panel.style.top = position.y; panel.style.right = 'auto'; panel.style.transform = 'none'; } catch (e) { console.error('恢复面板位置失败:', e); } } // 从localStorage读取保存的选择模式并初始化UI const storedMode = localStorage.getItem('horseRacingSelectionMode'); if (storedMode === 'random') { // 模拟点击随机按钮以设置正确的UI状态 randomButton.click(); } else if (storedMode === 'odds') { // 模拟点击按赔率按钮以设置正确的UI状态 oddsButton.click(); } else { // 默认或上次是自选模式 manualButton.click(); } return panel; } // 主逻辑函数 function checkAndBet() { try { // 检查是否正在执行投注操作,如果是则跳过本次检查 if (isBetting) { console.log('正在执行投注操作,跳过本次检查'); return; } // 检查奖池金额 const prizePoolElement = document.querySelector('#prizePool'); if (!prizePoolElement) { console.log('未检测到奖池元素'); return; } // 提取奖池数字(移除非数字字符) const prizePoolText = prizePoolElement.textContent; const prizePoolNumber = parseInt(prizePoolText.replace(/[^\d]/g, ''), 10); console.log(`当前奖池金额: ${prizePoolNumber}`); // 获取奖池阈值 const prizePoolThreshold = getPrizePoolThreshold(); console.log(`当前使用的奖池阈值: ${prizePoolThreshold}`); // 更新奖池状态日志 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`奖池:${prizePoolNumber} (阈值:${prizePoolThreshold})`); } // 检查奖池是否达到设定值 if (prizePoolNumber < prizePoolThreshold) { console.log('奖池未达到设定值,暂停投注'); createFloatTip('奖池未达到设定值,暂停投注!'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`奖池未达标(${prizePoolNumber} < ${prizePoolThreshold}),暂停投注`); } return; } // 检查是否有封盘倒计时 const hasCountdown = checkElementExists('#countdown', '封盘倒计时'); if (!hasCountdown) { console.log('未检测到封盘倒计时'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('未检测到封盘倒计时'); } return; } // 获取剩余投注数 const remainingBets = getElementText('#remainingBets'); console.log(`当前剩余投注数: ${remainingBets}`); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`剩余投注数: ${remainingBets}`); } // 检查剩余投注数是否为0,如果是则不生成随机号码 if (remainingBets === '0') { console.log('剩余投注数为0,停止生成随机号码'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('剩余投注数为0,等待下一轮'); } return; } // 尝试将剩余投注数转换为数字 const remainingBetsNum = parseInt(remainingBets, 10); // 根据选择模式决定使用随机号码还是用户选择的号码 let selectedNumbers; let selectedMultipliers = [1, 1, 1]; // 默认倍数都是1倍 if (selectionMode === 'random') { // 生成3个1-36之间的随机数(不允许重复) const numbers = new Set(); while (numbers.size < 3) { const randomNum = Math.floor(Math.random() * 36) + 1; numbers.add(randomNum); } selectedNumbers = Array.from(numbers); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`随机生成号码: ${selectedNumbers.join(', ')}`); } // 获取用户选择的随机模式倍率 if (randomMultiplierSelect) { const selectedMultiplier = parseInt(randomMultiplierSelect.value, 10); if (!isNaN(selectedMultiplier)) { // 为所有3个随机选号设置相同的倍率 selectedMultipliers = [selectedMultiplier, selectedMultiplier, selectedMultiplier]; if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`随机模式倍率: ${selectedMultiplier}倍`); } } } } else if (selectionMode === 'odds') { // 按赔率选择模式 // 获取36匹马的赔率 const horsesWithOdds = []; for (let i = 1; i <= 36; i++) { const oddsElement = document.querySelector(`#horsesGrid > div:nth-child(${i}) > div.horse-odds`); if (oddsElement) { const oddsText = oddsElement.textContent.trim(); // 提取纯数字部分 const cleanOddsText = oddsText.replace(/[^\d.]/g, ''); const odds = parseFloat(cleanOddsText); if (!isNaN(odds)) { horsesWithOdds.push({ horseNumber: i, odds: odds }); } } } // 对马匹进行乱序处理,确保每次遍历顺序不同 function shuffleArray(array) { const shuffled = [...array]; for (let i = shuffled.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } return shuffled; } // 打乱马匹顺序 const shuffledHorsesWithOdds = shuffleArray(horsesWithOdds); selectedNumbers = []; // 直接从localStorage读取赔率选择类型,确保获取到用户实际选择的值 const storedOddsType = localStorage.getItem('horseRacingOddsSelectionType') || 'high'; if (storedOddsType === 'high') { // 高倍率模式:寻找10.00开始递减的赔率 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('高倍率模式:从10.00开始递减寻找赔率'); } let currentOdds = 10.00; let foundHorses = []; // 寻找3匹符合条件的马 while (foundHorses.length < 3 && currentOdds >= 0) { // 查找当前赔率的马,使用乱序数组并排除已选马匹,匹配精度为0.1 const matchedHorses = shuffledHorsesWithOdds.filter(horse => Math.abs(horse.odds - currentOdds) < 0.1 && !foundHorses.includes(horse.horseNumber) ); if (matchedHorses.length > 0) { // 将匹配的马添加到已找到的列表 foundHorses.push(matchedHorses[0].horseNumber); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`找到赔率为${currentOdds}的马${matchedHorses[0].horseNumber}`); } } else { // 没有找到当前赔率的马,递减0.1 currentOdds = Math.max(0, currentOdds - 0.1); currentOdds = parseFloat(currentOdds.toFixed(2)); // 保持两位小数 } } selectedNumbers = foundHorses; } else { // 低倍率模式:寻找0.10开始递增的赔率 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('低倍率模式:从0.10开始递增寻找赔率'); window.updateLogDisplay(`当前赔率选择类型: ${storedOddsType}`); // 添加调试日志 } let currentOdds = 0.10; let foundHorses = []; const maxOdds = Math.max(...horsesWithOdds.map(horse => horse.odds)) + 1; // 设置最大赔率上限 // 寻找3匹符合条件的马 while (foundHorses.length < 3 && currentOdds <= maxOdds) { // 添加寻找当前赔率的日志 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`正在寻找赔率为${currentOdds}的马匹...`); } // 查找当前赔率的马,使用乱序数组并排除已选马匹,匹配精度为0.1 const matchedHorses = shuffledHorsesWithOdds.filter(horse => Math.abs(horse.odds - currentOdds) < 0.1 && !foundHorses.includes(horse.horseNumber) ); if (matchedHorses.length > 0) { // 将匹配的马添加到已找到的列表 foundHorses.push(matchedHorses[0].horseNumber); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`找到赔率为${currentOdds}的马${matchedHorses[0].horseNumber}`); } } else { // 没有找到当前赔率的马,递增0.1 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`未找到赔率为${currentOdds}的马,尝试下一个赔率: ${parseFloat((currentOdds + 0.1).toFixed(2))}`); } currentOdds = parseFloat((currentOdds + 0.1).toFixed(2)); // 保持两位小数 } } selectedNumbers = foundHorses; // 添加低倍率模式结果日志 if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`低倍率模式选择结果: 找到${selectedNumbers.length}匹马`); } } // 如果没有找到足够的马,使用默认选择 if (selectedNumbers.length < 3) { if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`未找到足够符合条件的马,正在按${storedOddsType === 'high' ? '高' : '低'}赔率排序选择剩余马匹`); } // 创建临时数组用于排序 const sortedHorses = [...shuffledHorsesWithOdds]; // 按赔率排序 if (storedOddsType === 'high') { sortedHorses.sort((a, b) => b.odds - a.odds); } else { // 低倍率模式:按赔率升序排列,确保选择最小赔率的马匹 sortedHorses.sort((a, b) => a.odds - b.odds); } // 添加剩余需要的马,确保不重复选择 let addedCount = 0; for (const horse of sortedHorses) { if (!selectedNumbers.includes(horse.horseNumber)) { selectedNumbers.push(horse.horseNumber); addedCount++; if (addedCount + selectedNumbers.length >= 3) break; } } // 截取前3匹马 selectedNumbers = selectedNumbers.slice(0, 3); } // 记录选择的马匹和赔率 if (typeof window.updateLogDisplay === 'function') { const logMessage = selectedNumbers.map((num, index) => { const horseInfo = horsesWithOdds.find(horse => horse.horseNumber === num); const odds = horseInfo ? horseInfo.odds : '未知'; return `第${index + 1}名: 马${num} (赔率: ${odds})`; }).join(', '); window.updateLogDisplay(`按赔率选择的马匹: ${logMessage}`); } // 获取用户选择的赔率模式倍率 if (oddsMultiplierSelect) { const selectedMultiplier = parseInt(oddsMultiplierSelect.value, 10); if (!isNaN(selectedMultiplier)) { // 为所有3个赔率选号设置相同的倍率 selectedMultipliers = [selectedMultiplier, selectedMultiplier, selectedMultiplier]; if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`赔率模式倍率: ${selectedMultiplier}倍`); } } } } else { // 自选模式 // 获取保存的选号设置 selectedNumbers = getSavedNumbers(); // 获取用户选择的倍数 for (let i = 0; i < 3; i++) { const multiplierSelect = document.getElementById(`multiplier${i + 1}`); if (multiplierSelect) { selectedMultipliers[i] = parseInt(multiplierSelect.value, 10); } } } console.log(`当前使用的选号: ${selectedNumbers.join(', ')}`); // 根据剩余投注数执行相应操作 if (remainingBets === '3' || remainingBetsNum === 3) { // 设置投注标志为true isBetting = true; console.log('开始投注流程:剩余投注数3'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`开始投注第1/3场:马号${selectedNumbers[0]}`); } // 延迟1秒后点击第一个选号对应的赛马 setTimeout(() => { clickElement(`#horsesGrid > div:nth-child(${selectedNumbers[0]})`); // 再延迟1秒点击选择的倍数按钮 setTimeout(() => { const multiplierIndex = selectedMultipliers[0] === 1 ? 1 : selectedMultipliers[0] === 2 ? 2 : selectedMultipliers[0] === 3 ? 3 : selectedMultipliers[0] === 4 ? 4 : selectedMultipliers[0] === 5 ? 5 : selectedMultipliers[0] === 10 ? 6 : selectedMultipliers[0] === 20 ? 7 : selectedMultipliers[0] === 50 ? 8 : 1; clickElement(`#currentRace > div.bet-controls > div > div > button:nth-child(${multiplierIndex})`); console.log(`选择了${selectedMultipliers[0]}倍`); // 再延迟1秒点击确认投注 setTimeout(() => { clickElement('#confirmBet'); // 投注确认后延迟5秒 setTimeout(() => { console.log('投注确认后等待5秒'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay('投注确认成功,等待下一轮'); } // 重置投注标志,允许下一次投注 isBetting = false; }, 5000); }, 1000); }, 1000); }, 1000); } else if (remainingBets === '2' || remainingBetsNum === 2) { // 设置投注标志为true isBetting = true; console.log('开始投注流程:剩余投注数2'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`开始投注第2/3场:马号${selectedNumbers[1]}`); } // 延迟1秒后点击第二个选号对应的赛马 setTimeout(() => { clickElement(`#horsesGrid > div:nth-child(${selectedNumbers[1]})`); // 再延迟1秒点击选择的倍数按钮 setTimeout(() => { const multiplierIndex = selectedMultipliers[1] === 1 ? 1 : selectedMultipliers[1] === 2 ? 2 : selectedMultipliers[1] === 3 ? 3 : selectedMultipliers[1] === 4 ? 4 : selectedMultipliers[1] === 5 ? 5 : selectedMultipliers[1] === 10 ? 6 : selectedMultipliers[1] === 20 ? 7 : selectedMultipliers[1] === 50 ? 8 : 1; clickElement(`#currentRace > div.bet-controls > div > div > button:nth-child(${multiplierIndex})`); console.log(`选择了${selectedMultipliers[1]}倍`); // 再延迟1秒点击确认投注 setTimeout(() => { clickElement('#confirmBet'); // 投注确认后延迟5秒 setTimeout(() => { console.log('投注确认后等待5秒'); // 重置投注标志,允许下一次投注 isBetting = false; }, 5000); }, 1000); }, 1000); }, 1000); } else if (remainingBets === '1' || remainingBetsNum === 1) { // 设置投注标志为true isBetting = true; console.log('开始投注流程:剩余投注数1'); if (typeof window.updateLogDisplay === 'function') { window.updateLogDisplay(`开始投注第3/3场:马号${selectedNumbers[2]}`); } // 延迟1秒后点击第三个选号对应的赛马 setTimeout(() => { clickElement(`#horsesGrid > div:nth-child(${selectedNumbers[2]})`); // 再延迟1秒点击选择的倍数按钮 setTimeout(() => { const multiplierIndex = selectedMultipliers[2] === 1 ? 1 : selectedMultipliers[2] === 2 ? 2 : selectedMultipliers[2] === 3 ? 3 : selectedMultipliers[2] === 4 ? 4 : selectedMultipliers[2] === 5 ? 5 : selectedMultipliers[2] === 10 ? 6 : selectedMultipliers[2] === 20 ? 7 : selectedMultipliers[2] === 50 ? 8 : 1; clickElement(`#currentRace > div.bet-controls > div > div > button:nth-child(${multiplierIndex})`); console.log(`选择了${selectedMultipliers[2]}倍`); // 再延迟1秒点击确认投注 setTimeout(() => { clickElement('#confirmBet'); // 投注确认后延迟5秒 setTimeout(() => { console.log('投注确认后等待5秒'); // 重置投注标志,允许下一次投注 isBetting = false; }, 5000); }, 1000); }, 1000); }, 1000); } } catch (error) { console.error('脚本执行出错:', error); } } // 设置页面自动刷新定时器(10分钟 = 600000毫秒) const refreshInterval = setInterval(() => { console.log('定时刷新页面'); location.reload(); }, 600000); // 检查localStorage中的脚本状态,默认停止 const isScriptEnabled = localStorage.getItem('horseRacingScriptEnabled') === 'true'; if (isScriptEnabled) { // 如果脚本应该启用,则设置检查定时器 window.checkInterval = setInterval(checkAndBet, 5000); // 每5秒检查一次 console.log('赛马自动投注脚本已启动,页面将每10分钟自动刷新一次'); // 当updateStatusFunction可用时更新状态显示 setTimeout(() => { if (typeof updateStatusFunction === 'function') { updateStatusFunction(); } }, 100); } else { // 默认停止状态 window.checkInterval = null; console.log('赛马自动投注脚本已加载(默认停止状态),页面将每10分钟自动刷新一次'); // 当updateStatusFunction可用时更新状态显示 setTimeout(() => { if (typeof updateStatusFunction === 'function') { updateStatusFunction(); } }, 100); } // 页面卸载时清除所有定时器 window.addEventListener('beforeunload', function() { if (window.checkInterval) { clearInterval(window.checkInterval); window.checkInterval = null; } if (refreshInterval) { clearInterval(refreshInterval); } if (refreshCountdownTimer) { clearInterval(refreshCountdownTimer); refreshCountdownTimer = null; } }); // 创建悬浮设定窗口 createSettingsPanel(); // 启动倒计时更新定时器 refreshCountdownTimer = setInterval(updateRefreshCountdown, 1000); })();