Microsoft Bing Rewards每日任务脚本 自用修改 by 诺子小姐

自动完成微软Rewards每日搜索任务,每次运行时获取热门词,随机选择搜索词

// ==UserScript==
// @name         Microsoft Bing Rewards每日任务脚本 自用修改 by 诺子小姐
// @version      V1.3
// @description  自动完成微软Rewards每日搜索任务,每次运行时获取热门词,随机选择搜索词
// @note         更新于 2025年07月15日 - 增加随机搜索词功能
// @author       诺子
// @match        https://*.bing.com/*
// @exclude      https://rewards.bing.com/*
// @license      GNU GPLv3
// @icon         https://www.bing.com/favicon.ico
// @connect      aa1.cn
// @run-at       document-end
// @grant        GM_registerMenuCommand
// @grant        GM_addStyle
// @grant        GM_openInTab
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @namespace    https://greasyfork.org/zh-CN/scripts/477107
// ==/UserScript==


var max_rewards = Math.floor(Math.random() * (45 - 35 + 1)) + 35; // 生成随机重复执行的次数(35 到 45 次之间)
// 每执行4次搜索后插入暂停时间,解决账号被监控不增加积分的问题
var pause_time = Math.floor(Math.random() * (900000 - 600000 + 1)) + 600000; // 生成随机暂停时间(10 到 15 分钟之间)
var search_words = []; //搜索词
var Hot_words_apis = "https://v.api.aa1.cn/api/"; // 新API接口地址

// 默认搜索词,热门搜索词请求失败时使用
var default_search_words = [
    // 自然景观与地理知识类
    "壶口瀑布冬季结冰期是几月",
    "张家界天门山盘山公路有多少弯",
    "桂林阳朔十里画廊最佳徒步路线",
    "青海湖湟鱼洄游最佳观赏时间",
    "新疆独库公路每年开放几个月",
    // 省略部分默认搜索词(保持原有内容)
];

// 新API支持的热门词来源
var keywords_source = [
    'bilibili-rs', // B站热搜
    'weibo-hot',   // 微博热搜
    'baidu-hot',   // 百度热搜
    'douyin-hot',  // 抖音热搜
    'zhihu-hot'    // 知乎热搜
];
var current_source_index = 0; // 当前搜索词来源的索引

/**
 * 从新API获取热门搜索词
 * @returns {Promise<string[]>} 返回搜索到的关键词列表或默认搜索词列表
 */
async function getHotKeywords() {
    while (current_source_index < keywords_source.length) {
        const source = keywords_source[current_source_index];
        const url = `${Hot_words_apis}${source}/`; // 构建API请求地址

        try {
            const response = await fetch(url);
            if (!response.ok) {
                throw new Error(`HTTP错误: ${response.status}`);
            }

            const data = await response.json();

            // 处理不同API返回的数据结构
            let keywords = [];
            if (Array.isArray(data)) {
                // 处理数组类型返回(如B站热搜)
                keywords = data.map(item => {
                    if (typeof item === 'string') return item;
                    if (item.title) return item.title;
                    if (item.name) return item.name;
                    return JSON.stringify(item).substring(0, 20); // 保底处理
                });
            } else if (data.data && Array.isArray(data.data)) {
                // 处理带data字段的返回
                keywords = data.data.map(item => item.title || item.name || '');
            }

            // 过滤空值并去重
            keywords = [...new Set(keywords.filter(k => k.trim().length > 0))];

            if (keywords.length > 0) {
                console.log(`从${source}获取到${keywords.length}个关键词`);
                return keywords;
            }
        } catch (error) {
            console.error(`获取${source}热门词失败:`, error);
        }

        current_source_index++; // 尝试下一个来源
    }

    // 所有来源都失败时使用默认搜索词
    console.error('所有热门词来源请求失败,使用默认搜索词');
    return default_search_words;
}

// 执行搜索初始化
getHotKeywords()
    .then(keywords => {
        search_words = keywords;
        exec();
    })
    .catch(error => {
        console.error('初始化失败:', error);
        search_words = default_search_words;
        exec();
    });

// 定义菜单命令:开始
GM_registerMenuCommand('开始', function () {
    GM_setValue('Cnt', 0);
    location.href = "https://www.bing.com/?br_msg=Please-Wait";
}, 'o');

// 定义菜单命令:停止
GM_registerMenuCommand('停止', function () {
    GM_setValue('Cnt', max_rewards + 10);
}, 'o');

// 搜索词混淆处理
function AutoStrTrans(st) {
    let yStr = st;
    let rStr = ""; // 可根据需要添加混淆字符
    let zStr = "";
    let prePo = 0;
    for (let i = 0; i < yStr.length;) {
        let step = parseInt(Math.random() * 5) + 1;
        if (i > 0) {
            zStr += yStr.substr(prePo, i - prePo) + rStr;
            prePo = i;
        }
        i += step;
    }
    if (prePo < yStr.length) {
        zStr += yStr.substr(prePo);
    }
    return zStr;
}

// 生成随机字符串
function generateRandomString(length) {
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    let result = '';
    for (let i = 0; i < length; i++) {
        result += characters.charAt(Math.floor(Math.random() * characters.length));
    }
    return result;
}

// 平滑滚动到页面底部
function smoothScrollToBottom() {
    window.scrollTo({
        top: document.body.scrollHeight,
        behavior: 'smooth'
    });
}

// 主执行函数(增加随机搜索词功能)
function exec() {
    let randomDelay = Math.floor(Math.random() * 20000) + 10000; // 10-30秒随机延迟
    let randomString = generateRandomString(4);
    let randomCvid = generateRandomString(32);
    'use strict';

    // 初始化计数器
    if (GM_getValue('Cnt') === null) {
        GM_setValue('Cnt', max_rewards + 10);
    }

    let currentSearchCount = GM_getValue('Cnt');

    if (currentSearchCount < max_rewards) {
        // 更新页面标题显示进度
        const title = document.getElementsByTagName("title")[0];
        title.innerHTML = `[${currentSearchCount} / ${max_rewards}] ${title.innerHTML}`;

        smoothScrollToBottom();
        GM_setValue('Cnt', currentSearchCount + 1);

        setTimeout(() => {
            // 关键修改:从搜索词列表中随机挑选一个(而非顺序循环)
            let wordIndex = Math.floor(Math.random() * search_words.length);
            let nowtxt = search_words[wordIndex];
            nowtxt = AutoStrTrans(nowtxt);

            // 构建搜索URL
            const searchUrl = `https://www.bing.com/search?q=${encodeURI(nowtxt)}&form=${randomString}&cvid=${randomCvid}`;

            // 每5次搜索添加一次暂停
            if ((currentSearchCount + 1) % 5 === 0) {
                console.log(`第${currentSearchCount + 1}次搜索(随机词:${nowtxt}),进入暂停期`);
                setTimeout(() => {
                    location.href = searchUrl;
                }, pause_time);
            } else {
                console.log(`第${currentSearchCount + 1}次搜索(随机词:${nowtxt})`);
                location.href = searchUrl;
            }
        }, randomDelay);
    } else {
        console.log(`已完成${max_rewards}次搜索任务`);
    }
}