您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
必应积分自动搜索是一款自动化执行必应搜索任务、获取积分的油猴脚本,支持PC和移动端,自动获取热词并模拟真实用户搜索与浏览行为。
// ==UserScript== // @name 必应积分自动搜索 // @namespace http://tampermonkey.net/ // @version v2.6.5 // @description 必应积分自动搜索是一款自动化执行必应搜索任务、获取积分的油猴脚本,支持PC和移动端,自动获取热词并模拟真实用户搜索与浏览行为。 // @author Joker // @match https://cn.bing.com/* // @license GNU GPLv3 // @icon https://cn.bing.com/favicon.ico // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @connect rebang.today // ==/UserScript== (function () { 'use strict'; // 全局状态变量 let isRunning = false; let isPaused = false; let countdownInterval = null; let currentSearchCount = 0; let totalSearches = 0; let hotWords = []; let deviceType = ''; let sessionTotalSearches = 0; let isFirstSearch = true; let hotWordFetchTimeout = null; let scrollInterval = null; // 创建控制面板 - 优化手机端显示位置和大小 function createControlPanel() { // 先移除已存在的面板 const existingPanel = document.getElementById('autoSearchControlPanel'); if (existingPanel) { existingPanel.remove(); } const panel = document.createElement('div'); panel.style.position = 'fixed'; panel.style.backgroundColor = 'rgba(255, 255, 255, 0.95)'; panel.style.border = '1px solid #ccc'; panel.style.borderRadius = '8px'; panel.style.padding = '15px'; panel.style.boxShadow = '0 4px 15px rgba(0,0,0,0.15)'; panel.style.zIndex = '999999'; panel.id = 'autoSearchControlPanel'; // 检测设备类型,调整面板大小和位置 const isMobile = detectDeviceType() === 'mobile'; if (isMobile) { // 手机端:占满屏幕宽度的90%,居中显示 panel.style.width = '90%'; panel.style.left = '5%'; panel.style.top = '50%'; panel.style.transform = 'translateY(-50%)'; panel.style.maxHeight = '80vh'; panel.style.overflowY = 'auto'; } else { // PC端:固定宽度,右上角显示 panel.style.width = '280px'; panel.style.right = '20px'; panel.style.top = '20px'; } // 标题 const title = document.createElement('h3'); title.textContent = '必应自动搜索控制'; title.style.margin = '0 0 15px 0'; title.style.fontSize = '18px'; title.style.textAlign = 'center'; title.style.color = '#333'; panel.appendChild(title); // 状态显示 const statusDiv = document.createElement('div'); statusDiv.id = 'autoSearchStatus'; statusDiv.style.margin = '0 0 15px 0'; statusDiv.style.padding = '12px'; statusDiv.style.backgroundColor = '#f5f5f5'; statusDiv.style.borderRadius = '6px'; statusDiv.style.textAlign = 'center'; statusDiv.style.fontSize = '16px'; statusDiv.style.fontWeight = 'bold'; statusDiv.style.color = '#555'; statusDiv.textContent = '未运行'; panel.appendChild(statusDiv); // 进度显示 const progressDiv = document.createElement('div'); progressDiv.id = 'autoSearchProgress'; progressDiv.style.margin = '0 0 15px 0'; progressDiv.style.textAlign = 'center'; progressDiv.style.fontSize = '15px'; progressDiv.style.color = '#666'; progressDiv.textContent = '进度: 0/0'; panel.appendChild(progressDiv); // 按钮容器 const buttonsDiv = document.createElement('div'); buttonsDiv.style.display = 'flex'; buttonsDiv.style.gap = '10px'; buttonsDiv.style.justifyContent = 'center'; // 开始按钮 const startBtn = document.createElement('button'); startBtn.id = 'startSearchBtn'; startBtn.textContent = '开始搜索'; startBtn.style.padding = '8px 16px'; startBtn.style.backgroundColor = '#4CAF50'; startBtn.style.color = 'white'; startBtn.style.border = 'none'; startBtn.style.borderRadius = '6px'; startBtn.style.cursor = 'pointer'; startBtn.style.fontSize = '14px'; startBtn.style.fontWeight = 'bold'; startBtn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.1)'; startBtn.style.transition = 'all 0.2s ease'; startBtn.addEventListener('mouseover', () => startBtn.style.transform = 'translateY(-2px)'); startBtn.addEventListener('mouseout', () => startBtn.style.transform = 'translateY(0)'); startBtn.addEventListener('click', startSearch); buttonsDiv.appendChild(startBtn); // 暂停按钮 const pauseBtn = document.createElement('button'); pauseBtn.id = 'pauseSearchBtn'; pauseBtn.textContent = '暂停'; pauseBtn.style.padding = '8px 16px'; pauseBtn.style.backgroundColor = '#ff9800'; pauseBtn.style.color = 'white'; pauseBtn.style.border = 'none'; pauseBtn.style.borderRadius = '6px'; pauseBtn.style.cursor = 'pointer'; pauseBtn.style.fontSize = '14px'; pauseBtn.style.fontWeight = 'bold'; pauseBtn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.1)'; pauseBtn.style.transition = 'all 0.2s ease'; pauseBtn.disabled = true; pauseBtn.addEventListener('mouseover', () => !pauseBtn.disabled && (pauseBtn.style.transform = 'translateY(-2px)')); pauseBtn.addEventListener('mouseout', () => !pauseBtn.disabled && (pauseBtn.style.transform = 'translateY(0)')); pauseBtn.addEventListener('click', togglePause); buttonsDiv.appendChild(pauseBtn); // 结束按钮 const stopBtn = document.createElement('button'); stopBtn.id = 'stopSearchBtn'; stopBtn.textContent = '结束'; stopBtn.style.padding = '8px 16px'; stopBtn.style.backgroundColor = '#f44336'; stopBtn.style.color = 'white'; stopBtn.style.border = 'none'; stopBtn.style.borderRadius = '6px'; stopBtn.style.cursor = 'pointer'; stopBtn.style.fontSize = '14px'; stopBtn.style.fontWeight = 'bold'; stopBtn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.1)'; stopBtn.style.transition = 'all 0.2s ease'; stopBtn.disabled = true; stopBtn.addEventListener('mouseover', () => !stopBtn.disabled && (stopBtn.style.transform = 'translateY(-2px)')); stopBtn.addEventListener('mouseout', () => !stopBtn.disabled && (stopBtn.style.transform = 'translateY(0)')); stopBtn.addEventListener('click', stopSearch); buttonsDiv.appendChild(stopBtn); panel.appendChild(buttonsDiv); document.body.appendChild(panel); // 确保面板可见 panel.scrollIntoView({behavior: 'smooth', block: 'nearest'}); } // 更新状态显示 function updateStatus(text) { const statusDiv = document.getElementById('autoSearchStatus'); if (statusDiv) { statusDiv.textContent = text; // 根据状态设置不同颜色 if (text.includes('运行中') || text.includes('搜索中') || text.includes('等待')) { statusDiv.style.backgroundColor = '#e8f5e9'; statusDiv.style.color = '#2e7d32'; } else if (text.includes('已暂停')) { statusDiv.style.backgroundColor = '#fff8e1'; statusDiv.style.color = '#ff8f00'; } else if (text.includes('已停止') || text.includes('未运行')) { statusDiv.style.backgroundColor = '#ffebee'; statusDiv.style.color = '#c62828'; } else if (text.includes('完成')) { statusDiv.style.backgroundColor = '#e3f2fd'; statusDiv.style.color = '#1565c0'; } else { statusDiv.style.backgroundColor = '#f5f5f5'; statusDiv.style.color = '#555'; } } } // 更新进度显示 function updateProgress(current, total) { const progressDiv = document.getElementById('autoSearchProgress'); if (progressDiv) { progressDiv.textContent = `进度: ${current}/${total}`; localStorage.setItem('bingAutoSearchProgress', JSON.stringify({ current: current, total: total, timestamp: new Date().getTime() })); } } // 检测设备类型 function detectDeviceType() { const userAgent = navigator.userAgent; const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i; return mobileRegex.test(userAgent) ? 'mobile' : 'pc'; } // 热词智能精简处理 function optimizeHotWord(word) { let optimized = word.trim().replace(/^[【】()()[]]+|[【】()()[]]+$/g, ''); const separators = /[,,。.??!!::;;—-]/; if (separators.test(optimized)) { const parts = optimized.split(separators); optimized = parts[0].trim(); } const maxLength = deviceType === 'pc' ? 12 : 10; const minLength = deviceType === 'pc' ? 3 : 2; if (optimized.length > maxLength) { const cutPoints = [ optimized.lastIndexOf(' ', maxLength), optimized.lastIndexOf(',', maxLength), optimized.lastIndexOf('的', maxLength) ].filter(pos => pos > minLength); const cutPos = cutPoints.length > 0 ? Math.max(...cutPoints) : maxLength; optimized = optimized.substring(0, cutPos).trim(); } if (optimized.length < minLength) { optimized = word.trim().substring(0, maxLength).trim(); } return optimized; } // 腾讯新闻热榜(PC) function getTencentHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=tencent-news&sub_tab=hot&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 3); } } catch (e) { hotWords = getFallbackPcWords(); } } else { hotWords = getFallbackPcWords(); } return hotWords; } // 掘金热榜(PC) function getJuejinHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=juejin&sub_tab=all&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 3); } } catch (e) { hotWords = getFallbackPcWords(); } } else { hotWords = getFallbackPcWords(); } return hotWords; } // 百度热榜(PC) function getBaiduHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=baidu&sub_tab=realtime&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.word && item.word.trim().length > 0) .map(item => optimizeHotWord(item.word)) .filter(word => word.length >= 3); } } catch (e) { hotWords = getFallbackPcWords(); } } else { hotWords = getFallbackPcWords(); } return hotWords; } // 微博热搜(PC) function getWeiboHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=top&sub_tab=lasthour&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 3); // if (hotWords.length < 40) { // while (hotWords.length < 40) { // hotWords.push(...hotWords.slice(0, Math.min(hotWords.length, 40 - hotWords.length))); // } // } else { // hotWords = hotWords.slice(0, 40); // } } } catch (e) { } } return hotWords; } // 今日头条热榜(移动) function getTopHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=toutiao&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 2); } } catch (e) { hotWords = getFallbackMobileWords(); } } else { hotWords = getFallbackMobileWords(); } return hotWords; } // 网易新闻热榜(移动) function getNeNewHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=ne-news&sub_tab=htd&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 2); } } catch (e) { hotWords = getFallbackMobileWords(); } } else { hotWords = getFallbackMobileWords(); } return hotWords; } // 36氪热搜(移动) function get36krHotWords() { let hotWords = []; const hotListUrl = 'https://api.rebang.today/v1/items?tab=36kr&sub_tab=hotlist&page=1&version=1'; const xhr = new XMLHttpRequest(); xhr.open('GET', hotListUrl, false); xhr.send(); if (xhr.status === 200) { try { const result = JSON.parse(xhr.responseText); if (result.code === 200 && result.data && result.data.list) { let items = JSON.parse(result.data.list); hotWords = items .filter(item => item && item.title && item.title.trim().length > 0) .map(item => optimizeHotWord(item.title)) .filter(word => word.length >= 2); // if (hotWords.length < 30) { // while (hotWords.length < 30) { // hotWords.push(...hotWords.slice(0, Math.min(hotWords.length, 30 - hotWords.length))); // } // } else { // hotWords = hotWords.slice(0, 30); // } } } catch (e) { } } return hotWords; } // 随机获取PC热词(同步) function getRandomPcHotWordsSync() { const sources = [getBaiduHotWords, getWeiboHotWords, getTencentHotWords,getJuejinHotWords]; const idx = Math.floor(Math.random() * sources.length); let words = sources[idx](); if (!words || words.length === 0) { // 尝试其他两个方法 for (let i = 0; i < sources.length; i++) { if (i !== idx) { words = sources[i](); if (words && words.length > 0) break; } } } return words.length > 0 ? words : getFallbackPcWords(); } // 随机获取移动热词(同步) function getRandomMobileHotWordsSync() { const sources = [getTopHotWords, get36krHotWords, getNeNewHotWords]; const idx = Math.floor(Math.random() * sources.length); let words = sources[idx](); if (!words || words.length === 0) { // 尝试其他两个方法 for (let i = 0; i < sources.length; i++) { if (i !== idx) { words = sources[i](); if (words && words.length > 0) break; } } } return words && words.length > 0 ? words : getFallbackMobileWords(); } // 全局备用热词 let fallbackPcWords = [ "人工智能发展", "全球经济趋势", "量子计算突破", "新能源技术", "元宇宙应用", "区块链创新", "5G技术进展", "太空探索", "自动驾驶", "大数据分析", "云计算发展", "网络安全动态", "机器学习", "边缘计算", "数字货币", "生物科技", "虚拟现实", "增强现实", "物联网", "智能家居" ]; let fallbackMobileWords = [ "手机新品", "短视频挑战", "移动游戏排行", "手机摄影", "流量套餐", "手游攻略", "移动支付安全", "短视频制作", "手机评测", "充电宝选购", "社交软件", "网络热点", "明星动态", "电影推荐", "美食做法", "旅游攻略", "健康养生", "学习技巧", "职场经验", "亲子教育" ]; // 随机生成延迟时间 function getRandomDelay() { return Math.floor(Math.random() * 13) + 3; // 3-15秒 } // 随机选择热词并从列表中移除,避免重复 function getRandomItemAndRemove(arr) { if (!arr || arr.length === 0) return null; const index = Math.floor(Math.random() * arr.length); const item = arr[index]; arr.splice(index, 1); if (arr.length === 0) { console.log("热词已用尽,重新获取热词"); if (deviceType === 'pc') { getRandomPcHotWords().then(words => hotWords = words); } else { getRandomMobileHotWords().then(words => hotWords = words); } } return item; } // 执行搜索 function performSearch(query) { if (isPaused || !isRunning) return; if (!query || query.trim().length === 0) { console.error("无效的搜索词,跳过本次搜索"); updateStatus("搜索词无效,准备下一次"); setTimeout(performSearchCycle, 2000); return; } let searchBoxAttempts = 0; const maxAttempts = 5; const searchBoxInterval = setInterval(() => { const searchBox = document.getElementById('sb_form_q'); searchBoxAttempts++; if (searchBox) { clearInterval(searchBoxInterval); updateStatus(`搜索中: ${query}`); searchBox.scrollIntoView({behavior: 'smooth', block: 'center'}); setTimeout(() => { searchBox.value = ''; searchBox.dispatchEvent(new Event('input', {bubbles: true})); searchBox.dispatchEvent(new Event('change', {bubbles: true})); let i = 0; const typeInterval = setInterval(() => { if (!isRunning || isPaused) { clearInterval(typeInterval); return; } if (i < query.length) { searchBox.value += query[i]; searchBox.dispatchEvent(new Event('input', {bubbles: true})); searchBox.dispatchEvent(new Event('change', {bubbles: true})); searchBox.dispatchEvent(new Event('keydown', { bubbles: true, key: query[i] })); i++; } else { clearInterval(typeInterval); searchBox.focus(); setTimeout(() => { if (!isRunning || isPaused) return; const currentState = { isRunning: isRunning, currentSearchCount: currentSearchCount, totalSearches: totalSearches, isFirstSearch: false }; localStorage.setItem('bingAutoSearchState', JSON.stringify(currentState)); if (detectDeviceType() === 'mobile') { const form = document.getElementById('sb_form'); if (form) { form.submit(); } else { const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true }); searchBox.dispatchEvent(enterEvent); } setTimeout(performSearchCycle, 1500); } else { // 方法1:模拟Enter键(主要方法) const enterEvent = new KeyboardEvent('keypress', { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true }); searchBox.dispatchEvent(enterEvent); // 方法2:点击搜索按钮(备用方法,1秒后执行以防方法1失败) setTimeout(() => { if (document.getElementById('sb_form_q') && document.getElementById('sb_form_q').value === query) { console.log("Enter键提交失败,尝试点击搜索按钮"); const searchButton = document.getElementById('sb_form_go') || document.querySelector('input[type="submit"]') || document.querySelector('.search-icon'); if (searchButton) { searchButton.click(); } else { // 方法3:直接跳转URL(终极保障) console.log("搜索按钮未找到,直接跳转URL"); window.location.href = `https://cn.bing.com/search?q=${encodeURIComponent(query)}`; } } }, 1000); setTimeout(performSearchCycle, 1500); } }, Math.floor(Math.random() * 1500) + 500); } }, Math.floor(Math.random() * 150) + 50); }, 500); } else if (searchBoxAttempts >= maxAttempts) { clearInterval(searchBoxInterval); const searchUrl = `https://cn.bing.com/search?q=${encodeURIComponent(query)}`; const currentState = { isRunning: isRunning, currentSearchCount: currentSearchCount, totalSearches: totalSearches, isFirstSearch: false }; localStorage.setItem('bingAutoSearchState', JSON.stringify(currentState)); window.location.href = searchUrl; setTimeout(performSearchCycle, 2000); } }, 500); } // 搜索循环 async function performSearchCycle() { if (!isOnBingHomepage()) { currentSearchCount++; // 搜索次数递增后立即刷新进度 updateProgress(currentSearchCount, totalSearches); } const savedState = localStorage.getItem('bingAutoSearchState'); if (savedState) { const { isRunning: savedRunning, currentSearchCount: savedCount, totalSearches: savedTotal } = JSON.parse(savedState); if (savedRunning && !isRunning) { isRunning = true; currentSearchCount = savedCount; totalSearches = savedTotal; sessionTotalSearches = savedTotal; document.getElementById('startSearchBtn').disabled = true; document.getElementById('pauseSearchBtn').disabled = false; document.getElementById('stopSearchBtn').disabled = false; } } if (!isRunning || isPaused) return; if (currentSearchCount >= totalSearches) { updateStatus(`已完成所有${totalSearches}次搜索`); updateProgress(totalSearches, totalSearches); // 修正完成时进度 stopSearch(); // alert(`已完成所有${totalSearches}次搜索任务!`); return; } if (!isOnBingHomepage()) { await simulateSearchResultsBrowsing(); if (isPaused || !isRunning) return; } const delaySeconds = getRandomDelay(); console.log(`第${currentSearchCount + 1}次搜索将在${delaySeconds}秒后进行`); updateStatus(`运行中 - 下次搜索: ${delaySeconds}秒`); // 倒计时显示 let remaining = delaySeconds; if (countdownInterval) clearInterval(countdownInterval); countdownInterval = setInterval(() => { if (!isRunning || isPaused) { clearInterval(countdownInterval); return; } updateStatus(`运行中 - 下次搜索: ${remaining}秒`); remaining--; if (remaining < 0) clearInterval(countdownInterval); }, 1000); await new Promise(resolve => setTimeout(resolve, delaySeconds * 1000)); if (isPaused || !isRunning) return; executeNextSearchStep(); } // 执行下一步搜索 function executeNextSearchStep() { if (!isRunning || isPaused) return; if (countdownInterval) { clearInterval(countdownInterval); countdownInterval = null; } const randomWord = getRandomItemAndRemove(hotWords); performSearch(randomWord); } // 检查是否在必应首页 function isOnBingHomepage() { return window.location.href === 'https://cn.bing.com/' || window.location.href.startsWith('https://cn.bing.com/?') && !window.location.href.includes('/search'); } // 开始搜索 function startSearch() { if (isRunning) return; isRunning = true; isPaused = false; isFirstSearch = true; const startBtn = document.getElementById('startSearchBtn'); const pauseBtn = document.getElementById('pauseSearchBtn'); const stopBtn = document.getElementById('stopSearchBtn'); startBtn.disabled = true; pauseBtn.disabled = false; stopBtn.disabled = false; pauseBtn.style.transform = 'scale(1.05)'; pauseBtn.style.boxShadow = '0 3px 8px rgba(255, 152, 0, 0.3)'; updateStatus("准备中..."); deviceType = detectDeviceType(); console.log(`设备类型: ${deviceType}`); // 首次搜索需要确保在必应首页 if (isFirstSearch && !isOnBingHomepage()) { updateStatus("正在切换到必应首页..."); // 保存当前状态以便页面跳转后恢复 localStorage.setItem('bingAutoSearchState', JSON.stringify({ isRunning: isRunning, currentSearchCount: currentSearchCount, totalSearches: totalSearches, isFirstSearch: isFirstSearch, needInitialize: true })); // 跳转到必应首页 window.location.href = 'https://cn.bing.com/'; // 等待5秒以确保页面跳转完成 setTimeout(() => { console.log("等待5秒后继续执行"); }, 5000); } // 不再使用异步热词获取 try { if (deviceType === 'pc') { totalSearches = 40; hotWords = getRandomPcHotWordsSync(); } else { totalSearches = 30; hotWords = getRandomMobileHotWordsSync(); } initializeSearchProcess(); } catch (e) { updateStatus("热词获取失败,使用备用方案"); hotWords = deviceType === 'pc' ? getFallbackPcWords() : getFallbackMobileHotWords(); initializeSearchProcess(); } // 初始化搜索流程(提升到全局,便于异步调用) function initializeSearchProcess() { if (!hotWords || hotWords.length === 0) { updateStatus("热词获取失败,请检查网络"); isRunning = false; const startBtn = document.getElementById('startSearchBtn'); const pauseBtn = document.getElementById('pauseSearchBtn'); const stopBtn = document.getElementById('stopSearchBtn'); if (startBtn) startBtn.disabled = false; if (pauseBtn) pauseBtn.disabled = true; if (stopBtn) stopBtn.disabled = true; updateProgress(0, totalSearches); // 修正初始化时进度显示 return; } sessionTotalSearches = totalSearches; const savedProgress = localStorage.getItem('bingAutoSearchProgress'); if (savedProgress) { const {current, total} = JSON.parse(savedProgress); if (total === totalSearches) { currentSearchCount = current; } else { currentSearchCount = 0; } } else { currentSearchCount = 0; } if (currentSearchCount >= totalSearches) { currentSearchCount = 0; } updateProgress(currentSearchCount, totalSearches); // 确保进度显示正确 localStorage.setItem('bingAutoSearchState', JSON.stringify({ isRunning: isRunning, currentSearchCount: currentSearchCount, totalSearches: totalSearches, isFirstSearch: isFirstSearch, needInitialize: false })); updateStatus("开始搜索流程"); setTimeout(performSearchCycle, 1000); } } // 暂停/继续 function togglePause() { if (!isRunning) return; isPaused = !isPaused; const pauseBtn = document.getElementById('pauseSearchBtn'); localStorage.setItem('bingAutoSearchState', JSON.stringify({ isRunning: isRunning, currentSearchCount: currentSearchCount, totalSearches: totalSearches, isFirstSearch: isFirstSearch, needInitialize: false })); if (isPaused) { if (countdownInterval) clearInterval(countdownInterval); if (scrollInterval) clearInterval(scrollInterval); pauseBtn.textContent = '继续'; pauseBtn.style.backgroundColor = '#4caf50'; pauseBtn.style.boxShadow = '0 3px 8px rgba(76, 175, 80, 0.3)'; updateStatus("已暂停"); } else { pauseBtn.textContent = '暂停'; pauseBtn.style.backgroundColor = '#ff9800'; pauseBtn.style.boxShadow = '0 3px 8px rgba(255, 152, 0, 0.3)'; updateStatus("继续搜索流程"); performSearchCycle(); } } // 停止搜索 - 彻底清理状态和移除面板 function stopSearch() { isRunning = false; isPaused = false; if (countdownInterval) clearInterval(countdownInterval); if (scrollInterval) clearInterval(scrollInterval); clearTimeout(hotWordFetchTimeout); updateStatus("已停止"); updateProgress(currentSearchCount, sessionTotalSearches || 0); localStorage.removeItem('bingAutoSearchState'); localStorage.removeItem('bingAutoSearchProgress'); localStorage.removeItem('bingAutoSearchCount'); localStorage.removeItem('isBingAuto'); const startBtn = document.getElementById('startSearchBtn'); const pauseBtn = document.getElementById('pauseSearchBtn'); const stopBtn = document.getElementById('stopSearchBtn'); if (startBtn) startBtn.disabled = false; if (pauseBtn) pauseBtn.disabled = true; if (stopBtn) stopBtn.disabled = true; if (pauseBtn) { pauseBtn.textContent = '暂停'; pauseBtn.style.backgroundColor = '#ff9800'; pauseBtn.style.boxShadow = '0 2px 5px rgba(0,0,0,0.1)'; pauseBtn.style.transform = 'scale(1)'; } // 再次确保面板被移除 const panel1 = document.getElementById('autoSearchPanel'); const panel2 = document.getElementById('autoSearchControlPanel'); if (panel1) panel1.remove(); if (panel2) panel2.remove(); } // 页面加载时只负责恢复面板和进度,不再异步获取热词和初始化 function restoreStateOnLoad() { const savedProgress = localStorage.getItem('bingAutoSearchProgress'); if (savedProgress) { const {current, total} = JSON.parse(savedProgress); if (document.getElementById('autoSearchProgress')) { document.getElementById('autoSearchProgress').textContent = `进度: ${current}/${total}`; } } const savedState = localStorage.getItem('bingAutoSearchState'); if (savedState) { const { isRunning: savedRunning, currentSearchCount: savedCount, totalSearches: savedTotal, isFirstSearch: savedFirst, needInitialize: needInit } = JSON.parse(savedState); if (savedRunning) { isRunning = true; currentSearchCount = savedCount; totalSearches = savedTotal; isFirstSearch = savedFirst; sessionTotalSearches = savedTotal; createControlPanel(); const startBtn = document.getElementById('startSearchBtn'); const pauseBtn = document.getElementById('pauseSearchBtn'); const stopBtn = document.getElementById('stopSearchBtn'); if (startBtn && pauseBtn && stopBtn) { startBtn.disabled = true; pauseBtn.disabled = false; stopBtn.disabled = false; pauseBtn.style.transform = 'scale(1.05)'; pauseBtn.style.boxShadow = '0 3px 8px rgba(255, 152, 0, 0.3)'; } updateStatus("运行中 - 恢复搜索"); // 如果需要初始化(刚跳转到首页),直接执行初始化流程 if (needInit) { deviceType = detectDeviceType(); try { if (deviceType === 'pc') { totalSearches = 40; hotWords = getRandomPcHotWordsSync(); } else { totalSearches = 30; hotWords = getRandomMobileHotWordsSync(); } initializeSearchProcess(); // 初始化后将 needInitialize 标记为 false const state = JSON.parse(localStorage.getItem('bingAutoSearchState') || '{}'); state.needInitialize = false; localStorage.setItem('bingAutoSearchState', JSON.stringify(state)); } catch (e) { updateStatus("热词获取失败,使用备用方案"); hotWords = deviceType === 'pc' ? getFallbackPcWords() : getFallbackMobileHotWords(); initializeSearchProcess(); const state = JSON.parse(localStorage.getItem('bingAutoSearchState') || '{}'); state.needInitialize = false; localStorage.setItem('bingAutoSearchState', JSON.stringify(state)); } } else { setTimeout(() => { deviceType = detectDeviceType(); if (deviceType === 'pc') { hotWords = getRandomPcHotWordsSync(); } else { hotWords = getRandomMobileHotWordsSync(); } performSearchCycle(); }, 1000); } } } } // 页面加载完成后初始化 window.addEventListener('load', () => { // 更简洁的转换方式 const bingAuto = localStorage.getItem('isBingAuto') === 'true'; if (!bingAuto) return; createControlPanel(); restoreStateOnLoad(); const savedState = localStorage.getItem('bingAutoSearchState'); let needInit = false; let deviceTypeLocal = detectDeviceType(); if (savedState) { const stateObj = JSON.parse(savedState); needInit = !!stateObj.needInitialize; } // 跳转到首页后,只有 needInitialize 为 true 时才获取热词并初始化 if (needInit) { deviceType = deviceTypeLocal; updateStatus("正在获取热词..."); let hotWordResolved = false; let hotWordTimeout = setTimeout(() => { if (!hotWordResolved) { hotWords = deviceType === 'pc' ? getFallbackPcWords() : getFallbackMobileHotWords(); initializeSearchProcess(); // 清除 needInitialize 标记 const state = JSON.parse(localStorage.getItem('bingAutoSearchState') || '{}'); state.needInitialize = false; localStorage.setItem('bingAutoSearchState', JSON.stringify(state)); } }, 15000); try { if (deviceType === 'pc') { totalSearches = 40; hotWords = getRandomPcHotWordsSync(); } else { totalSearches = 30; hotWords = getRandomMobileHotWordsSync(); } hotWordResolved = true; clearTimeout(hotWordTimeout); initializeSearchProcess(); // 初始化后将 needInitialize 标记为 false const state = JSON.parse(localStorage.getItem('bingAutoSearchState') || '{}'); state.needInitialize = false; localStorage.setItem('bingAutoSearchState', JSON.stringify(state)); } catch (e) { hotWordResolved = true; clearTimeout(hotWordTimeout); updateStatus("热词获取失败,使用备用方案"); hotWords = deviceType === 'pc' ? getFallbackPcWords() : getFallbackMobileHotWords(); initializeSearchProcess(); // 同样修复 needInitialize 标记 const state = JSON.parse(localStorage.getItem('bingAutoSearchState') || '{}'); state.needInitialize = false; localStorage.setItem('bingAutoSearchState', JSON.stringify(state)); } } }); // 模拟用户上下滑动页面浏览(同时支持PC和移动端) function simulateSearchResultsBrowsing() { return new Promise(resolve => { if (isPaused || !isRunning) { resolve(); return; } updateStatus("正在浏览搜索结果..."); const isMobile = detectDeviceType() === 'mobile'; // 为PC端设置不同的滑动参数 const scrollSteps = isMobile ? Math.floor(Math.random() * 4) + 4 : Math.floor(Math.random() * 6) + 4; const totalBrowseTime = isMobile ? Math.floor(Math.random() * 3000) + 1000 : Math.floor(Math.random() * 3000) + 2000; const intervalBetweenSteps = totalBrowseTime / scrollSteps; let step = 0; let direction = 1; const scrollTimeout = setTimeout(() => { console.log("结果浏览滑动超时"); clearInterval(scrollInterval); window.scrollTo({top: 0, behavior: 'smooth'}); setTimeout(resolve, 800); }, 15000); scrollInterval = setInterval(() => { if (isPaused || !isRunning || step >= scrollSteps) { clearInterval(scrollInterval); clearTimeout(scrollTimeout); window.scrollTo({top: 0, behavior: 'smooth'}); setTimeout(resolve, 800); return; } const maxScroll = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ); let scrollPosition; if (isMobile) { // 移动端滑动逻辑保持不变 if (step % 2 === 0) { direction = direction * -1; } scrollPosition = direction > 0 ? maxScroll * (0.2 + Math.random() * 0.5) : maxScroll * (0.1 + Math.random() * 0.2); } else { // PC端滑动逻辑 - 更自然的浏览模式 if (step === 0) { // 第一步轻微下滑 scrollPosition = maxScroll * (0.1 + Math.random() * 0.1); } else if (step === scrollSteps - 1) { // 最后一步回到顶部 scrollPosition = 0; } else if (Math.random() < 0.2) { // 偶尔向上滚动一点 const currentPos = window.scrollY; scrollPosition = Math.max(0, currentPos - maxScroll * (0.05 + Math.random() * 0.15)); } else { // 主要向下滚动,但有随机变化 const currentPos = window.scrollY; scrollPosition = Math.min( maxScroll * 0.9, currentPos + maxScroll * (0.1 + Math.random() * 0.2) ); } } window.scrollTo({top: scrollPosition, behavior: 'smooth'}); step++; }, intervalBetweenSteps); }); } // 添加菜单命令:修复手机端菜单点击不显示面板的问题 if (typeof GM_registerMenuCommand === 'function') { // 确保菜单命令能���确触发面板显示 GM_registerMenuCommand('显示控制面板', function () { // 存储布尔值(会自动转为字符串) localStorage.setItem('isBingAuto', true); // 强制创建并显示面板 createControlPanel(); // 确保面板在视口中可见 const panel = document.getElementById('autoSearchControlPanel'); if (panel) { panel.style.display = 'block'; panel.scrollIntoView({behavior: 'smooth', block: 'center'}); } }, 's'); GM_registerMenuCommand('关闭面板', function () { closeControlPanelAndScript(); }, 'c'); } // 关闭面板和脚本 function closeControlPanelAndScript() { stopSearch(); // 再次确保面板被移除 const panel1 = document.getElementById('autoSearchPanel'); const panel2 = document.getElementById('autoSearchControlPanel'); if (panel1) panel1.remove(); if (panel2) panel2.remove(); } })();