Files
KingJin-web-zy/签到本/microsoft_reward_v1.41.js
2025-09-13 14:20:00 +08:00

1585 lines
55 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* cron: 11 18 * * *
* const $ = new Env("微软浏览器积分");
export MS_COOKIES_1="your_cookies_1"
export MS_REFRESH_TOKEN_1="your_refresh_token_1"
export MS_ALIAS_1="Account 1"
export MS_PROXY_1="proxym:8080"
抓取 https://rewards.bing.com/welcome?rh=F5F34605&ref=rafsrchae 下的cookie即可
只需要MS_COOKIES_1 即可运行
*/
var _0x4badbc = 14;
const axios = require("axios"),
moment =
((_0x4badbc = "noeifi".split("").reverse().join("")), require("moment"));
let _0x75d;
const notify = require("./sendNotify");
_0x75d = "qphieo".split("").reverse().join("");
let _0x4fbb1f;
const fs = require("fs"),
path = ((_0x4fbb1f = 9), require("path"));
let exec = require("child_process").exec,
_0x18965e;
const os = require("os");
_0x18965e = "gofgig".split("").reverse().join("");
var _0x9da68b = 14;
const crypto = require("crypto"),
AUTH_SERVER = ((_0x9da68b = 7), "https://mr.5886666.xyz"),
LICENSE_KEY = process.env.LICENSE_KEY;
function generateFallbackMac(s, e, t) {
(s = "0123456789ABCDEF"),
"kicdjm"
.split((t = ""))
.reverse()
.join("");
for (let e = 0; e < 6; e++)
(t =
(t += s[Math.floor(16 * Math.random())]) +
s[Math.floor(16 * Math.random())]),
e < 5 && (t += ":");
return t;
}
async function saveFallbackMac(e) {
try {
var s = path.join(__dirname, "fallback_mac.json"),
t = { mac: e, updatedAt: new Date().toISOString() };
return (
fs.writeFileSync(s, JSON.stringify(t, null, 2), "utf8"),
console.log("备用MAC地址已保存到文件"),
!0
);
} catch (e) {
return (
console.error(":败失址地CAM用备存保".split("").reverse().join(""), e), !1
);
}
}
async function loadFallbackMac() {
try {
var e = path.join(__dirname, "fallback_mac.json");
if (fs.existsSync(e)) {
var s = JSON.parse(fs.readFileSync(e, "utf8"));
if (
s.mac &&
new RegExp("^([0-9a-f]{2}:){5}[0-9a-f]{2}$", "").test(
s.mac.toLowerCase()
)
)
return (
console.log("址地CAM用备载加件文从已".split("").reverse().join("")),
s.mac.toLowerCase()
);
}
return null;
} catch (e) {
return (
console.error(":败失址地CAM用备取读".split("").reverse().join(""), e),
null
);
}
}
async function getMacAddress() {
return new Promise(async (a) => {
try {
var s = os.networkInterfaces();
let e = null;
for (const i of Object.keys(s)) {
var t = s[i].find(
(e) =>
e.family === "4vPI".split("").reverse().join("") &&
!e.internal &&
e.mac &&
"00:00:00:00:00:00" !== e.mac
);
if (t) {
e = t.mac.toLowerCase();
break;
}
}
if (e) a(e);
else {
let e = "";
switch (process.platform) {
case "win32":
e = "getmac /fo csv /nh";
break;
case "niwrad".split("").reverse().join(""):
e = "ifconfig en0 | grep ether";
break;
default:
e = "ip addr | grep ether";
}
exec(e, async (s, t) => {
if (!s && t) {
let e = "";
if (
("win32" === process.platform
? (s = t.match(
new RegExp('")+]"^[("'.split("").reverse().join(""), "")
)) &&
s[1] &&
(e = s[1].replace(new RegExp("-", "g"), ":").toLowerCase())
: (s = t.match(
new RegExp("([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})", "")
)) &&
(e = s[0].replace(new RegExp("-", "g"), ":").toLowerCase()),
e && new RegExp("^([0-9a-f]{2}:){5}[0-9a-f]{2}$", "").test(e))
)
return void a(e);
}
t = await loadFallbackMac();
t ? a(t) : (await saveFallbackMac((s = generateFallbackMac())), a(s));
});
}
} catch (e) {
console.error(":误错生发时址地CAM取获".split("").reverse().join(""), e);
var o = await loadFallbackMac();
o ? a(o) : (await saveFallbackMac((o = generateFallbackMac())), a(o));
}
});
}
async function getDeviceInfo() {
try {
var e = await getMacAddress();
return { mac: e, cpuId: e, boardId: e, deviceId: e };
} catch (e) {
throw (console.error("获取设备信息失败:", e), e);
}
}
const verifyLicense = async () => {
if (!LICENSE_KEY)
return console.log("未配置授权码,请设置环境变量 LICENSE_KEY"), !1;
try {
var s = await getMacAddress(),
e = Date.now().toString(),
t = { license: LICENSE_KEY, mac: s },
a = e + LICENSE_KEY + JSON.stringify(t),
o = crypto.createHash("652ahs".split("").reverse().join("")),
i = (o.update(a), o.digest("46esab".split("").reverse().join(""))),
r =
(console.log("正在验证授权..."),
await axios.post(AUTH_SERVER + "/api/verify-license", t, {
headers: {
"X-Timestamp": e,
"X-Signature": i,
"X-Admin-Key": LICENSE_KEY,
},
}));
return r.data.success
? (console.log("授权验证成功!剩余运行次数:" + r.data.remainingRuns),
!0)
: (console.log("授权验证失败:" + (r.data.error || "未知错误")), !1);
} catch (e) {
if (e.response && e.response.data) {
s = e.response.data.error || "未知错误";
switch ((console.log("授权验证失败:" + s), s)) {
case "授权码无效":
console.log("请检查授权码是否正确,或联系管理员获取新的授权码");
break;
case "期过已码权授".split("").reverse().join(""):
console.log("授权码已过期,请联系管理员续期");
break;
case "制限量数备设大最到达已".split("").reverse().join(""):
console.log(
"员理管系联请,制限量数备设大最到达已码权授该"
.split("")
.reverse()
.join("")
);
break;
case "制限数次行运大最到达已".split("").reverse().join(""):
console.log(
"员理管系联请,制限数次行运大最到达已码权授该"
.split("")
.reverse()
.join("")
);
break;
case "定绑码权授他其被已备设此".split("").reverse().join(""):
console.log(
"码权授的确正用使请,定绑码权授他其被已备设前当"
.split("")
.reverse()
.join("")
);
break;
case "授权码已被禁用":
console.log(
"员理管系联请,用禁员理管被已码权授该"
.split("")
.reverse()
.join("")
);
break;
case "无效的请求签名或已过期":
console.log(
"员理管系联或接连络网查检请,败失证验求请"
.split("")
.reverse()
.join("")
);
break;
default:
console.log("请检查网络连接或联系管理员");
}
} else
console.log("授权验证失败:无法连接到授权服务器"),
console.log(
"确正否是址地器务服权授认确或接连络网查检请"
.split("")
.reverse()
.join("")
);
return !1;
}
},
globalResults = {
summary: [],
success: 0,
failed: 0,
totalEarned: 0,
executionDate: new Date(),
},
Env = function (e) {
this.name = e;
},
getAccounts = () => {
const s = [];
let e = 1;
for (;;) {
var t = process.env["MS_COOKIES_" + e],
a = process.env["MS_REFRESH_TOKEN_" + e],
o = process.env["MS_ALIAS_" + e] || "账号" + e,
i = process.env["MS_PROXY_" + e] || "";
if (!t && !a) break;
s.push({
alias: o,
cookies: t || "",
refreshToken: a || "",
proxy: i || "",
}),
e++;
}
if (0 === s.length)
try {
var r,
n = path.join(__dirname, "accounts.json");
fs.existsSync(n) &&
((r = JSON.parse(
fs.readFileSync(n, "8ftu".split("").reverse().join(""))
)),
"adhfhi".split("").reverse().join(""),
r.accounts) &&
Array.isArray(r.accounts) &&
r.accounts.forEach((e) => {
e.cookies &&
e.refreshToken &&
s.push({
alias: e.alias || "账号" + (s.length + 1),
cookies: e.cookies,
refreshToken: e.refreshToken,
proxy: e.proxy || "",
});
});
} catch (e) {
console.error(":败失件文置配号账取读".split("").reverse().join(""), e);
}
n =
process.env.MS_TOKEN_FILE ||
path.join(
__dirname,
"nosj.snekot_hserfer_sm".split("").reverse().join("")
);
if (fs.existsSync(n))
try {
const c = JSON.parse(fs.readFileSync(n, "utf8"));
s.forEach((e) => {
c[e.alias] &&
c[e.alias].refreshToken &&
(console.log(`为账号 [${e.alias}] 加载保存的刷新令牌`),
(e.refreshToken = c[e.alias].refreshToken));
});
} catch (e) {
console.error(
":败失牌令新刷的存保取读".split("").reverse().join(""),
e
);
}
return s;
};
class MSRewards {
constructor(e = {}) {
(this.account = {
alias: e.alias || "号账认默".split("").reverse().join(""),
cookies: e.cookies || process.env.MS_COOKIES || "",
refreshToken: e.refreshToken || process.env.MS_REFRESH_TOKEN || "",
proxy: e.proxy || process.env.MS_PROXY || "",
...e,
}),
this.account.proxy
? (console.log(
`[${this.account.alias}] 使用代理: ` + this.account.proxy
),
(this.axiosInstance = axios.create({
proxy: this.parseProxyString(this.account.proxy),
})))
: (this.axiosInstance = axios),
(this.data = {
time: {
task: 3e3,
pcSearchInterval: 7e4,
mobileSearchInterval: 13e4,
hoursNow: new Date().getHours(),
dateNow: moment().format("DD-MM-YYYY".split("").reverse().join("")),
},
auth: {
code: "https://login.live.com/oauth20_authorize.srf",
token: "https://login.live.com/oauth20_token.srf",
clientId: "0000000040170455",
scope: "service::prod.rewardsplatform.microsoft.com::MBI_SSL",
redirectUri: "https://login.live.com/oauth20_desktop.srf",
},
ua: {
pc: [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.2478.131",
"601.5632.0.221/gdE 1.406/irafaS 0.0.0.221/emorhC )okceG ekil ,LMTHK( 51.1.506/tiKbeWelppA )1_4_41 X SO caM letnI ;amonoS( 0.5/allizoM"
.split("")
.reverse()
.join(""),
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.2210.181",
"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.0.0",
],
m: [
"Mozilla/5.0 (Linux; Android 14; 2210132C Build/UP1A.231005.007) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.52 Mobile Safari/537.36 EdgA/125.0.2535.51",
"Mozilla/5.0 (iPad; CPU OS 16_7_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/120.0.2210.150 Version/16.0 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 18_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) EdgiOS/123.0.2420.108 Version/18.0 Mobile/15E148 Safari/604.1",
"56.0242.0.321/AgdE 63.735/irafaS eliboM 04.2136.0.321/emorhC )okceG ekil ,LMTHK( 63.735/tiKbeWelppA )B199G-MS ;31 diordnA ;xuniL( 0.5/allizoM"
.split("")
.reverse()
.join(""),
"Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.44 Mobile Safari/537.36 EdgA/124.0.2478.49",
"51.1.506/irafaS 841E51/eliboM 45.8742.421/SOigdE 0.71/noisreV )okceG ekil ,LMTHK( 51.1.506/tiKbeWelppA )X SO caM ekil 5_71 SO enohPi UPC ;enohPi( 0.5/allizoM"
.split("")
.reverse()
.join(""),
"Mozilla/5.0 (Linux; Android 14; Mi 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.40 Mobile Safari/537.36 EdgA/123.0.2420.65",
"94.8742.0.421/AgdE 63.735/irafaS eliboM 44.7636.0.421/emorhC )okceG ekil ,LMTHK( 63.735/tiKbeWelppA )8 etoN imdeR ;11 diordnA ;xuniL( 0.5/allizoM"
.split("")
.reverse()
.join(""),
"56.0242.0.321/AgdE 63.735/irafaS eliboM 04.2136.0.321/emorhC )okceG ekil ,LMTHK( 63.735/tiKbeWelppA )B635A-MS GNUSMAS ;31 diordnA ;xuniL( 0.5/allizoM"
.split("")
.reverse()
.join(""),
],
},
web: 0,
app: 0,
api: {
arr: [
[
"hot.eray.cc",
{
url: "https://dailyapi.eray.cc/",
hot: [
"obiew".split("").reverse().join(""),
"niyuod".split("").reverse().join(""),
"udiab".split("").reverse().join(""),
"toutiao",
"repapeht".split("").reverse().join(""),
"qq-news",
"netease-news",
"uhihz".split("").reverse().join(""),
],
},
],
[
"hot.baiwumm.com",
{
url: "https://hot.baiwumm.com/api/",
hot: [
"weibo",
"douyin",
"baidu",
"toutiao",
"thepaper",
"qq".split("").reverse().join(""),
"esaeten".split("").reverse().join(""),
"uhihz".split("").reverse().join(""),
],
},
],
[
"hot.cnxiaobai.com",
{
url: "https://cnxiaobai.com/DailyHotApi/",
hot: [
"weibo",
"douyin",
"udiab".split("").reverse().join(""),
"toutiao",
"thepaper",
"qq-news",
"netease-news",
"uhihz".split("").reverse().join(""),
],
},
],
[
"hot.zhusun.top",
{
url: "https://hotapi.zhusun.top/",
hot: [
"obiew".split("").reverse().join(""),
"douyin",
"baidu",
"toutiao",
"repapeht".split("").reverse().join(""),
"swen-qq".split("").reverse().join(""),
"netease-news",
"uhihz".split("").reverse().join(""),
],
},
],
[
"pot.yysmi.toh".split("").reverse().join(""),
{
url: "https://api-hot.imsyy.top/",
hot: [
"weibo",
"niyuod".split("").reverse().join(""),
"baidu",
"oaituot".split("").reverse().join(""),
"repapeht".split("").reverse().join(""),
"qq-news",
"netease-news",
"zhihu",
],
},
],
[
"cc.lootnn.toh".split("").reverse().join(""),
{
url: "https://hotapi.nntool.cc/",
hot: [
"weibo",
"douyin",
"udiab".split("").reverse().join(""),
"oaituot".split("").reverse().join(""),
"repapeht".split("").reverse().join(""),
"swen-qq".split("").reverse().join(""),
"swen-esaeten".split("").reverse().join(""),
"zhihu",
],
},
],
],
},
}),
(this.task = {
sign: { times: 0, point: 1, end: 0 },
read: { times: 0, point: 0, end: 0 },
promo: { times: 0, token: 0, end: 0, point: 0 },
search: {
word: { list: [], index: 0 },
times: 0,
progressNow: 0,
pc: {
progress: 0,
max: 60,
limit: 60,
lastPoints: 0,
singlePoints: 0,
},
m: {
progress: 0,
max: 50,
limit: 50,
lastPoints: 0,
singlePoints: 0,
},
index: 0,
end: 0,
},
token: 0,
startTime: new Date(),
userInfo: {
name: "",
availablePoints: 0,
lifetimePoints: 0,
dailyPoints: { current: 0, max: 0 },
startPoints: 0,
earnedPoints: 0,
streakDays: 0,
},
}),
(this.config = {
app: "true" === process.env.MS_APP,
span: parseInt(process.env.MS_SPAN || "15"),
api: process.env.MS_API || "单机模式",
});
}
parseProxyString(e) {
try {
var s, t, a, o, i, r, n;
return e
? (s = e.match(
new RegExp(
"^(http|https|socks4|socks5):\\/\\/(?:(.+):(.+)@)?([^:]+):(\\d+)$",
"i"
)
))
? ((t = s[1]),
"hjdnae".split("").reverse().join(""),
(a = s[2]),
(o = s[3]),
(i = s[4]),
(r = parseInt(s[5])),
(n = { protocol: t, host: i, port: r }),
"dnlkpl".split("").reverse().join(""),
a && o && (n.auth = { username: a, password: o }),
n)
: (console.log(`[${this.account.alias}] 代理格式无效: ` + e), null)
: null;
} catch (e) {
return (
console.log(`[${this.account.alias}] 解析代理字符串出错: ` + e.message),
null
);
}
}
getRandomNum(e) {
return Math.floor(Math.random() * e);
}
getScopeRandomNum(e, s) {
return Math.floor(Math.random() * (s + 1 - e) + e);
}
getRandomArr(e) {
return e.sort(() => Math.random() - 0.5);
}
getRandomChineseChar() {
var e = Math.floor(20992 * Math.random()) + 19968;
return String.fromCodePoint(e);
}
generateRandomChineseStr(e = 6, s = 32) {
var t = Math.floor(Math.random() * (s - e + 1)) + e;
let a = "";
for (let e = 0; e < t; e++) a += this.getRandomChineseChar();
return a;
}
getEstimatedCompletionTime() {
var e = Math.max(0, this.task.search.pc.max - this.task.search.pc.progress),
s = Math.max(0, this.task.search.m.max - this.task.search.m.progress),
e =
("jbijdl".split("").reverse().join(""),
e * this.data.time.pcSearchInterval +
s * this.data.time.mobileSearchInterval);
return 0 == e
? "成完已".split("").reverse().join("")
: `${Math.ceil(e / 6e4)}分钟`;
}
printTaskStatus() {
this.task.userInfo;
var e = this.task;
console.log(
`
[${this.account.alias}] 状态:本次任务 PC搜索上限${
e.search.pc.max || 60
}次 移动搜索上限${e.search.m.max || 50}次 预计` +
this.getEstimatedCompletionTime()
);
}
addToSummary(e = !0) {
var s = this.task.userInfo;
e && s.name
? (globalResults.success++,
(globalResults.totalEarned += s.earnedPoints),
globalResults.summary.push({
alias: this.account.alias,
level: s.level || "Level2",
points: s.availablePoints || 0,
earned: s.earnedPoints || 0,
pcSearch:
`${this.task.search.pc.progress || 0}/` +
(this.task.search.pc.max || 60),
mobileSearch:
`${this.task.search.m.progress || 0}/` +
(this.task.search.m.max || 50),
runTime: Math.floor((new Date() - this.task.startTime) / 1e3),
streakDays: s.streakDays || 0,
readPoint: this.task.read.point || 0,
signPoint: this.task.sign.point || 0,
promoPoint: this.task.promo.point || 0,
}))
: globalResults.failed++;
}
async pushMsg(e, s, t = !0) {
var a = `[${this.account.alias}] `;
console.log(a + e + ": " + s), t && (await notify.sendNotify(a + e, s));
}
async beforeStart() {
var e = new Date(),
s = e.getFullYear(),
t = ("0" + (e.getMonth() + 1)).slice(-2),
a = ("0" + e.getDate()).slice(-2);
(this.data.time.hoursNow = Number(e.getHours())),
(this.data.time.dateNow = t + `/${a}/` + s),
(this.data.time.dateNowNum = Number("" + s + t + a)),
this.config.api !== "式模机单".split("").reverse().join("") &&
((this.data.api.hot = []),
(e = new Map(this.data.api.arr).get(this.config.api))
? ((this.data.api.url = e.url),
(this.data.api.hot = e.hot),
console.log(
`[${this.account.alias}] 使用搜索API: ` + this.config.api
))
: (console.log(
`[${this.account.alias}] 当前搜索词接口失效!已替换成单机模式!`
),
(this.config.api = "单机模式")));
}
async isExpired() {
try {
if (this.account.refreshToken) if (1 === (await this.getToken())) return;
this.task.sign.end++,
this.task.read.end++,
await this.pushMsg(
"微软积分商城App任务🔴",
"nekoThserfer置设中置配号账多在或NEKOT_HSERFER_SM量变境环置设并取获动手请效无牌令新刷"
.split("")
.reverse()
.join("")
);
} catch (e) {
throw (console.error(`[${this.account.alias}] 认证过程出错:`, e), e);
}
}
async getToken(e) {
try {
var s = new URLSearchParams(),
t =
(s.append("client_id", this.data.auth.clientId),
s.append(
"nekot_hserfer".split("").reverse().join(""),
this.account.refreshToken
),
s.append("scope", this.data.auth.scope),
s.append("grant_type", "NEKOT_HSERFER".split("").reverse().join("")),
await this.axiosInstance.post(this.data.auth.token, s, {
headers: { "Content-Type": "application/x-www-form-urlencoded" },
}));
if (200 === t.status) {
var a = t.data;
if (a.refresh_token && a.access_token)
return (
(this.task.token = a.access_token),
this.account.refreshToken !== a.refresh_token &&
(console.log(`[${this.account.alias}] 刷新令牌已更新`),
(this.account.refreshToken = a.refresh_token),
await this.saveRefreshToken(a.refresh_token)),
1
);
}
return 0;
} catch (e) {
return (
console.error(`[${this.account.alias}] 获取令牌失败:`, e),
e.response ? e.response.status : 0
);
}
}
async saveRefreshToken(s) {
try {
var t =
process.env.MS_TOKEN_FILE ||
path.join(__dirname, "ms_refresh_tokens.json"),
a = ("mkleml".split("").reverse().join(""), path.dirname(t));
fs.existsSync(a) || fs.mkdirSync(a, { recursive: !0 });
let e = {};
if (fs.existsSync(t))
try {
var o = fs.readFileSync(t, "utf8");
e = JSON.parse(o);
} catch (e) {
console.log(`[${this.account.alias}] 读取令牌文件失败,将创建新文件`);
}
return (
(e[this.account.alias] = {
refreshToken: s,
updatedAt: new Date().toISOString(),
}),
fs.writeFileSync(
t,
JSON.stringify(e, null, 2),
"8ftu".split("").reverse().join("")
),
console.log(`[${this.account.alias}] 成功保存刷新令牌到文件`),
!0
);
} catch (e) {
return console.error(`[${this.account.alias}] 保存刷新令牌失败:`, e), !1;
}
}
async getRewardsInfo() {
try {
var e = {};
this.account.cookies && (e.Cookie = this.account.cookies);
let s = 0;
for (; s < 3; )
try {
var t,
a,
o = await this.axiosInstance.get(
"https://rewards.bing.com/api/getuserinfo?type=1",
{
headers: e,
timeout: 3e4,
validateStatus: function (e) {
return 200 <= e && e < 500;
},
}
);
if (200 === o.status)
return (t = o.data).dashboard
? (t.dashboard.userStatus &&
(this.task.userInfo.availablePoints,
0 === this.task.userInfo.startPoints &&
(this.task.userInfo.startPoints =
t.dashboard.userStatus.availablePoints || 0),
t.dashboard.userStatus.levelInfo &&
(this.task.userInfo.level =
t.dashboard.userStatus.levelInfo.activeLevel?.replace(
"Level",
""
) || "2"),
t.dashboard.userStatus.levelInfo &&
(this.task.userInfo.streakDays =
t.dashboard.userStatus.levelInfo
.levelUpActivityDailySetStreakDays || 0),
(a = [
t.dashboard.userStatus.name,
t.dashboard.userStatus.accountName,
t.dashboard.userStatus.profile?.name,
t.dashboard.userStatus.profile?.accountName,
t.dashboard.userStatus.levelInfo?.levelName,
t.dashboard.userStatus.levelInfo?.currentLevelName,
t.dashboard.profile?.name,
t.dashboard.profile?.accountName,
]),
(this.task.userInfo.name =
a.find(
(e) =>
e && typeof e === "gnirts".split("").reverse().join("")
) || "户用知未".split("").reverse().join("")),
(this.task.userInfo.availablePoints =
t.dashboard.userStatus.availablePoints || 0),
(this.task.userInfo.lifetimePoints =
t.dashboard.userStatus.lifetimePoints || 0),
(this.task.userInfo.earnedPoints =
this.task.userInfo.availablePoints -
this.task.userInfo.startPoints),
t.dashboard.userStatus?.counters?.dailyPoint) &&
t.dashboard.userStatus.counters.dailyPoint[0] &&
((this.task.userInfo.dailyPoints.current =
t.dashboard.userStatus.counters.dailyPoint[0]
.pointProgress || 0),
(this.task.userInfo.dailyPoints.max =
t.dashboard.userStatus.counters.dailyPoint[0]
.pointProgressMax || 0)),
0 === this.task.search.pc.progress &&
0 === this.task.search.m.progress &&
this.printTaskStatus(),
t.dashboard)
: (this.task.sign.end++,
this.task.read.end++,
this.task.promo.end++,
this.task.search.end++,
0 === this.data.web &&
(await this.pushMsg(
"All任务🔴",
"账号状态失效请检查Microsoft Cookies或重新登录"
)),
this.data.web++,
0);
console.log(
`[${this.account.alias}] 微软积分商城Web任务🟡微软Rewards信息获取出错状态码${o.status}),正在重试...`
),
++s < 3 && (await new Promise((e) => setTimeout(e, 5e3)));
} catch (e) {
if (
(e.code !== "TUODEMITE".split("").reverse().join("") &&
e.code !== "DETROBANNOCE".split("").reverse().join("")) ||
!(++s < 3)
)
throw e;
await new Promise((e) => setTimeout(e, 5e3));
}
return (
console.log(`[${this.account.alias}] 获取Rewards信息失败已重试3次`), 0
);
} catch (e) {
return (
console.log(
`[${this.account.alias}] 获取Rewards信息失败: ` + e.message
),
0
);
}
}
async getTopKeyword() {
let e = this.generateRandomChineseStr();
if (this.config.api !== "式模机单".split("").reverse().join(""))
try {
if (
this.task.search.word.index < 1 ||
this.task.search.word.list.length < 1
) {
var s = this.getRandomNum(this.data.api.hot.length),
t = this.data.api.hot[s],
a = await this.axiosInstance.get(this.data.api.url + t, {
timeout: 9999,
});
if (200 === a.status) {
var o = a.data;
if (200 === o.code) {
(this.task.search.word.index = 1),
(this.task.search.word.list = []);
for (let e = 0; e < o.data.length; e++)
this.task.search.word.list.push(o.data[e].title);
(this.task.search.word.list = this.getRandomArr(
this.task.search.word.list
)),
(e = this.task.search.word.list[this.task.search.word.index]);
} else
console.log(
`[${this.account.alias}] 微软积分商城必应搜索🟣当前搜索词接口服务异常(状态码:${o.code}),已使用随机汉字组句`
);
} else
console.log(
`[${this.account.alias}] 微软积分商城必应搜索🟣当前搜索词接口获取失败(状态码:${a.status}),已使用随机汉字组句`
);
} else
this.task.search.word.index++,
this.task.search.word.index >
this.task.search.word.list.length - 1 &&
(this.task.search.word.index = 0),
(e = this.task.search.word.list[this.task.search.word.index]);
} catch (e) {
console.log(
`[${this.account.alias}] 微软积分商城必应搜索🟣当前搜索词接口获取异常,已使用随机汉字组句`
),
console.error(e);
}
return e;
}
async taskSearch() {
if (0 < this.task.search.end) return !0;
var e = await this.getRewardsInfo();
if (0 === e) return !1;
if (
(e.userStatus.counters.pcSearch &&
((this.task.search.pc.progress =
e.userStatus.counters.pcSearch[0].pointProgress),
(this.task.search.pc.max =
e.userStatus.counters.pcSearch[0].pointProgressMax),
e.userStatus.counters.dailyPoint) &&
e.userStatus.counters.dailyPoint[0] &&
e.userStatus.counters.dailyPoint[0].pointProgress >=
e.userStatus.counters.dailyPoint[0].pointProgressMax &&
(console.log(
`[${this.account.alias}] PC端已达到每日积分上限停止PC端搜索`
),
(this.task.search.pc.max = this.task.search.pc.progress)),
e.userStatus.counters.mobileSearch
? ((this.task.search.m.progress =
e.userStatus.counters.mobileSearch[0].pointProgress),
(this.task.search.m.max =
e.userStatus.counters.mobileSearch[0].pointProgressMax),
e.userStatus.counters.dailyPoint &&
e.userStatus.counters.dailyPoint[0] &&
e.userStatus.counters.dailyPoint[0].pointProgress >=
e.userStatus.counters.dailyPoint[0].pointProgressMax &&
(console.log(
`[${this.account.alias}] 移动端已达到每日积分上限,停止移动端搜索`
),
(this.task.search.m.max = this.task.search.m.progress)))
: (this.task.search.m.max = 0),
this.task.search.pc.progress >= this.task.search.pc.max &&
this.task.search.m.progress >= this.task.search.m.max)
)
return this.task.search.end++, await this.getRewardsInfo(), !0;
{
let e = !1;
var t = await this.getTopKeyword(),
a =
"https://bing.com/search?" +
`q=${encodeURIComponent(t)}&qs=ds&form=QBLH`,
o = {};
if (
(this.account.cookies && (o.Cookie = this.account.cookies),
this.task.search.pc.progress < this.task.search.pc.max)
) {
await this.getRewardsInfo();
var i = this.task.userInfo.availablePoints,
r = this.data.ua.pc[this.getRandomNum(this.data.ua.pc.length)];
let s = 0;
for (; s < 3; )
try {
await this.axiosInstance.get(a, {
headers: { "User-Agent": r, ...o },
timeout: 3e4,
validateStatus: function (e) {
return 200 <= e && e < 500;
},
}),
(e = !0),
this.task.search.index++,
await this.getRewardsInfo();
var n = this.task.userInfo.availablePoints,
c = Math.max(0, n - i);
this.task.search.pc.progress++,
console.log(
`[${this.account.alias}] PC端"${t}"(第${this.task.search.pc.progress}次搜索)本次获取积分:${c} 进度:${this.task.search.pc.progress}/` +
this.task.search.pc.max
);
const d = this.getScopeRandomNum(
this.data.time.pcSearchInterval - 1e4,
this.data.time.pcSearchInterval + 1e4
);
console.log(
`[${this.account.alias}] PC搜索完成等待${Math.floor(
d / 1e3
)}秒后继续...`
),
await new Promise((e) => setTimeout(e, d));
break;
} catch (e) {
3 === ++s
? (console.error(
`[${this.account.alias}] PC搜索失败(已重试3次):`,
e.message
),
await new Promise((e) => setTimeout(e, 6e4)))
: (console.log(
`[${this.account.alias}] PC搜索失败${s}秒后重试...`
),
await new Promise((e) => setTimeout(e, 1e3 * s)));
}
}
if (this.task.search.m.progress < this.task.search.m.max) {
await this.getRewardsInfo();
var l = this.task.userInfo.availablePoints,
h = this.data.ua.m[this.getRandomNum(this.data.ua.m.length)];
let s = 0;
for (; s < 3; )
try {
await this.axiosInstance.get(a, {
headers: { "User-Agent": h, ...o },
timeout: 3e4,
validateStatus: function (e) {
return 200 <= e && e < 500;
},
}),
(e = !0),
this.task.search.index++,
await this.getRewardsInfo();
var p = this.task.userInfo.availablePoints,
u = Math.max(0, p - l);
this.task.search.m.progress++,
console.log(
`[${this.account.alias}] 手机端:"${t}"(第${this.task.search.m.progress}次搜索)本次获取积分:${u} 进度:${this.task.search.m.progress}/` +
this.task.search.m.max
);
const m = this.getScopeRandomNum(
this.data.time.mobileSearchInterval - 1e4,
this.data.time.mobileSearchInterval + 1e4
);
console.log(
`[${this.account.alias}] 移动端搜索完成,等待${Math.floor(
m / 1e3
)}秒后继续...`
),
await new Promise((e) => setTimeout(e, m));
break;
} catch (e) {
3 === ++s
? (console.error(
`[${this.account.alias}] 移动搜索失败(已重试3次):`,
e.message
),
await new Promise((e) => setTimeout(e, 6e4)))
: (console.log(
`[${this.account.alias}] 移动搜索失败,${s}秒后重试...`
),
await new Promise((e) => setTimeout(e, 1e3 * s)));
}
}
return e
? this.taskSearch()
: (this.task.search.end++, await this.getRewardsInfo(), !0);
}
}
async getRewardsToken() {
try {
var e,
s = {},
t =
(this.account.cookies && (s.Cookie = this.account.cookies),
await this.axiosInstance.get(
"moc.gnib.sdrawer//:sptth".split("").reverse().join(""),
{ headers: s }
));
return 200 === t.status
? (e = t.data
.replace(new RegExp("\\s", "g"), "")
.match(
new RegExp(
'>/\\")?*.("=eulav"neddih"=epyt"nekoTnoitacifireVtseuqeR'
.split("")
.reverse()
.join(""),
""
)
)) && e[1]
? e[1]
: (console.log(
`[${this.account.alias}] 获取RewardsToken失败未找到验证令牌`
),
0)
: (console.log(
`[${this.account.alias}] 获取RewardsToken出错状态码${t.status}`
),
0);
} catch (e) {
return (
console.error(`[${this.account.alias}] 获取RewardsToken出错:`, e), 0
);
}
}
async taskPromo() {
if (0 < this.task.promo.end) return !0;
if (this.data.time.hoursNow < 12)
return (
this.task.promo.end++,
console.log(
`[${this.account.alias}] 活动推广任务在早上12点前暂不执行活动任务避免任务刷新问题`
),
!0
);
if (2 < this.task.promo.times) return this.task.promo.end++, !0;
try {
var e = await this.getRewardsInfo();
if (0 === e) return !1;
var s = [];
if (e.dailySetPromotions && e.dailySetPromotions[this.data.time.dateNow])
for (const o of e.dailySetPromotions[this.data.time.dateNow])
!1 === o.complete &&
s.push({
offerId: o.offerId,
hash: o.hash,
type: "每日活动",
points: o.points || 0,
});
if (e.morePromotions)
for (const i of e.morePromotions)
!1 === i.complete &&
s.push({
offerId: i.offerId,
hash: i.hash,
type: "更多活动",
points: i.points || 0,
});
if (
((this.task.promo.token = await this.getRewardsToken()),
0 === this.task.promo.token)
)
this.task.promo.times++,
await new Promise((e) => setTimeout(e, this.data.time.task));
else {
if (
e.streakProtectionPromo &&
"False" === e.streakProtectionPromo.streakProtectionStatus
) {
console.log(`[${this.account.alias}] 正在开启连续签到保护...`);
try {
var t = {
"Content-Type": "application/x-www-form-urlencoded",
Referer: "https://rewards.bing.com/",
};
"eipafm".split("").reverse().join("");
this.account.cookies && (t.Cookie = this.account.cookies),
await this.axiosInstance.post(
"https://rewards.bing.com/api/togglestreakasync",
"isOn=true&activityAmount=1&form=&__RequestVerificationToken=" +
this.task.promo.token,
{ headers: t }
),
console.log(`[${this.account.alias}] 连续签到保护开启成功`);
} catch (e) {
console.error(
`[${this.account.alias}] 开启连续签到保护失败: 应该是第一次登录明天再次运行就OK了`
);
}
}
if (0 === s.length) return this.task.promo.end++, !0;
console.log(
`[${this.account.alias}] 发现${s.length}个未完成活动,开始自动完成...`
),
(this.task.promo.point = 0);
for (const r of s) {
console.log(
`[${this.account.alias}] 正在完成${r.type}: ` + r.offerId
);
try {
var a = {
"Content-Type": "application/x-www-form-urlencoded",
Referer: "https://rewards.bing.com/",
};
this.account.cookies && (a.Cookie = this.account.cookies),
await this.axiosInstance.post(
"ytivitcatroper/ipa/moc.gnib.sdrawer//:sptth"
.split("")
.reverse()
.join(""),
`id=${r.offerId}&hash=${r.hash}&__RequestVerificationToken=` +
this.task.promo.token,
{ headers: a }
),
(this.task.promo.point += r.points),
await new Promise((e) =>
setTimeout(e, this.getScopeRandomNum(1e3, 3e3))
);
} catch (e) {
e.response &&
e.response.data &&
e.response.data.error &&
e.response.data.error.description &&
e.response.data.error.description.includes("already") &&
console.log(`[${this.account.alias}] 活动${r.offerId}已完成`);
}
}
this.task.promo.times++;
}
return this.taskPromo();
} catch (e) {
return (
console.error(`[${this.account.alias}] 活动推广任务出错:`, e),
this.task.promo.times++,
await new Promise((e) => setTimeout(e, this.data.time.task)),
this.taskPromo()
);
}
}
async getReadPro() {
let s = 0;
for (; s < 3; )
try {
if (!this.task.token)
return (
console.log(
`[${this.account.alias}] 获取阅读任务进度失败:无访问令牌`
),
{ max: 1, progress: 0 }
);
var e = await this.axiosInstance.get(
"https://prod.rewardsplatform.microsoft.com/dapi/me?channel=SAAndroid&options=613",
{
headers: { authorization: "Bearer " + this.task.token },
timeout: 3e4,
validateStatus: function (e) {
return 200 <= e && e < 500;
},
}
);
if (200 === e.status) {
var t = e.data;
if (t.response && t.response.promotions)
for (const a of t.response.promotions)
if (
a.attributes &&
a.attributes.offerid ===
"stniop03_3elcitradaer_SUNE".split("").reverse().join("")
)
return {
max: Number(a.attributes.max) || 3,
progress: Number(a.attributes.progress) || 0,
};
return { max: 1, progress: 0 };
}
if (
(console.log(
`[${this.account.alias}] 获取阅读任务进度失败(状态码:${e.status}`
),
!(++s < 3))
)
return { max: 1, progress: 0 };
console.log(`[${this.account.alias}] 将在5秒后重试...`),
await new Promise((e) => setTimeout(e, 5e3));
} catch (e) {
if (
("ETIMEDOUT" === e.code || "ECONNABORTED" === e.code) &&
(console.log(
`[${this.account.alias}] 获取阅读任务进度超时,正在重试...`
),
++s < 3)
)
console.log(`[${this.account.alias}] 将在5秒后重试...`),
await new Promise((e) => setTimeout(e, 5e3));
else {
if (
(console.error(
`[${this.account.alias}] 获取阅读任务进度出错:`,
e.message
),
!(++s < 3))
)
return { max: 1, progress: 0 };
console.log(`[${this.account.alias}] 将在5秒后重试...`),
await new Promise((e) => setTimeout(e, 5e3));
}
}
return (
console.log(`[${this.account.alias}] 获取阅读任务进度失败已重试3次`),
{ max: 1, progress: 0 }
);
}
async taskRead() {
if (0 < this.task.read.end) return !0;
if (this.data.time.hoursNow < 12)
return (
this.task.read.end++,
console.log(
`[${this.account.alias}] 文章阅读任务在早上12点前暂不执行阅读任务避免任务刷新问题`
),
!0
);
if (2 < this.task.read.times) return this.task.read.end++, !0;
if (!this.task.token)
return (
this.task.read.end++,
console.log(
`[${this.account.alias}] 文章阅读任务:无有效访问令牌,跳过任务`
),
!0
);
try {
var e = await this.getReadPro();
if (
(e.progress > this.task.read.point
? ((this.task.read.times = 0), (this.task.read.point = e.progress))
: this.task.read.times++,
e.max <= e.progress)
)
return (
this.task.read.end++,
await this.pushMsg(
"文章阅读🟢",
`哇!${this.account.alias}好棒!文章阅读完成了!`,
!1
),
!0
);
console.log(
`[${this.account.alias}] 正在执行文章阅读任务: ${e.progress}/` + e.max
);
try {
var s = await this.axiosInstance.post(
"https://prod.rewardsplatform.microsoft.com/dapi/me/activities",
{
amount: 1,
country: "cn",
id: "",
type: 101,
attributes: { offerid: "ENUS_readarticle3_30points" },
},
{
headers: {
"Content-Type": "application/json",
authorization: "Bearer " + this.task.token,
},
}
);
200 === s.status
? console.log(`[${this.account.alias}] 文章阅读提交成功`)
: console.log(
`[${this.account.alias}] 文章阅读提交失败(状态码:${s.status}`
);
} catch (e) {
console.error(`[${this.account.alias}] 文章阅读提交出错:`, e);
}
const t = this.getScopeRandomNum(5e3, 1e4);
return (
console.log(
`[${this.account.alias}] 文章阅读操作完成,等待${Math.floor(
t / 1e3
)}秒后继续...`
),
await new Promise((e) => setTimeout(e, t)),
this.taskRead()
);
} catch (e) {
return e.response &&
e.response.data &&
e.response.data.error &&
e.response.data.error.description &&
e.response.data.error.description.includes("already")
? (console.log(`[${this.account.alias}] 文章阅读任务已完成`),
this.task.read.end++,
await this.pushMsg(
"文章阅读🟢",
`哇!${this.account.alias}好棒!文章阅读完成了!`,
!1
),
!0)
: (this.task.read.times++,
await new Promise((e) => setTimeout(e, this.data.time.task)),
this.taskRead());
}
}
async taskSign() {
if (0 < this.task.sign.end) return !0;
if (this.data.time.hoursNow < 12)
return (
this.task.sign.end++,
console.log(
`[${this.account.alias}] App签到任务在早上12点前暂不执行签到任务避免任务刷新问题`
),
!0
);
if (2 < this.task.sign.times) return this.task.sign.end++, !0;
if (!this.task.token)
return (
this.task.sign.end++,
console.log(
`[${this.account.alias}] App签到任务无有效访问令牌跳过任务`
),
!0
);
try {
console.log(`[${this.account.alias}] 正在执行App签到任务...`);
var e,
s,
t = this.data.time.dateNowNum,
a = await this.axiosInstance.post(
"https://prod.rewardsplatform.microsoft.com/dapi/me/activities",
{
amount: 1,
attributes: {
offerid: "Gamification_Sapphire_DailyCheckIn",
date: t,
signIn: !1,
timezoneOffset: "08:00:00",
},
id: "",
type: 101,
country: "cn",
risk_context: {},
channel: "SAAndroid",
},
{
headers: {
"Content-Type": "application/json",
authorization: "Bearer " + this.task.token,
},
}
);
return 200 === a.status
? ((e = a.data).response && e.response.activity && e.response.activity.p
? ((s = e.response.activity.p),
(this.task.sign.point = s),
console.log(`[${this.account.alias}] App签到成功获得${s}积分`),
this.task.sign.end++,
await this.pushMsg(
"App签到🟢",
`哇!${this.account.alias}好棒App签到完成了获得${s}积分`,
!1
))
: (console.log(
`[${this.account.alias}] App签到响应异常可能已经签到过`
),
(this.task.sign.point = 0),
this.task.sign.end++,
await this.pushMsg(
"\udfe2\ud83d到签ppA".split("").reverse().join(""),
this.account.alias + "今日已签到,无需重复签到",
!1
)),
!0)
: (console.log(
`[${this.account.alias}] App签到请求失败状态码${a.status}`
),
this.task.sign.times++,
await new Promise((e) => setTimeout(e, this.data.time.task)),
this.taskSign());
} catch (e) {
return e.response &&
e.response.data &&
e.response.data.error &&
e.response.data.error.description &&
e.response.data.error.description.includes("already")
? (console.log(`[${this.account.alias}] App今日已签到无需重复签到`),
(this.task.sign.point = 0),
this.task.sign.end++,
await this.pushMsg(
"App签到🟢",
this.account.alias + "今日已签到,无需重复签到",
!1
),
!0)
: (this.task.sign.times++,
await new Promise((e) => setTimeout(e, this.data.time.task)),
this.taskSign());
}
}
async start() {
try {
console.log(`
[${this.account.alias}] 开始任务`),
await this.beforeStart(),
this.config.app
? await this.isExpired()
: (this.task.sign.end++, this.task.read.end++),
await Promise.all([
this.taskPromo(),
this.taskSign(),
this.taskRead(),
this.taskSearch(),
]),
console.log(`[${this.account.alias}] 任务完成`),
this.printTaskStatus(),
this.addToSummary(!0);
} catch (e) {
console.error(`[${this.account.alias}] 任务失败:`, e),
await this.pushMsg(
"城商分积软微".split("").reverse().join(""),
"任务执行失败: " + e.message
),
this.addToSummary(!1);
}
}
}
(async () => {
/*(await verifyLicense()) ||
(console.log("出退序程,败失证验权授".split("").reverse().join("")),
process.exit(1));*/
//
var s = getAccounts(),
t = process.env.MS_PARALLEL === "eurt".split("").reverse().join("");
if (
(console.log(
"账号执行模式: " +
(t ? "行执行并".split("").reverse().join("") : "串行执行")
),
s && 0 !== s.length)
)
if (t) {
console.log(`检测到${s.length}个账号配置,开始并行执行所有账号`);
t = s.map((e) => {
return (
console.log("准备执行账号: " + e.alias), new MSRewards(e).start()
);
});
await Promise.all(t);
} else {
console.log(`检测到${s.length}个账号配置,开始顺序执行`);
for (let e = 0; e < s.length; e++) {
var a = s[e];
if (
(console.log(`开始执行第${e + 1}个账号: ` + a.alias),
await new MSRewards(a).start(),
e < s.length - 1)
) {
const i = Math.floor(1e4 * Math.random()) + 5e3;
console.log(`账号任务完成,等待${i / 1e3}秒后执行下一个账号...`),
await new Promise((e) => setTimeout(e, i));
}
}
}
else {
console.log(
"行执号账认默用使,置配号账到测检未".split("").reverse().join("")
);
t = path.join(__dirname, "default_account.json");
let e = { alias: "默认账号", cookies: "", refreshToken: "", proxy: "" };
if (fs.existsSync(t))
try {
var o = JSON.parse(fs.readFileSync(t, "utf8"));
o.cookies &&
o.refreshToken &&
(e = {
alias: o.alias || "号账认默".split("").reverse().join(""),
cookies: o.cookies,
refreshToken: o.refreshToken,
proxy: o.proxy || "",
});
} catch (e) {
console.error("读取默认账号配置失败:", e);
}
await new MSRewards(e).start();
}
if (
(console.log("所有账号任务执行完毕!"),
0 < globalResults.summary.length || 0 < globalResults.failed)
) {
t = moment(globalResults.executionDate).format("YYYY-MM-DD HH:mm:ss");
let e = `微软积分商城任务汇总
`;
"lmcccp".split("").reverse().join(""),
(e =
(e =
(e =
(e += `📅 执行时间: ${t}
`) +
`✅ 成功用户: ${globalResults.success}
`) +
`❌ 失败用户: ${globalResults.failed}
`) +
`🔢 总获取积分: ${globalResults.totalEarned}
` +
`========== 详情 ==========
`);
for (const r of globalResults.summary)
e =
(e =
(e =
(e =
(e =
(e =
(e =
(e =
(e +=
r.alias +
`
`) +
`👑 用户等级: ${r.level}
`) +
`💰 当前积分: ${r.points}
`) +
`⬆️ 本次获得: ${r.earned}
`) +
`💻 PC搜索: ${r.pcSearch}
`) +
`📱 手机搜索: ${r.mobileSearch}
`) +
`📖 文章阅读: ${r.readPoint || 0}
`) +
`📱 App签到: ${r.signPoint || 0}
`) +
`🎯 活动推广: ${r.promoPoint || 0}
` +
`------------------------
`;
await notify.sendNotify(
"总汇务任城商分积软微".split("").reverse().join(""),
e
);
}
})();