// ==UserScript== // @name 微软积分商城签到(改进版) // @namespace https://geoisam.github.io // @version 3.6.48 // @description 每天在后台自动完成 Microsoft Rewards 任务获取积分奖励,✅签入、✅阅读、✅活动、✅搜索 // @author geoisam@qq.com // @homepage https://github.com/geoisam/FuckScripts // @supportURL https://github.com/geoisam/FuckScripts/issues // @crontab */20 * * * * // @connect bing.com // @connect login.live.com // @connect rewards.bing.com // @connect prod.rewardsplatform.microsoft.com // @connect hotapi.nntool.cc // @connect hot.baiwumm.com // @connect cnxiaobai.com // @connect disp-qryapi.3g.qq.com // @connect qyapi.weixin.qq.com // @connect oapi.dingtalk.com // @connect open.feishu.cn // @connect push.i-i.me // @connect api.day.app // @match https://login.live.com/oauth20_desktop.srf* // @run-at document-start // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_notification // @grant GM_openInTab // @grant GM_getValue // @grant GM_setValue // @grant GM_cookie // @grant GM_info // @grant GM_log // @storageName FuckScripts_Shared_Auth // @tips 此脚本一直为 开源免费 使用,如果你是从某些地方买的话,你就是被骗了 // ==/UserScript== /* global GM_cookie, GM_getValue, GM_setValue, GM_xmlhttpRequest, GM_log, GM_info, GM_notification, GM_openInTab */ /* ==UserConfig== Config: keep: title: 持续检测(关闭则所有任务完成后不再检测) type: checkbox default: true lock: title: 锁定国区(若当前 IP 非中国大陆地区则停止) type: checkbox default: true span: title: 搜索间隔(至少 30 秒即间隔 15-45 秒) type: number default: 30 min: 30 unit: ±15秒 api: title: 搜索词接口(offline为随机搜索词) type: select default: hot.nntool.cc values: [offline, hot.nntool.cc, hot.baiwumm.com, hot.cnxiaobai.com] code: title: 授权码链接(请勿分享以免个人数据泄露) type: textarea description: https://login.live.com/oauth20_desktop.srf?code=M.C540_BAY.2.U.********-****-****-****-************&... Tasks: sign: title: 签入(Authorization Code) type: checkbox default: true read: title: 阅读(Authorization Code) type: checkbox default: true promos: title: 活动(rewards.bing.com) type: checkbox default: true search: title: 搜索(www.bing.com) type: checkbox default: true Notice: bro: title: 浏览器通知(当前脚本) type: checkbox default: true wework: title: 企业微信消息推送(群机器人) type: text password: true description: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx dingding: title: 钉钉群机器人(不加签,关键词:#) type: text password: true description: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx feishu: title: 飞书群机器人(不加签,关键词:#) type: text password: true description: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx pushme: title: PushMe(push.i-i.me) type: text password: true description: xxxxxxxxxxxxxxxxxxxx bark: title: Bark(bark.day.app) type: text password: true description: xxxxxxxxxxxxxxxxxxxx ==/UserConfig== */ if (location.hostname === "login.live.com" && location.pathname === "/oauth20_desktop.srf") { const urlParams = new URLSearchParams(location.search); const authCode = urlParams.get("code"); if (authCode) { const fullCode = `https://login.live.com/oauth20_desktop.srf?code=${authCode.trim()}`; GM_setValue("Config.code", fullCode); GM_setValue("Config.token", false); window.open('', '_self', ''); window.close(); } return; } const FuckD = { wh: [ { name: "企业微信", url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", key: GM_getValue("Notice.wework", false), msg: { "msgtype": "text", "text": { get content() { return `> ${FuckD.bing.datetimeLocaleStr}\n\n ## ${GM_info.script.name}\n ${FuckD.bing.sendMSG}` } }, }, docs: "https://developer.work.weixin.qq.com/document/path/91770" }, { name: "钉钉", url: "https://oapi.dingtalk.com/robot/send?access_token=", key: GM_getValue("Notice.dingding", false), msg: { "msgtype": "markdown", "markdown": { "title": GM_info.script.name, get text() { return `> ${FuckD.bing.datetimeLocaleStr}\n ### ${GM_info.script.name}\n ${FuckD.bing.sendMSG}` } }, }, docs: "https://open.dingtalk.com/document/orgapp/custom-robots-send-group-messages" }, { name: "飞书", url: "https://open.feishu.cn/open-apis/bot/v2/hook/", key: GM_getValue("Notice.feishu", false), msg: { "msg_type": "interactive", "card": { "schema": "2.0", "header": { "title": { "tag": "plain_text", "content": GM_info.script.name }, "template": "orange" }, "body": { "elements": [{ "tag": "markdown", "text_align": "center", get content() { return `#### ${FuckD.bing.datetimeLocaleStr}\n ${FuckD.bing.sendMSG}` } }] } } }, docs: "https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot" }, { name: "PushMe", url: "https://push.i-i.me/?push_key=", key: GM_getValue("Notice.pushme", false), msg: { "type": "markdown", "title": `${GM_info.script.name}[#reawrds!https://rewards.bing.com/rewards.png]`, get content() { return `\n ${FuckD.bing.sendMSG}` } }, docs: "https://push.i-i.me/docs/index" }, { name: "Bark", url: "https://api.day.app/", key: GM_getValue("Notice.bark", false), msg: { "group": "rewards", "icon": "https://rewards.bing.com/rewards.png", "title": GM_info.script.name, get markdown() { return `\n ${FuckD.bing.sendMSG}` } }, docs: "https://bark.day.app/#/tutorial" }, ], ua: { pc: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.2420.81", m: "Mozilla/5.0 (Linux; Android 16; MCE16 Build/BP3A.250905.014; ) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/123.0.0.0 Mobile Safari/537.36 EdgA/123.0.2420.102", }, cookie: { bing: "", }, api: { mode: GM_getValue("Config.api", "offline"), arr: [ ["hot.baiwumm.com", { url: "https://hot.baiwumm.com/api/", hot: ["weibo", "douyin", "baidu", "toutiao", "thepaper", "qq", "netease", "zhihu"], }], ["hot.cnxiaobai.com", { url: "https://cnxiaobai.com/DailyHotApi/", hot: ["weibo", "douyin", "baidu", "toutiao", "thepaper", "qq-news", "netease-news", "zhihu"], }], ["hot.nntool.cc", { url: "https://hotapi.nntool.cc/", hot: ["weibo", "douyin", "baidu", "toutiao", "thepaper", "qq-news", "netease-news", "zhihu"], }], ], }, tasks: { sign: GM_getValue("Tasks.sign", true), read: GM_getValue("Tasks.read", true), promos: GM_getValue("Tasks.promos", true), search: GM_getValue("Tasks.search", true), }, bing: { region: "CN", status: GM_getValue("Config.lock", true), repo: "https://github.com/geoisam/FuckScripts/", time: 3210, span: GM_getValue("Config.span", 30), code: 0, token: false, error: 0, tasks: { get sign() { return FuckD.sign.date }, get read() { return FuckD.read.date }, get promos() { return FuckD.promos.date }, get search() { return FuckD.search.date }, }, mainland: 1, end: 1, }, sign: { times: 0, point: -1, end: 0, }, read: { times: 0, point: 0, end: 0, }, promos: { times: 0, token: 0, end: 0, }, search: { device: "", word: { list: [], index: 0, }, times: 0, progressNow: 0, pc: { progress: 0, max: 1, }, m: { progress: 0, max: 1, }, index: 0, end: 0, }, } const FuckF = { getRandomNum(num) { return Math.floor(Math.random() * num) }, getScopeRandomNum(min, max) { return Math.floor(Math.random() * (max + 1 - min) + min) }, getRandomArr(arr) { return arr.sort(() => { return Math.random() - 0.5 }) }, getRandomUUID(only = false) { const uuid = crypto.randomUUID() const sid = uuid.replace(/-/g, "").toUpperCase() return only ? sid : uuid }, getTimestamp(start = 0, end = 13) { const timestamp = Date.now() const num = timestamp.toString().substring(start, end) return Number(num) }, getDatetime(num = false, slash = true) { const today = new Date() const year = today.getFullYear() let month = today.getMonth() + 1 let day = today.getDate() month = month < 10 ? "0" + month : month day = day < 10 ? "0" + day : day const dateNow = num ? Number(`${year}${month}${day}`) : slash ? `${month}/${day}/${year}` : `${year}-${month}-${day}` return dateNow }, isJSON(s) { try { const j = JSON.parse(s) const p = Array.isArray(j) || (typeof j === "object" && j !== null) return p ? true : false } catch { return false } }, log(title, text, push = false) { GM_log(title + text + "🔚") if (!GM_getValue("Notice.bro", true) || !push) return GM_notification({ text: text, title: GM_info.script.name + title, onclick: () => { if (typeof push === 'string' && push.startsWith('http')) { GM_openInTab(push, { active: true, insert: true, setParent: true }); } else if (title.includes("🔵") || title.includes("🎉")) { GM_openInTab("https://rewards.bing.com/earn", { active: true, insert: true, setParent: true }); } else { GM_openInTab("https://rewards.bing.com/dashboard", { active: true, insert: true, setParent: true }); } }, }) }, xhr(options, only = false) { return new Promise((resolve, reject) => { const start = FuckF.getTimestamp(); try { GM_xmlhttpRequest({ ...options, timeout: 15000, ontimeout: () => { const cost = (FuckF.getTimestamp() - start) / 1000; reject(new Error(`请求超时!用时 ${cost} 秒`)); }, onload: (xhr) => { const cost = (FuckF.getTimestamp() - start) / 1000; if (xhr.status >= 200 && xhr.status < 300) { resolve(only ? xhr.finalUrl : xhr.responseText); return; } const redirectStatuses = [301, 302, 307, 308]; if (redirectStatuses.includes(xhr.status)) { const match = xhr.responseHeaders?.match(/Location:\s*(.*?)\s*\r?\n/i); resolve(match ? match[1] : false); return; } reject(new Error(`请求失败,用时 ${cost} 秒,状态码:${xhr.status}`)); }, onerror: (err) => { const cost = (FuckF.getTimestamp() - start) / 1000; let errDetail = ""; if (err) { errDetail = err.error || err.statusText || (typeof err === "object" ? JSON.stringify(err) : err); } else { errDetail = "未知网络错误"; } reject(new Error(`请求异常!用时 ${cost} 秒 🔛${errDetail}`)); }, }); } catch (e) { reject(e); } }); }, } FuckF.getRandomSubstring = (str, min = 20, max = 32) => { const length = str.length if (length <= min) { return str } const randomLength = FuckF.getScopeRandomNum(min, max) return str.substring(0, randomLength) } FuckF.getRandomApiHot = () => { const lastIndex = parseInt(GM_getValue("Config.index", -1)) const filteredArr = FuckD.api.hot.filter((name, index) => index != lastIndex) const randomIndex = FuckF.getRandomNum(filteredArr.length) GM_setValue("Config.index", randomIndex) return filteredArr[randomIndex] } FuckF.getToken = async (url, maxRetries = 3) => { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const result = await FuckF.xhr({ url: url }); if (!FuckF.isJSON(result)) { if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, 3210)); continue; } return false; } const res = JSON.parse(result); if (res.error) { FuckF.log("\u{1F534}", `Token错误: ${res.error} - ${res.error_description || ''}`); if (["invalid_grant","invalid_request"].includes(res.error)) { GM_setValue("Config.token", false); GM_setValue("Config.code", ""); } return false; } if (res.refresh_token && res.access_token) { GM_setValue("Config.token", res.refresh_token); GM_setValue("Config.tokenTime", FuckF.getTimestamp()); FuckD.bing.token = res.access_token; return true; } if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, 3210)); continue; } return false; } catch (e) { if (e.message.includes("400") || e.message.includes("401")) { GM_setValue("Config.token", false); GM_setValue("Config.code", ""); return false; } if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, 3210)); continue; } FuckF.log("\u{1F534}", `Token 请求失败!\u{1F51B}${e.message}`); return false; } } return false; } FuckF.renewToken = async () => { if (!FuckD.tasks.sign && !FuckD.tasks.read) return true; let refreshToken = GM_getValue("Config.token", false); const tokenTime = GM_getValue("Config.tokenTime", 0); // Token 超过 7 天提前续期 if (tokenTime > 0) { const days = (FuckF.getTimestamp() - tokenTime) / (1000 * 60 * 60 * 24); if (days > 7) { FuckF.log("\u{1F7E1}", `Token已${Math.floor(days)}天,提前续期`); refreshToken = false; } } const authUrl = "https://login.live.com/oauth20_authorize.srf?client_id=0000000040170455&response_type=code&scope=service::prod.rewardsplatform.microsoft.com::MBI_SSL&redirect_uri=https://login.live.com/oauth20_desktop.srf"; const fetchCodeLogic = async (msg) => { GM_setValue("Config.code", ""); FuckF.log("\u{1F7E1}", `${msg},尝试自动获取授权码...`); try { const res = await new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: "GET", url: authUrl, headers: { "User-Agent": navigator.userAgent }, onload: (r) => resolve(r), onerror: () => reject(new Error("请求失败")), ontimeout: () => reject(new Error("超时")), timeout: 15000 }); }); const finalUrl = res.finalUrl || ""; const code = new URL(finalUrl).searchParams.get("code"); if (code) { FuckF.log("\u{1F7E2}", "自动获取授权码成功"); return [code]; } } catch (e) { FuckF.log("\u{1F7E1}", `自动获取失败: ${e.message}`); } FuckF.log("\u{1F7E1}", "请手动完成授权..."); GM_openInTab(authUrl, { active: true, insert: true, setParent: true }); if (GM_getValue("Notice.bro", true)) { try { GM_notification({ text: "完成后粘贴地址栏URL到脚本设置的「授权码链接」", title: "\u{1F7E1} 需要授权", timeout: 0 }); } catch(_) {} } for (let i = 0; i < 180; i++) { await new Promise(r => setTimeout(r, 1000)); const raw = GM_getValue("Config.code", ""); if (!raw) continue; let code = null; if (raw.includes("code=")) { try { const url = new URL(raw); code = url.searchParams.get("code"); } catch {} } if (!code && raw.length > 20 && !raw.includes("http")) { code = raw.trim(); } if (code && code.length > 10) { FuckF.log("\u{1F7E2}", "授权码获取成功"); return [code]; } } FuckF.log("\u{1F534}", "授权码获取超时", true); return false; }; if (!refreshToken) { const codeMatch = await fetchCodeLogic("检测到授权码为空"); if (!codeMatch) return false; const url = `https://login.live.com/oauth20_token.srf?client_id=0000000040170455&code=${encodeURIComponent(codeMatch[0])}&redirect_uri=https://login.live.com/oauth20_desktop.srf&grant_type=authorization_code`; const token = await FuckF.getToken(url); if (!token) { const retry = await fetchCodeLogic("授权码失效"); if (!retry) return false; return await FuckF.renewToken(); } FuckD.bing.sendMSG = "Token 获取成功!"; FuckF.log("\u{1F7E2}", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); return true; } else { const url = `https://login.live.com/oauth20_token.srf?client_id=0000000040170455&refresh_token=${encodeURIComponent(refreshToken)}&scope=service::prod.rewardsplatform.microsoft.com::MBI_SSL&grant_type=REFRESH_TOKEN`; const token = await FuckF.getToken(url); if (!token) { GM_setValue("Config.token", false); GM_setValue("Config.code", ""); const codeMatch = await fetchCodeLogic("检测到 Token 失效"); if (!codeMatch) return false; return await FuckF.renewToken(); } return true; } } FuckF.getRewardsInfo = async (maxRetries = 3) => { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const earnHtml = await FuckF.xhr({ url: "https://rewards.bing.com/earn" }); const cleanHtml = earnHtml.replace(/\\"/g, '"'); const balMatch = cleanHtml.match(/"balance":(\d+)/) || cleanHtml.match(/"availablePoints":(\d+)/); const keyword = '"pointsCounters":{'; const idx = cleanHtml.indexOf(keyword); if (!balMatch || idx === -1) { if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, 3210)); continue; } return false; } let balance = parseInt(balMatch[1]); let pcMax = 60, pcCur = 0; let mobMax = 0, mobCur = 0; let dailyPoint = 0; let todayTotal = 0; let start = idx + 17; let openBraces = 0; let end = start; for (let i = start; i < cleanHtml.length; i++) { if (cleanHtml[i] === '{') openBraces++; if (cleanHtml[i] === '}') { openBraces--; if (openBraces === 0) { end = i + 1; break; } } } try { const pts = JSON.parse(cleanHtml.substring(start, end)); pcMax = pts.pc?.max ?? 60; pcCur = pts.pc?.progress ?? 0; mobMax = pts.mobile?.max ?? 0; mobCur = pts.mobile?.progress ?? 0; dailyPoint = pts.dailyOffer ?? 0; todayTotal = pts.totalPoints ?? 0; } catch { FuckF.log("🟡", "仪表盘解析异常,将使用保底数值"); } FuckD.bing.todayTotalPoints = todayTotal; return { userStatus: { availablePoints: balance, counters: { pcSearch: [{ pointProgress: pcCur, pointProgressMax: pcMax }], mobileSearch: [{ pointProgress: mobCur, pointProgressMax: mobMax }], dailyPoint: [{ pointProgress: dailyPoint }] } } }; } catch (e) { if (attempt < maxRetries) { await new Promise(resolve => setTimeout(resolve, 3210)); continue; } FuckF.log("🔴", `仪表盘请求失败!🔛 ${e.message}`); } } return false; } FuckF.taskSign = async () => { if (!FuckD.tasks.sign || FuckD.sign.date == FuckD.bing.dateNowNum || FuckD.sign.times > 2 || FuckD.sign.end > 0) { FuckD.sign.end++ return true } if (FuckD.sign.point >= 0) { FuckD.sign.end++ if (FuckD.sign.date != FuckD.bing.dateNowNum) { FuckD.sign.date = FuckD.bing.dateNowNum FuckD.bing.sendMSG = `📅签入任务已完成!\n${FuckD.sign.point > 0 ? `✨今日签入奖励:${FuckD.sign.point}` : "🍵今日已签入,无法二次签入"}` FuckF.log("🔵", FuckD.bing.sendMSG, true) FuckF.send(FuckD.wh) } GM_setValue("Config.tasks", FuckD.bing.tasks) return true } try { const envStatus = await FuckF.mainlandCheck(); if (envStatus === 1) { FuckD.bing.code = -1; return true; } const region = FuckD.bing.status ? "cn" : FuckD.bing.region.toLowerCase() const result = await FuckF.xhr({ method: "POST", url: "https://prod.rewardsplatform.microsoft.com/dapi/me/activities", headers: { "content-type": "application/json; charset=UTF-8", "user-agent": FuckD.ua.m, "authorization": `Bearer ${FuckD.bing.token}`, "x-rewards-appid": "SAAndroid/31.4.2110003555", "x-rewards-ismobile": "true", "x-rewards-country": region, "x-rewards-partnerid": "startapp", "x-rewards-flights": "rwgobig", }, data: JSON.stringify({ "amount": 1, "attributes": {}, "id": FuckF.getRandomUUID(), "type": 103, "country": region, "risk_context": {}, "channel": "SAAndroid", }), }) if (result && FuckF.isJSON(result)) { FuckD.sign.times = 0 const res = JSON.parse(result) const point = res.response.activity.p FuckD.sign.point = point || 0; GM_setValue("Config.signPoint", FuckD.sign.point); } else { FuckD.sign.times++ } } catch (e) { FuckF.log("🔴", `签入任务出错!🔛${e.message}`) FuckD.sign.times++; } return false } FuckF.getReadPro = async () => { try { const result = await FuckF.xhr({ url: "https://prod.rewardsplatform.microsoft.com/dapi/me?channel=SAAndroid&options=613", headers: { "content-type": "application/json; charset=UTF-8", "user-agent": FuckD.ua.m, "authorization": `Bearer ${FuckD.bing.token}`, "x-rewards-appid": "SAAndroid/31.4.2110003555", "x-rewards-ismobile": "true", }, }); if (result && FuckF.isJSON(result)) { const res = JSON.parse(result); const promos = res.response?.promotions || []; const readTask = promos.find(x => x.attributes?.offerid === 'ENUS_readarticle3_30points'); if (readTask) { const progress = parseInt(readTask.attributes.progress) || 0; const max = parseInt(readTask.attributes.max) || 30; return { progress, max }; } } } catch (e) { FuckF.log("🔴", `阅读进度获取出错!🔛${e.message}`); } return false; } FuckF.taskRead = async () => { if (!FuckD.tasks.read || FuckD.read.times > 2 || FuckD.read.end > 0) { FuckD.read.end++; return true; } try { const readPro = await FuckF.getReadPro(); if (!readPro) { FuckD.read.times++ return false; } let cur = readPro.progress || 0; let max = readPro.max || 30; if (FuckD.read.date != FuckD.bing.dateNowNum) { FuckF.log("📖", `阅读进度获取成功:${cur}/${max}`); await new Promise(resolve => setTimeout(resolve, 500)); } if (cur >= max) { if (FuckD.read.date != FuckD.bing.dateNowNum) { FuckF.log("📖", "接口返回进度已满,但本地无今日记录,强制开始阅读..."); cur = 0; max = 30; } else { FuckD.read.end++; return true; } } const envStatus = await FuckF.mainlandCheck(); if (envStatus === 1) { FuckD.bing.code = -1; return true; } const region = FuckD.bing.status ? "cn" : FuckD.bing.region.toLowerCase(); FuckD.read.date = 0; const readsNeeded = Math.ceil((max - cur) / 3); for (let i = 0; i < readsNeeded; i++) { await FuckF.xhr({ method: "POST", url: "https://prod.rewardsplatform.microsoft.com/dapi/me/activities", headers: { "content-type": "application/json; charset=UTF-8", "user-agent": FuckD.ua.m, "authorization": `Bearer ${FuckD.bing.token}`, "x-rewards-appid": "SAAndroid/31.4.2110003555", "x-rewards-ismobile": "true", "x-rewards-country": region, }, data: JSON.stringify({ "amount": 1, "country": region, "id": FuckF.getRandomUUID(), "type": 101, "attributes": { "offerid": "ENUS_readarticle3_30points", }, }), }); FuckF.log("📖", `正在阅读第 ${i + 1}/${readsNeeded} 篇文章...`); const waitTime = FuckF.getScopeRandomNum(3000, 7000); await new Promise(resolve => setTimeout(resolve, waitTime)); } FuckD.read.end++; if (FuckD.read.date != FuckD.bing.dateNowNum) { FuckD.read.date = FuckD.bing.dateNowNum; GM_setValue("Config.tasks", FuckD.bing.tasks); const actualCur = cur + (readsNeeded * 3); const finalCur = actualCur > max ? max : actualCur; GM_setValue("Config.readPoint", finalCur); FuckD.bing.sendMSG = `📖阅读任务已完成!\n✨今日阅读奖励:${finalCur}/${max}`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } return true; } catch (e) { FuckF.log("🔴", `阅读任务出错!🔛${e.message}`); FuckD.read.times++; return false; } } FuckF.taskPromos = async () => { if (!FuckD.tasks.promos || FuckD.promos.times > 2 || FuckD.promos.end > 0 || (!GM_getValue("Config.keep", true) && FuckD.promos.date == FuckD.bing.dateNowNum)) { FuckD.promos.end++; return true; } let promosArr = []; let seenIds = new Set(); let dashPoints = 0, dashMax = 0; let earnPoints = 0, earnMax = 0; try { const dashHtml = await FuckF.xhr({ url: "https://rewards.bing.com/dashboard" }); const cleanDash = dashHtml.replace(/\\"/g, '"'); const todayStr = FuckF.getDatetime(false, true); const dashMatch = cleanDash.match(/"dailySetItems":(\[.*?\]),"discovery"/); if (dashMatch && dashMatch[1]) { const dailySetItems = JSON.parse(dashMatch[1].replace(/\\"/g, '"')); for (const item of dailySetItems) { if (item.points === 0 || seenIds.has(item.offerId) || item.date !== todayStr) continue; seenIds.add(item.offerId); dashMax += item.points; if (item.isCompleted) { dashPoints += item.points; } else { promosArr.push({ id: item.offerId, hash: item.hash, url: "https://rewards.bing.com/dashboard", points: item.points, type: "dash" }); } } } const earnHtml = await FuckF.xhr({ url: "https://rewards.bing.com/earn" }); const cleanEarn = earnHtml.replace(/\\"/g, '"'); if (cleanEarn.includes('"activityCards":[')) { const daysEn = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; const todayDayEn = daysEn[new Date().getDay()]; const taskRegex = /"isCompleted":(true|false).*?"points":(\d+).*?"offerId":"([^"]+)","hash":"([^"]+)"/g; let match; while ((match = taskRegex.exec(cleanEarn)) !== null) { const isCompleted = match[1] === "true"; const points = parseInt(match[2]); const offerId = match[3]; const hash = match[4]; if (points === 0 || seenIds.has(offerId)) continue; if (isCompleted) { if (offerId.includes("Evergreen") && !offerId.includes(todayDayEn)) continue; const dateMatch = offerId.match(/(20\d{6})/); if (dateMatch && dateMatch[1] !== FuckD.bing.dateNowNum.toString()) continue; if (/(w[1-5]|week|month)/i.test(offerId) || /(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}/i.test(offerId)) continue; } seenIds.add(offerId); earnMax += points; if (isCompleted) { earnPoints += points; } else { promosArr.push({ id: offerId, hash: hash, url: "https://rewards.bing.com/earn", points: points, type: "earn" }); } } } } catch (e) { FuckF.log("🔴", `活动解析出错!🔛${e.message}`); } const todayPromosSaved = FuckD.promos.date == FuckD.bing.dateNowNum ? GM_getValue("Config.promosPoint", 0) : 0; GM_setValue("Config.promosPoint", Math.max(todayPromosSaved, dashPoints + earnPoints)); const dashTasks = promosArr.filter(i => i.type === 'dash').length; const earnTasks = promosArr.filter(i => i.type === 'earn').length; const totalNewTasks = dashTasks + earnTasks; if (totalNewTasks < 1) { FuckD.promos.end++; if (FuckD.promos.date != FuckD.bing.dateNowNum) { FuckD.promos.date = FuckD.bing.dateNowNum; GM_setValue("Config.tasks", FuckD.bing.tasks); const dashReport = dashMax > 0 ? `\n📱手机端活动:${dashPoints}/${dashMax}` : ""; const earnReport = earnMax > 0 ? `\n💻电脑端活动:${earnPoints}/${earnMax}` : ""; FuckD.bing.sendMSG = `🧩活动任务已完成!${dashReport}${earnReport}`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } return true; } try { const envStatus = await FuckF.mainlandCheck(); if (envStatus === 1) { FuckD.bing.code = -1; return true; } FuckD.promos.date = 0; const taskMsgs = []; if (dashTasks > 0) taskMsgs.push(`${dashTasks}个手机端活动`); if (earnTasks > 0) taskMsgs.push(`${earnTasks}个电脑端活动`); FuckF.log("🧩", `检测到有${taskMsgs.join("、")}未完成,开始执行...`); await new Promise(resolve => setTimeout(resolve, 500)); let dashCurrent = 1; let earnCurrent = 1; for (const item of promosArr) { if (item.type === 'dash') { FuckF.log("📱", `正在执行第${dashCurrent}/${dashTasks}个手机端活动...`); dashCurrent++; } else { FuckF.log("💻", `正在执行第${earnCurrent}/${earnTasks}个电脑端活动...`); earnCurrent++; } const reqHeaders = { "content-type": "text/plain;charset=UTF-8", "next-action": "70babbc81d2724f60d29a95c03b3d739cba77cea92", "referer": item.url, }; if (item.type === 'dash') { reqHeaders["next-router-state-tree"] = "%5B%22%22%2C%7B%22children%22%3A%5B%22(nav)%22%2C%7B%22children%22%3A%5B%22dashboard%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%2Ctrue%5D"; } await FuckF.xhr({ method: "POST", url: item.url, headers: reqHeaders, data: JSON.stringify([ item.hash, 11, { "offerid": item.id, "isPromotional": "$undefined", "timezoneOffset": "-480" } ]), }); if (item.type === 'dash') { dashPoints += item.points; } else { earnPoints += item.points; } GM_setValue("Config.promosPoint", Math.max(todayPromosSaved, dashPoints + earnPoints)); if (dashCurrent - 1 + earnCurrent - 1 < totalNewTasks) { await new Promise(resolve => setTimeout(resolve, FuckF.getScopeRandomNum(2000, 4000))); } } FuckD.promos.end++; if (FuckD.promos.date != FuckD.bing.dateNowNum) { FuckD.promos.date = FuckD.bing.dateNowNum; GM_setValue("Config.tasks", FuckD.bing.tasks); const dashReport = dashMax > 0 ? `\n📱手机端活动:${dashPoints}/${dashMax}` : ""; const earnReport = earnMax > 0 ? `\n💻电脑端活动:${earnPoints}/${earnMax}` : ""; FuckD.bing.sendMSG = `🧩活动任务已完成!${dashReport}${earnReport}`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } return true; } catch (e) { FuckF.log("🔴", `活动交卷出错!🔛${e.message}`); } FuckD.promos.times++; return false; } FuckF.getQueryWord = async () => { const keywords = ["天气预报", "今日新闻", "体育赛事", "股票行情", "电影推荐", "科技资讯", "美食食谱", "旅游攻略", "历史上的今天", "健康常识"]; const baseWord = keywords[FuckF.getRandomNum(keywords.length)]; const randomSuffix = Math.random().toString(36).slice(2, 6); let sentence = `${baseWord} ${randomSuffix}`; if (FuckD.api.mode != "offline") { if (FuckD.search.word.index < 1 || FuckD.search.word.list.length < 1) { const apiHot = FuckF.getRandomApiHot() try { const result = await FuckF.xhr({ url: FuckD.api.url + apiHot }) if (result && FuckF.isJSON(result)) { const res = JSON.parse(result) if (res.code == 200) { FuckD.search.word.index = 1 for (let i = 0; i < res.data.length; i++) { FuckD.search.word.list.push(res.data[i].title) } FuckD.search.word.list = FuckF.getRandomArr(FuckD.search.word.list) sentence = FuckD.search.word.list[FuckD.search.word.index] sentence = FuckF.getRandomSubstring(sentence) return sentence } } } catch (e) { FuckF.log("🔴", `搜索词获取出错!🔛${e.message}`) } } else { FuckD.search.word.index++ if (FuckD.search.word.index > FuckD.search.word.list.length - 1) { FuckD.search.word.index = 0 } sentence = FuckD.search.word.list[FuckD.search.word.index] sentence = FuckF.getRandomSubstring(sentence) return sentence } FuckF.log("🟡", "搜索词接口异常,已临时使用随机搜索词") } return sentence } FuckF.taskSearch = async () => { if (!FuckD.tasks.search || FuckD.search.end > 0 || (!GM_getValue("Config.keep", true) && FuckD.search.date == FuckD.bing.dateNowNum)) { FuckD.search.end++; return true; } if (FuckD.search.index === 0) { const dashboard = await FuckF.getRewardsInfo(); if (!dashboard) { return false; } const searchInfo = dashboard.userStatus?.counters || {}; FuckD.search.pc.progress = searchInfo.pcSearch?.[0]?.pointProgress || 0; let pcMax = searchInfo.pcSearch?.[0]?.pointProgressMax || 0; if (pcMax === 0) pcMax = 60; FuckD.search.pc.max = pcMax; FuckD.search.m.progress = searchInfo.mobileSearch?.[0]?.pointProgress || 0; let mMax = searchInfo.mobileSearch?.[0]?.pointProgressMax || 0; if (mMax === 0) mMax = 0; FuckD.search.m.max = mMax; const currentTotalSearch = FuckD.search.pc.progress + FuckD.search.m.progress; const lastTotalSearch = GM_getValue("Config.lastSearchProgress", -1); let restrictedTimes = GM_getValue("Config.restrictedTimes", 0); if (lastTotalSearch !== -1) { if (currentTotalSearch === lastTotalSearch && currentTotalSearch < (pcMax + mMax)) { restrictedTimes++; } else { restrictedTimes = 0; } } GM_setValue("Config.lastSearchProgress", currentTotalSearch); GM_setValue("Config.restrictedTimes", restrictedTimes); if (restrictedTimes >= 2) { FuckD.search.end++; GM_setValue("Config.lastSearchProgress", -1); GM_setValue("Config.restrictedTimes", 0); const pcReport = FuckD.search.pc.max > 0 ? `\n💻电脑端搜索:${FuckD.search.pc.progress}/${FuckD.search.pc.max}` : ""; const mReport = FuckD.search.m.max > 0 ? `\n📱手机端搜索:${FuckD.search.m.progress}/${FuckD.search.m.max}` : ""; FuckD.bing.sendMSG = `⚠️积分收入受限或账号异常,已中断今日搜索!${pcReport}${mReport}`; FuckF.log("🔴", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); return true; } } if (FuckD.search.pc.progress >= FuckD.search.pc.max && FuckD.search.m.progress >= FuckD.search.m.max) { await new Promise(resolve => setTimeout(resolve, 3210)); const dashboard = await FuckF.getRewardsInfo(); if (dashboard) { const searchInfo = dashboard.userStatus?.counters || {}; const realPcPro = searchInfo.pcSearch?.[0]?.pointProgress || 0; const realMPro = searchInfo.mobileSearch?.[0]?.pointProgress || 0; if (realPcPro >= FuckD.search.pc.max && realMPro >= FuckD.search.m.max) { FuckD.search.end++; if (FuckD.search.date != FuckD.bing.dateNowNum) { FuckD.search.date = FuckD.bing.dateNowNum; GM_setValue("Config.tasks", FuckD.bing.tasks); GM_setValue("Config.lastSearchProgress", -1); GM_setValue("Config.restrictedTimes", 0); const pcReport = FuckD.search.pc.max > 0 ? `\n💻电脑端搜索:${realPcPro}/${FuckD.search.pc.max}` : ""; const mReport = FuckD.search.m.max > 0 ? `\n📱手机端搜索:${realMPro}/${FuckD.search.m.max}` : ""; FuckD.bing.sendMSG = `🔍搜索任务已完成!${pcReport}${mReport}`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } return true; } else { FuckD.search.pc.progress = realPcPro; FuckD.search.m.progress = realMPro; FuckF.log("🔍", `检测到搜索数据延迟或漏分,开始补搜...`); } } else { FuckD.search.end++; return true; } } if (FuckD.search.index >= FuckD.search.limit) { FuckD.search.end++; const pcReport = FuckD.search.pc.max > 0 ? `\n💻电脑端搜索:${FuckD.search.pc.progress}/${FuckD.search.pc.max}` : ""; const mReport = FuckD.search.m.max > 0 ? `\n📱手机端搜索:${FuckD.search.m.progress}/${FuckD.search.m.max}` : ""; FuckD.bing.sendMSG = `本轮运行正常,共搜索 ${FuckD.search.index} 次!${pcReport}${mReport}`; FuckF.log("🔍", FuckD.bing.sendMSG); FuckF.send(FuckD.wh); return true; } FuckD.search.date = 0; let query, params, pcorm, headers, regionMKT = ""; if (FuckD.search.pc.progress < FuckD.search.pc.max || FuckD.search.m.progress < FuckD.search.m.max) { pcorm = Math.random() > 0.6 ? false : true; if (FuckD.search.pc.progress >= FuckD.search.pc.max) pcorm = false; if (FuckD.search.m.progress >= FuckD.search.m.max) pcorm = true; } const keyword = await FuckF.getQueryWord(); try { const envStatus = await FuckF.mainlandCheck(); if (envStatus === 1) { FuckD.bing.code = -1; return true; } GM_cookie("delete", { url: "https://bing.com", name: "_EDGE_S" }); GM_cookie("delete", { url: "https://bing.com", name: "_Rwho" }); GM_cookie("delete", { url: "https://bing.com", name: "_RwBf" }); if (FuckD.bing.status) regionMKT = "&mkt=zh-CN"; params = `q=${encodeURIComponent(keyword)}&form=QBLH${regionMKT}`; query = `https://${FuckD.bing.host}/search?${params}`; if (pcorm) { FuckD.search.device = "Desktop"; headers = { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", "user-agent": FuckD.ua.pc, "cookie": `_Rwho=u=d&ts=${FuckD.bing.dateNowhyphen}`, }; } else { FuckD.search.device = "Mobile"; headers = { "content-type": "application/x-www-form-urlencoded; charset=UTF-8", "user-agent": FuckD.ua.m, "cookie": `_Rwho=u=m&ts=${FuckD.bing.dateNowhyphen}`, }; } const result = await FuckF.xhr({ url: query, headers: { ...headers, "referer": `https://${FuckD.bing.host}/?form=QBLH`, } }); if (result) { const res = result.replace(/\s/g, ""); const data0 = res.match(/,IG:"([^"]+)"/); const guid = data0 ? data0[1] : FuckF.getRandomUUID(true); const data = res.match(/class="b_algo(.*?)href="(.*?)"h="ID=(.*?)">(.*?)<\/h2/); const ncheader = `https://${FuckD.bing.host}/rewardsapp/ncheader?ver=88888888&IID=SERP.5047&IG=${guid}&ajaxreq=1`; const report = `https://${FuckD.bing.host}/rewardsapp/reportActivity?IG=${guid}&IID=SERP.5047&${params}&ajaxreq=1`; headers = { ...headers, "referer": query }; await FuckF.xhr({ method: "POST", url: ncheader, headers: headers, data: "wb=1%3bi%3d1%3bv%3d1" }); await FuckF.xhr({ method: "POST", url: report, headers: headers, data: `url=${encodeURIComponent(query)}&V=web` }); if (data) { const click = `https://${FuckD.bing.host}/fd/ls/GLinkPingPost.aspx?IG=${guid}&ID=${data[3]}&url=${data[2]}`; await FuckF.xhr({ url: click, headers: headers }); } if (pcorm) { FuckD.search.pc.progress += 3; if (FuckD.search.pc.progress > FuckD.search.pc.max) FuckD.search.pc.progress = FuckD.search.pc.max; } else { FuckD.search.m.progress += 3; if (FuckD.search.m.progress > FuckD.search.m.max) FuckD.search.m.progress = FuckD.search.m.max; } } } catch (e) { FuckF.log("🔴", `搜索任务出错!🔛${e.message}`); } FuckD.search.index++; return false; } FuckF.mainlandCheck = async () => { try { const hash = ["g", "e", "o", "i", "s", "a", "m"].join(""); if (!GM_info.script.header.includes(hash)) { FuckD.bing.mainland = -1; return 1; } const result = await FuckF.xhr({ url: `https://${FuckD.bing.host}/`, headers: { "cookie": FuckD.cookie.mkt } }); if (result) { const res = result.replace(/\s/g, ""); const data = res.match(/Region:"(.*?)"(.*?)RevIpCC:"(.*?)"/); if (data) { const ipcc = data[3].toUpperCase(); FuckD.bing.region = ipcc; if (FuckD.bing.status && ipcc != "CN") { try { const qryResult = await FuckF.xhr({ url: "https://disp-qryapi.3g.qq.com/v1/dispatch", headers: { "referer": "https://3g.qq.com/" } }); if (qryResult && FuckF.isJSON(qryResult)) { const resJSON = JSON.parse(qryResult); FuckD.bing.ip = (resJSON.code == 0 && resJSON.extra && resJSON.extra.ip) ? resJSON.extra.ip : ""; let rawInfo = (resJSON.code == 0 && resJSON.ipInfo) ? String(resJSON.ipInfo) : ""; rawInfo = rawInfo.replace(/[#*]+/g, " ").trim(); FuckD.bing.ipInfo = rawInfo ? `\n🌏所在地区:${rawInfo}` : ""; } } catch { console.debug("获取附加 IP 信息失败"); } return 1; } } return 0; } return 2; } catch { return 2; } } FuckF.send = async (webhook) => { const now = new Date() FuckD.bing.datetimeLocaleStr = now.toLocaleString() await Promise.all(webhook.map(async (i) => { if (!i.key) return let message = `「${i.name}」消息推送` const safeKey = String(i.key).trim(); const targetUrl = safeKey.startsWith("http") ? safeKey : i.url + safeKey; try { const result = await FuckF.xhr({ method: "POST", url: targetUrl, headers: { "content-type": "application/json; charset=UTF-8", }, data: JSON.stringify(i.msg), }) if (result) FuckF.log("🔵", `${message}完成 🔛${result}`) } catch (e) { FuckF.log("🔴", `消息推送出错!🔛${e.message}`) } })) } return new Promise((resolve) => { const seconds = FuckF.getTimestamp() GM_cookie("delete", { url: "https://bing.com", name: "_EDGE_S" }) FuckD.search.limit = FuckF.getScopeRandomNum(4, 7) FuckD.bing.dateNowNum = FuckF.getDatetime(true) FuckD.bing.dateNowhyphen = FuckF.getDatetime(false, false) const tasksArr = GM_getValue("Config.tasks", false) FuckD.sign.date = tasksArr ? tasksArr.sign : 0 FuckD.read.date = tasksArr ? tasksArr.read : 0 FuckD.promos.date = tasksArr ? tasksArr.promos : 0 FuckD.search.date = tasksArr ? tasksArr.search : 0 if (FuckD.api.mode != "offline") { const defaultApiName = "hot.baiwumm.com" const currentApiName = GM_getValue("Config.api", defaultApiName) const apiConfigMap = new Map(FuckD.api.arr) const getConfigApi = apiConfigMap.get(currentApiName) || apiConfigMap.get(defaultApiName) FuckD.api.url = getConfigApi.url FuckD.api.hot = getConfigApi.hot if (!apiConfigMap.has(currentApiName)) { GM_setValue("Config.api", "offline") FuckF.log("🟡", "搜索词接口配置错误,已替换为offline") } } FuckF.tasksEnd = async () => { if (FuckD.bing.code < 0) { if (FuckD.bing.code === -1) { FuckD.bing.code = -2; FuckD.bing.sendMSG = `🚫当前 IP 非中国大陆地区,已停止运行!\n⛔IP 地址:${FuckD.bing.ip} - ${FuckD.bing.region}${FuckD.bing.ipInfo}`; FuckF.log("🔴", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } return resolve(); } const endS = !FuckD.tasks.sign || FuckD.sign.end > 0; const endR = !FuckD.tasks.read || FuckD.read.end > 0; const endP = !FuckD.tasks.promos || FuckD.promos.end > 0; const endSe = !FuckD.tasks.search || FuckD.search.end > 0; if (endS && endR && endP && endSe) { FuckD.bing.end-- if (FuckD.bing.end === 0) { const checkDone = (taskEnabled, taskDate) => !taskEnabled || taskDate == FuckD.bing.dateNowNum; const isAllDone = checkDone(FuckD.tasks.sign, FuckD.sign.date) && checkDone(FuckD.tasks.read, FuckD.read.date) && checkDone(FuckD.tasks.promos, FuckD.promos.date) && checkDone(FuckD.tasks.search, FuckD.search.date); if (isAllDone) { const allDoneDate = GM_getValue("Config.allDoneDate", 0); if (allDoneDate != FuckD.bing.dateNowNum) { GM_setValue("Config.allDoneDate", FuckD.bing.dateNowNum); const dashboard = await FuckF.getRewardsInfo(); const counters = dashboard?.userStatus?.counters || {}; const pcPro = counters.pcSearch?.[0]?.pointProgress || 0; const mPro = counters.mobileSearch?.[0]?.pointProgress || 0; const readPro = (FuckD.read.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.readPoint", 0) : 0; const promosPro = (FuckD.promos.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.promosPoint", 0) : 0; const signPro = (FuckD.sign.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.signPoint", 0) : 0; const todayPoints = pcPro + mPro + readPro + promosPro + signPro; const availablePoints = dashboard?.userStatus?.availablePoints || 0; await new Promise(resolve => setTimeout(resolve, 1000)); FuckD.bing.sendMSG = `🎉今日所选任务已全部完成!\n✨今日共获取:${todayPoints} 积分\n💰 当前总积分:${availablePoints} 积分`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } else { await new Promise(resolve => setTimeout(resolve, 1000)); FuckF.log("💤", "今日所选任务已全部完成,继续保持休眠..."); } } else { await new Promise(resolve => setTimeout(resolve, 1000)); FuckF.log("🔵", `本次运行结束!用时 ${(FuckF.getTimestamp() - seconds) / 1000} 秒`); } } resolve() } } FuckF.signStart = async () => { const result = await FuckF.taskSign() if (!result) { setTimeout(() => { FuckF.signStart() }, FuckD.bing.time) } else { FuckF.tasksEnd() } } FuckF.readStart = async () => { const result = await FuckF.taskRead() if (!result) { setTimeout(() => { FuckF.readStart() }, FuckD.bing.time) } else { FuckF.tasksEnd() } } FuckF.promosStart = async () => { const result = await FuckF.taskPromos() if (!result) { setTimeout(() => { FuckF.promosStart() }, FuckD.bing.time) } else { FuckF.tasksEnd() } } FuckF.searchStart = async () => { const result = await FuckF.taskSearch() if (!result) { let timespan = FuckD.bing.time if (FuckD.search.index < FuckD.search.limit) { const span = Number(FuckD.bing.span) || 30; const spanMIN = (span - 15) * 1000 const spanMAX = (span + 15) * 1000 timespan = FuckF.getScopeRandomNum(spanMIN, spanMAX) } FuckF.log("🔍", `第 ${FuckD.search.index}/${FuckD.search.limit} 次搜索完成\n(${FuckD.search.device}),等待 ${timespan / 1000} 秒后继续...`) setTimeout(() => { FuckF.searchStart() }, timespan) } else { FuckF.tasksEnd() } } FuckF.tasksStart = async (initDelay = 0) => { if (GM_info.script.author != "geoisam@qq.com") return resolve(); const host = "www.bing.com" if (!FuckD.bing.host) { if (FuckD.bing.status) { FuckD.bing.host = "cn.bing.com" } else { let url = await FuckF.xhr({ url: `https://${host}/`, headers: { "cookie": FuckD.cookie.mkt, }, }, true) url = new URL(url) FuckD.bing.host = url ? url.host : host } } const envStatus = await FuckF.mainlandCheck() if (envStatus === 1) { FuckD.bing.code = -1 FuckF.tasksEnd() return resolve() } else if (envStatus === 2) { FuckD.bing.sendMSG = "🚫网络连接异常,已停止运行!"; FuckF.log("🔴", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); return resolve(); } else { const isKeep = GM_getValue("Config.keep", true); const needSign = FuckD.tasks.sign && (isKeep || FuckD.sign.date != FuckD.bing.dateNowNum); const needRead = FuckD.tasks.read && (isKeep || FuckD.read.date != FuckD.bing.dateNowNum); const needPromos = FuckD.tasks.promos && (isKeep || FuckD.promos.date != FuckD.bing.dateNowNum); const needSearch = FuckD.tasks.search && (isKeep || FuckD.search.date != FuckD.bing.dateNowNum); FuckF.log("🔵", `初始化运行完成!用时 ${((FuckF.getTimestamp() - seconds) - initDelay) / 1000} 秒`); const isTokenOK = await FuckF.renewToken(); if (!isTokenOK) { FuckD.tasks.sign = false; FuckD.tasks.read = false; FuckD.bing.sendMSG = "Token 请求失败,已自动跳过签入和阅读任务,请检查网络连接"; await new Promise(resolve => setTimeout(resolve, 500)); FuckF.log("🟡", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } if (needPromos || needSearch) { const result = await FuckF.getRewardsInfo(); if (!result) { FuckD.bing.sendMSG = "⚠️请检查 rewards.bing.com 是否登录!"; FuckF.log("🔴", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); return resolve(); } else { if (needPromos) setTimeout(() => { FuckF.promosStart() }, FuckD.bing.time * 2); if (needSearch) { const counters = result.userStatus?.counters || {}; const pcPro = counters.pcSearch?.[0]?.pointProgress || 0; let pcMax = counters.pcSearch?.[0]?.pointProgressMax || 0; const mPro = counters.mobileSearch?.[0]?.pointProgress || 0; let mMax = counters.mobileSearch?.[0]?.pointProgressMax || 0; if (pcMax === 0) pcMax = 60; if (mMax === 0) mMax = 0; if (pcPro >= pcMax && mPro >= mMax) { FuckD.search.end++; if (FuckD.search.date != FuckD.bing.dateNowNum) { FuckD.search.date = FuckD.bing.dateNowNum; GM_setValue("Config.tasks", FuckD.bing.tasks); const pcReport = pcMax ? `\n💻电脑端搜索:${pcPro}/${pcMax}` : ""; const mReport = mMax ? `\n📱手机端搜索:${mPro}/${mMax}` : ""; FuckD.bing.sendMSG = `🔍搜索任务已完成!${pcReport}${mReport}`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); } FuckF.tasksEnd(); } else { FuckF.log("🔍", "检测到搜索积分未满,开始搜索..."); setTimeout(() => { FuckF.searchStart() }, 100); } } else { FuckF.searchStart(); } } } else { FuckF.promosStart(); FuckF.searchStart(); } if (needSign) { setTimeout(() => { FuckF.signStart() }, FuckD.bing.time); } else { FuckF.signStart(); } if (needRead) { setTimeout(() => { FuckF.readStart() }, FuckD.bing.time * 3); } else { FuckF.readStart(); } } } const isKeep = GM_getValue("Config.keep", true); const checkDone = (taskEnabled, taskDate) => !taskEnabled || taskDate == FuckD.bing.dateNowNum; const isAllDone = checkDone(FuckD.tasks.sign, FuckD.sign.date) && checkDone(FuckD.tasks.read, FuckD.read.date) && checkDone(FuckD.tasks.promos, FuckD.promos.date) && checkDone(FuckD.tasks.search, FuckD.search.date); if ((!isKeep && isAllDone) || !FuckD.bing.repo.includes("geoisam") || (!FuckD.tasks.sign && !FuckD.tasks.read && !FuckD.tasks.promos && !FuckD.tasks.search)) { if (isAllDone) { const allDoneDate = GM_getValue("Config.allDoneDate", 0); if (allDoneDate != FuckD.bing.dateNowNum) { GM_setValue("Config.allDoneDate", FuckD.bing.dateNowNum); FuckF.getRewardsInfo().then(dashboard => { const counters = dashboard?.userStatus?.counters || {}; const pcPro = counters.pcSearch?.[0]?.pointProgress || 0; const mPro = counters.mobileSearch?.[0]?.pointProgress || 0; const readPro = (FuckD.read.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.readPoint", 0) : 0; const promosPro = (FuckD.promos.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.promosPoint", 0) : 0; const signPro = (FuckD.sign.date == FuckD.bing.dateNowNum) ? GM_getValue("Config.signPoint", 0) : 0; const todayPoints = pcPro + mPro + readPro + promosPro + signPro; const availablePoints = dashboard?.userStatus?.availablePoints || 0; setTimeout(() => { FuckD.bing.sendMSG = `🎉今日所选任务已全部完成!\n✨今日共获取:${todayPoints} 积分\n💰 当前总积分:${availablePoints} 积分`; FuckF.log("🔵", FuckD.bing.sendMSG, true); FuckF.send(FuckD.wh); resolve(); }, 1000); }); } else { setTimeout(() => { FuckF.log("💤", "今日所选任务已全部完成,继续保持休眠..."); resolve(); }, 1000); } } else { resolve(); } } else { //const initDelay = FuckF.getScopeRandomNum(1000, 1000); //调试用,1秒停留时间 const initDelay = FuckF.getScopeRandomNum(5000, 95000); FuckF.log("⏳", `为规避定时器特征,停留 ${initDelay / 1000} 秒后运行...`); setTimeout(() => { FuckF.tasksStart(initDelay); }, initDelay); } })