UNPKG

@asunajs/caiyun

Version:

移动云盘签到

1,561 lines (1,534 loc) 109 kB
import{createRequire}from'module';if(!globalThis.require)globalThis.require=createRequire(import.meta.url); import { __commonJS, __toESM, init_esm_shims } from "./chunk-ZWSCLKPB.js"; // ../../node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js var require_dayjs_min = __commonJS({ "../../node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js"(exports, module) { init_esm_shims(); (function(t, e) { typeof exports == "object" && typeof module < "u" ? module.exports = e() : typeof define == "function" && define.amd ? define(e) : (t = typeof globalThis < "u" ? globalThis : t || self).dayjs = e(); })(exports, function() { "use strict"; var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", c = "month", f = "quarter", h = "year", d = "date", l = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t2) { var e2 = ["th", "st", "nd", "rd"], n2 = t2 % 100; return "[" + t2 + (e2[(n2 - 20) % 10] || e2[n2] || e2[0]) + "]"; } }, m = function(t2, e2, n2) { var r2 = String(t2); return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2; }, v = { s: m, z: function(t2) { var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60; return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0"); }, m: function t2(e2, n2) { if (e2.date() < n2.date()) return -t2(n2, e2); var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, c), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), c); return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0); }, a: function(t2) { return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2); }, p: function(t2) { return { M: c, y: h, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: f }[t2] || String(t2 || "").toLowerCase().replace(/s$/, ""); }, u: function(t2) { return t2 === void 0; } }, g = "en", D = {}; D[g] = M; var p = "$isDayjsObject", S = function(t2) { return t2 instanceof _ || !(!t2 || !t2[p]); }, w = function t2(e2, n2, r2) { var i2; if (!e2) return g; if (typeof e2 == "string") { var s2 = e2.toLowerCase(); D[s2] && (i2 = s2), n2 && (D[s2] = n2, i2 = s2); var u2 = e2.split("-"); if (!i2 && u2.length > 1) return t2(u2[0]); } else { var a2 = e2.name; D[a2] = e2, i2 = a2; } return !r2 && i2 && (g = i2), i2 || !r2 && g; }, O = function(t2, e2) { if (S(t2)) return t2.clone(); var n2 = typeof e2 == "object" ? e2 : {}; return n2.date = t2, n2.args = arguments, new _(n2); }, b = v; b.l = w, b.i = S, b.w = function(t2, e2) { return O(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset }); }; var _ = function() { function M2(t2) { this.$L = w(t2.locale, null, !0), this.parse(t2), this.$x = this.$x || t2.x || {}, this[p] = !0; } var m2 = M2.prototype; return m2.parse = function(t2) { this.$d = function(t3) { var e2 = t3.date, n2 = t3.utc; if (e2 === null) return /* @__PURE__ */ new Date(NaN); if (b.u(e2)) return /* @__PURE__ */ new Date(); if (e2 instanceof Date) return new Date(e2); if (typeof e2 == "string" && !/Z$/i.test(e2)) { var r2 = e2.match($); if (r2) { var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3); return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2); } } return new Date(e2); }(t2), this.init(); }, m2.init = function() { var t2 = this.$d; this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds(); }, m2.$utils = function() { return b; }, m2.isValid = function() { return this.$d.toString() !== l; }, m2.isSame = function(t2, e2) { var n2 = O(t2); return this.startOf(e2) <= n2 && n2 <= this.endOf(e2); }, m2.isAfter = function(t2, e2) { return O(t2) < this.startOf(e2); }, m2.isBefore = function(t2, e2) { return this.endOf(e2) < O(t2); }, m2.$g = function(t2, e2, n2) { return b.u(t2) ? this[e2] : this.set(n2, t2); }, m2.unix = function() { return Math.floor(this.valueOf() / 1e3); }, m2.valueOf = function() { return this.$d.getTime(); }, m2.startOf = function(t2, e2) { var n2 = this, r2 = !!b.u(e2) || e2, f2 = b.p(t2), l2 = function(t3, e3) { var i2 = b.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2); return r2 ? i2 : i2.endOf(a); }, $2 = function(t3, e3) { return b.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2); }, y2 = this.$W, M3 = this.$M, m3 = this.$D, v2 = "set" + (this.$u ? "UTC" : ""); switch (f2) { case h: return r2 ? l2(1, 0) : l2(31, 11); case c: return r2 ? l2(1, M3) : l2(0, M3 + 1); case o: var g2 = this.$locale().weekStart || 0, D2 = (y2 < g2 ? y2 + 7 : y2) - g2; return l2(r2 ? m3 - D2 : m3 + (6 - D2), M3); case a: case d: return $2(v2 + "Hours", 0); case u: return $2(v2 + "Minutes", 1); case s: return $2(v2 + "Seconds", 2); case i: return $2(v2 + "Milliseconds", 3); default: return this.clone(); } }, m2.endOf = function(t2) { return this.startOf(t2, !1); }, m2.$set = function(t2, e2) { var n2, o2 = b.p(t2), f2 = "set" + (this.$u ? "UTC" : ""), l2 = (n2 = {}, n2[a] = f2 + "Date", n2[d] = f2 + "Date", n2[c] = f2 + "Month", n2[h] = f2 + "FullYear", n2[u] = f2 + "Hours", n2[s] = f2 + "Minutes", n2[i] = f2 + "Seconds", n2[r] = f2 + "Milliseconds", n2)[o2], $2 = o2 === a ? this.$D + (e2 - this.$W) : e2; if (o2 === c || o2 === h) { var y2 = this.clone().set(d, 1); y2.$d[l2]($2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d; } else l2 && this.$d[l2]($2); return this.init(), this; }, m2.set = function(t2, e2) { return this.clone().$set(t2, e2); }, m2.get = function(t2) { return this[b.p(t2)](); }, m2.add = function(r2, f2) { var d2, l2 = this; r2 = Number(r2); var $2 = b.p(f2), y2 = function(t2) { var e2 = O(l2); return b.w(e2.date(e2.date() + Math.round(t2 * r2)), l2); }; if ($2 === c) return this.set(c, this.$M + r2); if ($2 === h) return this.set(h, this.$y + r2); if ($2 === a) return y2(1); if ($2 === o) return y2(7); var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[$2] || 1, m3 = this.$d.getTime() + r2 * M3; return b.w(m3, this); }, m2.subtract = function(t2, e2) { return this.add(-1 * t2, e2); }, m2.format = function(t2) { var e2 = this, n2 = this.$locale(); if (!this.isValid()) return n2.invalidDate || l; var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = b.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, c2 = n2.months, f2 = n2.meridiem, h2 = function(t3, n3, i3, s3) { return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].slice(0, s3); }, d2 = function(t3) { return b.s(s2 % 12 || 12, t3, "0"); }, $2 = f2 || function(t3, e3, n3) { var r3 = t3 < 12 ? "AM" : "PM"; return n3 ? r3.toLowerCase() : r3; }; return r2.replace(y, function(t3, r3) { return r3 || function(t4) { switch (t4) { case "YY": return String(e2.$y).slice(-2); case "YYYY": return b.s(e2.$y, 4, "0"); case "M": return a2 + 1; case "MM": return b.s(a2 + 1, 2, "0"); case "MMM": return h2(n2.monthsShort, a2, c2, 3); case "MMMM": return h2(c2, a2); case "D": return e2.$D; case "DD": return b.s(e2.$D, 2, "0"); case "d": return String(e2.$W); case "dd": return h2(n2.weekdaysMin, e2.$W, o2, 2); case "ddd": return h2(n2.weekdaysShort, e2.$W, o2, 3); case "dddd": return o2[e2.$W]; case "H": return String(s2); case "HH": return b.s(s2, 2, "0"); case "h": return d2(1); case "hh": return d2(2); case "a": return $2(s2, u2, !0); case "A": return $2(s2, u2, !1); case "m": return String(u2); case "mm": return b.s(u2, 2, "0"); case "s": return String(e2.$s); case "ss": return b.s(e2.$s, 2, "0"); case "SSS": return b.s(e2.$ms, 3, "0"); case "Z": return i2; } return null; }(t3) || i2.replace(":", ""); }); }, m2.utcOffset = function() { return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); }, m2.diff = function(r2, d2, l2) { var $2, y2 = this, M3 = b.p(d2), m3 = O(r2), v2 = (m3.utcOffset() - this.utcOffset()) * e, g2 = this - m3, D2 = function() { return b.m(y2, m3); }; switch (M3) { case h: $2 = D2() / 12; break; case c: $2 = D2(); break; case f: $2 = D2() / 3; break; case o: $2 = (g2 - v2) / 6048e5; break; case a: $2 = (g2 - v2) / 864e5; break; case u: $2 = g2 / n; break; case s: $2 = g2 / e; break; case i: $2 = g2 / t; break; default: $2 = g2; } return l2 ? $2 : b.a($2); }, m2.daysInMonth = function() { return this.endOf(c).$D; }, m2.$locale = function() { return D[this.$L]; }, m2.locale = function(t2, e2) { if (!t2) return this.$L; var n2 = this.clone(), r2 = w(t2, e2, !0); return r2 && (n2.$L = r2), n2; }, m2.clone = function() { return b.w(this.$d, this); }, m2.toDate = function() { return new Date(this.valueOf()); }, m2.toJSON = function() { return this.isValid() ? this.toISOString() : null; }, m2.toISOString = function() { return this.$d.toISOString(); }, m2.toString = function() { return this.$d.toUTCString(); }, M2; }(), k = _.prototype; return O.prototype = k, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", c], ["$y", h], ["$D", d]].forEach(function(t2) { k[t2[1]] = function(e2) { return this.$g(e2, t2[0], t2[1]); }; }), O.extend = function(t2, e2) { return t2.$i || (t2(e2, _, O), t2.$i = !0), O; }, O.locale = w, O.isDayjs = S, O.unix = function(t2) { return O(1e3 * t2); }, O.en = D[g], O.Ls = D, O.p = {}, O; }); } }); // ../../core/caiyun/index.ts init_esm_shims(); // ../../core/caiyun/service/ai-cloud.ts init_esm_shims(); // ../../packages/utils-pure/index.ts init_esm_shims(); function randomHex(length, pad = "-") { return Array.isArray(length) ? length.map((l) => randomHex(l, pad)).join(pad) : Array.from({ length }).map(() => Math.floor(Math.random() * 16).toString(16)).join(""); } function randomNumber(low, high = low) { return Math.floor(Math.random() * (high - low) + low); } function randomString(length) { return Array.from({ length }).reduce((str) => { let num = Math.floor(Math.random() * 62); return str + String.fromCharCode(num + (num < 10 ? 48 : num < 36 ? 55 : 61)); }, ""); } function getXmlElement(xml, tag) { if (!xml.match) return ""; let m = xml.match(`<${tag}>(.*)</${tag}>`); return m ? m[1] : ""; } async function asyncForEach(array, task, cb) { let len = array.length; for (let index = 0; index < len; index++) { let item = array[index]; await task(item), index < len - 1 && cb && await cb(); } } function setStoreArray(store, key, values) { return Reflect.has(store, key) ? Reflect.set(store, key, Reflect.get(store, key).concat(values)) : Reflect.set(store, key, values); } function getAuthInfo(auth) { auth = auth.replace("Basic ", ""), auth = padBase64(auth); let rawToken = Buffer.from(auth, "base64").toString("utf-8"), [platform, phone, token] = rawToken.split(":"); return { phone, token, auth: `Basic ${auth}`, platform, expire: Number(token.split("|")[3]) }; } function padBase64(str) { return str.length % 4 === 0 ? str : str + "=".repeat(4 - str.length % 4); } function hashCode(str) { if (typeof str != "string") return 0; let hash = 0, char = null; if (str.length == 0) return hash; for (let i = 0; i < str.length; i++) char = str.charCodeAt(i), hash = (hash << 5) - hash + char, hash = hash & hash; return hash; } function isWps() { try { return globalThis.URLSearchParams === void 0 && globalThis.HTTP; } catch { return !1; } } function createTime() { let now = /* @__PURE__ */ new Date(); return now.getUTCFullYear() + pad2(now.getUTCMonth() + 1) + pad2(now.getUTCDate()) + pad2(now.getUTCHours() + 8) + pad2(now.getUTCMinutes()) + pad2(now.getUTCSeconds()); } function pad2(num) { return num < 10 ? `0${num}` : `${num}`; } function sleepSync(time) { let start = Date.now(); for (; Date.now() - start < time; ) ; return time; } function getTimestamp() { let now = /* @__PURE__ */ new Date(); return now.getUTCFullYear() + "", +pad2(now.getUTCMonth() + 1) + "", +pad2(now.getUTCDate()) + "", // +8 时区 +pad2(now.getUTCHours() + 8) + "", +pad2(now.getUTCMinutes()) + "", +pad2(now.getUTCSeconds()); } function isCurrentMonth(time) { return new Date(time).getMonth() === (/* @__PURE__ */ new Date()).getMonth(); } function isString(val) { return typeof val == "string"; } function isUndefined(val) { return typeof val > "u"; } function isNullish(val) { return val == null; } function hidePhone(phone) { return phone.substring(0, 3) + "*******" + phone.substring(9); } // ../../core/caiyun/api/ai-cloud.ts init_esm_shims(); // ../../core/caiyun/constant/index.ts init_esm_shims(); var caiyunUrl = "https://caiyun.feixin.10086.cn", marketUrl = "https://caiyun.feixin.10086.cn/market", mw2TogetherUrl = "https://html5.mail.10086.cn/mw2/together/s", riddlesUrl = "https://caiyun.feixin.10086.cn/market/lanternriddles/answeredPuzzles", aiUrl = "https://ai.yun.139.com", aiXtUrl = "https://yun.139.com/mrpInfo/ycloud/aixt", cloudPhoneMarketUrl = "https://cpactiv.buy.139.com/cloudphone-market", DB_KEYS = { /** AI 云朵获得数量 */ AI_CLOUND_NUM: "ai_cloud_num", /** 用户ID */ USER_ID: "user_id", /** 分享视频 */ SHARE_FIND: "share_find" }; // ../../core/caiyun/api/ai-cloud.ts function getCloudRewardApi(http, options) { return http.post(`${aiXtUrl}/playAiClouds/getCloudReward`, options); } function getPreCloudRewardApi(http, options) { return http.post(`${aiXtUrl}/playAiClouds/getPreCloudReward`, { type: 0, ...options }, { headers: { "X-Requested-With": "com.chinamobile.mcloud", Referer: "https://yun.139.com/ai-helper/" } }); } // ../../core/caiyun/utils/index.ts init_esm_shims(); async function request($, api, options, ...args) { let name = typeof options == "string" ? options : options.name; try { let { code, message, msg, result } = await api(...args); return code !== 0 ? ($.logger.fatal(`${name}失败`, code, message || msg), typeof options == "object" ? options.isArray === !1 ? {} : [] : {}) : result; } catch (error) { $.logger.error(`${name}异常`, error); } return typeof options == "object" ? options.isArray === !1 ? {} : [] : {}; } function getMarketName(marketId) { return { newsign_139mail: "139 邮箱", sign_in_3: "移动云盘" }[marketId] || "未知应用"; } function getGroupName(groupId) { return { day: "每日任务", month: "每月任务", new: "新用户任务", time: "热门任务", hiddenabc: "隐藏任务", hidden: "隐藏任务", beiyong1: "临时任务" }[groupId] || "未知任务"; } // ../../core/caiyun/utils/store.ts init_esm_shims(); async function setDataNum($, key, num) { $.localStorage && num && await $.localStorage.setItem(key, { count: num, lastUpdate: /* @__PURE__ */ new Date() }); } async function addDataNum($, key, num) { if (num) return await setDataNum($, key, num += await getDataNum($, key)), num; } async function getDataNum($, key) { if (!$.localStorage) return; let data = await $.localStorage.getItem(key); return data && isCurrentMonth(data.lastUpdate) ? data.count : 0; } // ../../core/caiyun/service/ai-cloud.ts async function aiCloudTask($) { if ($.logger.start("------【玩AI小天得云朵】------"), isWps()) { $.logger.fail("AI云朵", "当前环境为WPS,跳过"); return; } if (!$.store.aiSession || !$.store.aiSession.length) { $.logger.fail("AI云朵", "没有AI云朵对话记录,请确定AI红包任务已经运行"); return; } try { if (!$.config.userId) { $.logger.fatal("AI云朵", "获取用户ID失败"); return; } let userId = $.node.encryptAiUserId($.config.userId), num = await getDataNum($, DB_KEYS.AI_CLOUND_NUM); if (num || await setDataNum($, DB_KEYS.AI_CLOUND_NUM, num = await getCloudRecordByAi($) || 0), $.logger.info(`本月获取云朵数量: ${num}`), num > 250) return; if (num >= 197) return await addCloudNum($, { ...$.store.aiSession[0], userId }); for (let index = 0; index < 10; index++) { let data = $.store.aiSession[randomNumber(0, $.store.aiSession.length - 1)]; await addCloudNum($, { ...data, userId }), await $.sleep(2e3); } } catch (error) { $.logger.error("AI红包", error); } } async function addCloudNum($, ops) { return await addDataNum($, DB_KEYS.AI_CLOUND_NUM, await getCloudRewardRecord($, ops)); } async function getCloudRewardRecord($, options) { try { let recordId = await getPreCloudReward($, options); return recordId ? await getCloudReward($, { userId: options.userId, recordId }) : void 0; } catch (error) { $.logger.error("AI云朵异常", error); } } async function getPreCloudReward({ http, logger }, options) { try { let { code, msg, result } = await getPreCloudRewardApi(http, options); if (code === 52105) return logger.debug("僵尸打开你的脑子,摇了摇头走了"); if (code !== 0) { logger.fail("抽取奖励失败", code, msg); return; } return logger.debug("抽取奖励成功, 抽取", result.cloudNum), result.recordId; } catch (error) { logger.error("抽取奖励异常", error); } } async function getCloudReward({ http, logger }, options) { try { let { msg, code, result } = await getCloudRewardApi(http, options); if (code !== 0) { logger.fail("领取奖励失败", code, msg); return; } return logger.success("领取奖励成功, 获取", result, "云朵"), result; } catch (error) { logger.error("领取奖励异常", error); } } async function getCloudRecordByAi($) { let records = await request($, $.api.getCloudRecord, "获取云朵记录", 1, 300); return records ? records.records.filter((el) => el.mark === "PlayAiodd" && isCurrentMonth(el.inserttime)).reduce((acc, cur) => acc + cur.num, 0) : 0; } // ../../core/caiyun/service/app.ts init_esm_shims(); // ../../core/caiyun/api/file.ts init_esm_shims(); function getFileList(http) { return http.post("https://personal-kd-njs.yun.139.com/hcy/file/list", { pageInfo: { pageSize: 100, pageCursor: null }, orderBy: "updated_at", orderDirection: "DESC", parentFileId: "/", imageThumbnailStyleList: [ "Small", "Large" ] }, { headers: { "x-yun-api-version": "v1", "x-yun-app-channel": "10000034", "x-yun-client-info": "||9|7.13.6|edge||||linux unknow||zh-CN|||ZWRnZQ==||" } }); } function getDisk(http, account, catalogID) { return http.post( "https://yun.139.com/orchestration/personalCloud/catalog/v1.0/getDisk", { commonAccountInfo: { account: String(account) }, catalogID, catalogType: -1, sortDirection: 1, catalogSortType: 0, contentSortType: 0, filterType: 0, startNumber: 1, endNumber: 100 } ); } // ../../core/caiyun/constant/task-list.ts init_esm_shims(); var emailTaskList = { /** * 从固定入口签到 */ // 1005: { // id: 1005, // group: 'time', // }, /** * 去“发现广场”浏览精彩内容 */ // 1008: { // id: 1008, // group: 'month', // }, /** * 前往“云盘”查看个人动态 */ 1009: { id: 1009, group: "month" }, /** * 浏览限免影视大片 */ 1010: { id: 1010, group: "month" }, /** * 查看“我的附件” */ 1013: { id: 1013, group: "month" }, /** * 体验“PDF转换”功能 */ // 1014: { // id: 1014, // group: 'month', // }, /** * 体验“云笔记”功能 */ 1016: { id: 1016, group: "month" }, /** * 登录移动云盘APP云朵中心 */ // 1017: { // id: 1017, // group: 'month', // }, /** 月月开通 月月有礼 */ 1021: { id: 1021, group: "month", runner: !0 } }, cloudTaskList = { /** * 手动上传一个文件 */ 106: { id: 106, runner: !0, group: "day" }, /** * 创建一篇云笔记 */ 107: { id: 107, runner: !0, group: "day" }, /** * 当月上传容量满1G */ 110: { id: 110, runner: !0, group: "month" }, /** * 使用PC客户端 */ 113: { id: 113, group: "month" }, /** * 浏览APP-我的-活动中心 */ 115: { id: 115, group: "month" }, /** * 从固定入口访问云朵中心 */ // 409: { // id: 409, // group: 'month', // }, /** * 去发现频道看大片 */ // 426: { // id: 426, // group: 'month', // }, /** * 使用移动云手机 */ 431: { id: 431, group: "month" }, /** * 分享文件有好礼 */ 434: { id: 434, runner: void 0, group: "day" }, /** * 体验云盘AI功能 */ 435: { id: 435, group: "month" }, /** * 当月上传个文件满100个 */ 522: { id: 522, group: "month", runner: !0 } }, hotTaskList = { /** * 分享文件有好礼 */ 434: { id: 434, group: "time" }, /** * 去中国移动APP领好礼 */ 447: { id: 447, group: "time" } }, TASK_LIST = { ...emailTaskList, ...cloudTaskList, ...hotTaskList }, SKIP_TASK_LIST = [ /** 邀请新用户 */ 117, /** 邀请好友看电影 */ 437, /** 组团领现金 */ 991, /** 开启通知领云朵 */ 406, /** 月月备份领好礼 */ 385, /** 30G流量0元领 */ 120 ]; // ../../core/caiyun/service/index.ts init_esm_shims(); // ../../core/caiyun/service/ai-redpack.ts init_esm_shims(); // ../../core/caiyun/service/auth.ts init_esm_shims(); async function _getSsoTokenApi($, phone) { try { let { success, data, code, message } = await $.api.querySpecToken(phone); if (!success) { $.logger.debug("获取 ssoToken 失败", code, message, data); return; } return data.token; } catch (error) { $.logger.error("获取 ssoToken 异常", error); } } async function getSsoTokenApi($, phone) { let token; for (let index = 0; index < 5; index++) { if (token = await _getSsoTokenApi($, phone), token) return token; await $.sleep(2e3); } $.logger.fatal("获取 ssoToken 失败,请查看 debug 信息"); } async function loginEmail($) { let ssoToken = await getSsoTokenApi($, $.config.phone); if (ssoToken) try { let { code, summary, var: data } = await $.api.loginMail(ssoToken); if (code !== "S_OK") { $.logger.fatal("获取 sid 失败", code, summary); return; } return data; } catch (error) { $.logger.error("获取 sid 异常", error); } } async function refreshToken($) { try { let { token, phone } = $.config, tokenXml = await $.api.authTokenRefresh(token, phone); if (!tokenXml) return $.logger.error("authTokenRefresh 失败"); let newToken = getXmlElement(tokenXml, "token"); if (newToken) return newToken; $.logger.error(tokenXml); } catch (error) { $.logger.error("刷新 token 失败", error); } } async function getJwtTokenApi($, ssoToken) { return (await request($, $.api.tyrzLogin, "获取 ssoToken ", ssoToken)).token; } async function getJwtToken($) { let ssoToken = await getSsoTokenApi($, $.config.phone); if (ssoToken) return await getJwtTokenApi($, ssoToken); } async function getNoteAuthToken($) { try { return $.api.getNoteAuthToken($.config.token, $.config.phone); } catch (error) { $.logger.error("获取云笔记 Auth Token 异常", error); } } async function getUserId($) { let { body } = await getNoteAuthToken($); if (!body) return; let match = body.match(/"userId":(\d+)/); if (match) return match[1]; } async function setUserId($) { let userId = await $.localStorage?.getItem(DB_KEYS.USER_ID); if (userId) { $.config.userId = userId; return; } (userId = await getUserId($)) && ($.config.userId = userId, await $.localStorage?.setItem(DB_KEYS.USER_ID, userId)); } function isNeedRefresh(expireTime, day) { return expireTime - Date.now() < day * 864e5; } async function createNewAuth($) { let { config, logger } = $; if (logger.debug("------【检测账号有效期】------"), logger.debug(`token 有效期 ${Math.floor((config.expire - Date.now()) / 864e5)} 天`), !!isNeedRefresh(config.expire, config.剩余多少天刷新token)) return logger.info("尝试生成新的 auth"), await getNewAuth($); } function formatAuth(token, phone, platform) { return Buffer.from(`${platform}:${phone}:${token}`).toString("base64"); } async function getNewAuth($) { let token = await refreshToken($); if (token) { let { config } = $; return formatAuth(token, config.phone, config.platform); } $.logger.error("生成新 auth 失败"); } // ../../core/caiyun/service/ai-redpack.ts async function aiRedPackTask($) { if ($.logger.start("------【AI红包】------"), isWps()) { $.logger.fail("AI红包", "当前环境为WPS,跳过"); return; } try { if (await blindboxJournaling($), !await init($)) return; await setUserId($); let count = 4; for (; !await _task($) && count > 0; ) count--; } catch (error) { $.logger.error("AI红包", error); } } async function blindboxJournaling({ api, sleep: sleep2 }) { let marketName = "&marketName=National_LanternRiddlesal_LanternRiddles"; await api.journaling("National_LanternRiddles_client_all", "1008", marketName), await sleep2(200), await api.journaling("National_LanternRiddles_pv", "1008", marketName), await sleep2(200), await api.journaling("National_LanternRiddles_client_isApp", "1008", marketName), await sleep2(200); } function saveSession($, { sessionId, dialogueId }) { $.store.aiSession || ($.store.aiSession = []), $.store.aiSession.push({ sessionId, dialogueId }), $.logger.debug("保存会话", sessionId, dialogueId); } async function _task($) { let sleep2 = $.sleep; await sleep2(1e3); let puzzleCards = await getPuzzleCards($); if (!puzzleCards) return; let puzzleCard = puzzleCards[randomNumber(0, puzzleCards.length - 1)]; $.logger.debug("谜面 -> ", puzzleCard.puzzle), await sleep2(200); let { msg, exitMsg, needMatch, failMsg } = await getMailChatMsg($, puzzleCard.puzzle); if (exitMsg) throw new Error(exitMsg); if (failMsg) return $.logger.fail("AI红包", failMsg); if (!msg) return $.logger.debug("获取AI聊天消息失败"); let tip = needMatch ? matchResult(msg) : msg; if (!tip) return $.logger.fail("AI红包", "未获取到谜底", msg); $.logger.debug("谜底 -> ", tip), await sleep2(400); let answered = await submitAnswered($, puzzleCard.id, tip); if (answered === -1) return !0; if (answered !== 0) return; await sleep2(400); let prizeName = await openRedPack($, puzzleCard.id); if (prizeName === -1) return !0; if (typeof prizeName != "number") { if (prizeName !== "谢谢参与") return $.logger.success("获得", prizeName), !0; $.logger.debug("获得", prizeName); } } async function init($) { try { let loginInfo = await loginEmail($); if (!loginInfo) return; let { sid, rmkey } = loginInfo; if (sid) return $.http.setCookie("sid", sid, caiyunUrl), $.http.setCookie("RMKEY", rmkey, mw2TogetherUrl), sid; } catch (error) { $.logger.error("邮箱登录异常", error); } } async function getPuzzleCards($) { let puzzleCards = await request($, $.api.getIndexPuzzleCard, { name: "获取谜底列表" }); if (!puzzleCards.length) { $.logger.fail("未获取到谜底列表,跳过任务"); return; } return puzzleCards.filter(({ puzzleTitleContext }) => puzzleTitleContext && puzzleTitleContext.length < 6).map((item) => ({ puzzle: item.puzzleTitleContext, id: item.id })); } async function getMailChatMsg($, dialogue) { try { let { code, success, message, data } = await $.api.addChat(dialogue, $.config.userId); return success ? (data.sessionId && saveSession($, data), data.flowResult ? { msg: data.flowResult.outContent, needMatch: !0 } : data.leadCopy ? { msg: data.leadCopy.linkName } : { failMsg: JSON.stringify({ code, message, success, data }) }) : ($.logger.fail("获取AI聊天消息失败", code, message), code === "10000007" || code === "01000004" ? { exitMsg: message } : {}); } catch (error) { $.logger.error("获取AI聊天消息异常", error); } } function matchResult(result) { if (!result.includes("<p>") || !result.includes("——")) return; let [, r1] = result.split("<p>"), [r2] = r1.split(/<\/p\s?>/); if (!r2) return; let [, r3] = r2.trim().split(/—+/), r4 = r3 && r3.trim().replace(/<br\s?\/>/, ""); return r4 && r4.split("/")[0]; } async function submitAnswered($, id, a) { try { let { code, msg } = await $.api.submitAnswered(id, a); switch (code) { case 0: return $.logger.debug("回答问题成功"), 0; case 201: return $.logger.fail("回答问题成功,但", msg), -1; default: return $.logger.fail("回答问题失败", code, msg), 1; } } catch (error) { $.logger.error("回答答案异常", error); } return 2; } async function openRedPack($, puzzleId) { try { let { code, msg, result } = await $.api.getAwarding(puzzleId); switch (code) { case 0: return result.prizeName; case 10010020: return $.logger.fail("可能你需要去 APP 手动完成一次", code, msg), -1; default: return $.logger.fail("打开红包失败", code, msg), 1; } } catch (error) { $.logger.error("打开红包", error); } return 2; } // ../../core/caiyun/service/cloud-day.ts init_esm_shims(); // ../../core/caiyun/api/cloud-day.ts init_esm_shims(); function getCloudDayList(http) { return http.get( caiyunUrl + "/ycloud/mcloudday/gift/list" ); } function verifyCloudDay(http, prizeId) { return http.post( caiyunUrl + "/ycloud/mcloudday/gift/verify", { prizeId } ); } function receiveCloudDayGift(http, prizeId, smsCode) { return http.post( caiyunUrl + "/ycloud/mcloudday/gift/receive", { prizeId, smsCode } ); } // ../../core/caiyun/service/cloud-day.ts async function getCloudDayList2({ logger, http }) { try { let { code, msg, result } = await getCloudDayList(http); if (code === 0) return result.nationalPrizeList; logger.fatal("获取会员日列表失败", code, msg); } catch (error) { logger.error("获取会员日列表异常", error); } return []; } async function verifyCloudDay2({ logger, http }, prizeId) { try { let { code, msg } = await verifyCloudDay(http, prizeId); if (code === 0) return logger.info("验证会员日礼物成功,因该可以兑换"), !0; logger.fatal("验证会员日礼物失败", code, msg); } catch (error) { logger.error("验证会员日礼物异常", error); } } async function receiveCloudDayGift2({ logger, http, md5: md52 }, prizeId, smsCode) { try { let { code, msg } = await receiveCloudDayGift(http, prizeId, md52(String(smsCode))); if (code === 0) return logger.success("礼物领取成功!"), !0; logger.fatal("礼物领取失败", code, msg); } catch (error) { logger.error("礼物领取异常", error); } } // ../../core/caiyun/service/index.ts async function uploadFileRequest($, parentCatalogID, { ext = ".png", digest, contentSize, manualRename = 2, contentName, createTime: createTime2, ...options } = {}, needUpload) { try { digest || (digest = randomHex(32).toUpperCase()), createTime2 || (createTime2 = createTime()), contentSize || (contentSize = randomNumber(1, 1e3)), contentName || (contentName = "asign-" + randomHex(4) + ext); let xml = await $.api.uploadFileRequest( { phone: $.config.phone, parentCatalogID, contentSize, createTime: createTime2, digest, manualRename, contentName, ...options } ), isNeedUpload = getXmlElement(xml, "isNeedUpload"), contentID = getXmlElement(xml, "contentID"); if (isNeedUpload === "1") return needUpload ? { redirectionUrl: getXmlElement(xml, "redirectionUrl"), uploadTaskID: getXmlElement(xml, "uploadTaskID"), contentName: getXmlElement(xml, "contentName"), contentID } : ($.logger.fail("未找到该文件,该文件需要手动上传"), {}); if (contentID) return contentID && setStoreArray($.store, "files", [contentID]), { contentID }; $.logger.error("上传文件请求失败", xml); } catch (error) { $.logger.error("上传文件请求异常", error); } return {}; } async function uploadFile($, parentCatalogID, { ext = ".png", digest, contentSize, manualRename = 2, contentName, createTime: createTime2, ...options } = {}, file) { try { let { redirectionUrl, uploadTaskID, contentID } = await uploadFileRequest($, parentCatalogID, { ext, digest, contentSize, manualRename, contentName, createTime: createTime2, ...options }, !0); if (!redirectionUrl || !file) return !!contentID; let size = typeof file == "string" ? file.length : file.byteLength; $.logger.debug("别着急,文件上传中。。。"); let xml = await $.api.uploadFile(redirectionUrl.replace(/&amp;/g, "&"), uploadTaskID, file, size); switch (getXmlElement(xml, "resultCode")) { case "0": return contentID && setStoreArray($.store, "files", [contentID]), $.logger.debug("上传文件成功"), !0; case "9119": return $.logger.fail("上传文件失败:md5校验失败"), !1; default: return $.logger.error("上传文件失败", xml), !1; } } catch (error) { $.logger.error("上传文件异常", error); } return !1; } async function uploadRandomFile($, options) { try { if (isWps()) { let map = [ { key: "1", value: "c4ca4238a0b923820dcc509a6f75849b" }, { key: "2", value: "c81e728d9d4c2f636f067f89cc14862c" }, { key: "3", value: "eccbc87e4b5ce2fe28308fd9f2a7baf3" }, { key: "123", value: "202cb962ac59075b964b07152d234b70" } ], r = randomNumber(0, map.length); return await uploadFile($, $.config.catalog, { digest: map[r].value }, map[r].key); } let buffer = randomHex(32); return await uploadFile($, $.config.catalog, { ...options, digest: $.md5(buffer) }, buffer); } catch (error) { $.logger.error("uploadRandomFile 异常", error); } } function getBackParentCatalogID() { return "00019700101000000043"; } // ../../core/caiyun/service/app.ts async function _handleClick($, task, doingList) { await _clickTask($, task.id, task.currstep) && (await _handleAppTask($, task), doingList.push(task.id), await $.sleep(500)); } async function _switchAppTask($, task, doingList) { switch (task.id === 434 && ($.store.shareCount = getShareCount(task.name), $.logger.debug("shareCount", $.store.shareCount)), task.groupid) { case "beiyong1": if (await _handleClick($, task, doingList), task.name.includes("上传") && (task.name.includes("图") || task.name.includes("照"))) { $.logger.debug("尝试完成", task.name), await uploadRandomFile($); return; } case "month": if (task.marketname === "sign_in_3" && $.store.curMonthBackup === !1 && (/* @__PURE__ */ new Date()).getDate() < 20) { $.logger.debug("跳过任务(未开启备份)", task.name); return; } default: { if (TASK_LIST[task.id]) { await _handleClick($, task, doingList); return; } if (!SKIP_TASK_LIST.includes(task.id)) { await clickTask($, task.id); return; } } } } function getShareCount(str) { return +str.replace("分享文件得云朵<span id='share_title'>", "").replace("/7</span>", ""); } function printShareCount($, name) { let count = getShareCount(name); count > $.store.shareCount && $.logger.success("分享文件有好礼", count, "天"); } async function appTask($) { $.logger.start("------【任务列表】------"); let taskList = await getAllAppTaskList($), doingList = []; taskList.sort((a, b) => a.id - b.id); for (let task of taskList) $.config.tasks?.skipTasks?.includes(task.id) || task.state === "FINISH" || task.enable !== 1 || await _switchAppTask($, task, doingList); let skipCheck = [1021]; for (let task of await getAllAppTaskList($)) { if (skipCheck.includes(task.id)) continue; if (task.id === 434) { printShareCount($, task.name); continue; } task.id === 481 && task.currstep === 2 && await clickTask($, 481, "randomCloudTask"), task.id === 478 && task.state !== "FINISH" && await clickTask($, 478, "randomCloudTask"); let printFail = (msg) => $.logger.fail( msg, `请前往${getMarketName(task.marketname)}手动完成${getGroupName(task.groupid)}:${task.name}(${task.id})` ); if (doingList.includes(task.id)) { if (task.state === "FINISH") { $.logger.success("成功", task.name); continue; } if (task.id === 522) { task.process === 0 ? printFail("失败") : $.logger.info(task.name, "本月已经完成", task.process, "次"); continue; } printFail("失败"); continue; } (task.groupid === "month" || task.groupid === "day" || task.groupid === "cloudEmail") && task.state !== "FINISH" && printFail("未完成"); } } async function _handleAppTask($, task) { let taskRunner = getTaskRunner($); switch (task.id) { case 110: case 522: return await taskRunner[task.id]?.($, task.process); default: return await taskRunner[task.id]?.($, task); } } function getTaskRunner($) { return { 113: async ($2) => { await refreshToken($2), sleepSync(1e3), await uploadRandomFile($2, { channelSrc: "10200153" }); }, 106: ($2) => uploadRandomFile($2, { uploadSrc: "1" }), 107: createNoteDaily, 434: shareTime, 110: $.node && $.node.uploadTask, 522: update100, 1021: emailNotice }; } async function getAllAppTaskList($) { let list1 = await getAppTaskList($, "sign_in_3"), list2 = await getAppTaskList($, "newsign_139mail"); return list1.concat(list2); } async function emailNotice($, task) { try { let { out } = task.button; if (!out) return; if (out.canReceive === 1) { $.logger.debug("可以领取通知奖励", task.id), await request($, $.api.receiveTask, "领取邮件通知奖励", task.id); return; } out.day && $.logger.debug("邮箱通知已经开启", out.day, "天"); } catch (error) { $.logger.error("邮件通知异常", error); } } async function update100($, progressNum) { $.logger.info("开始执行每月100次上传任务"); for (let i = 0; i < $.config.tasks.每月上传任务单日数量 && !(progressNum >= 100); i++) await uploadRandomFile($, { uploadSrc: "1" }), await $.sleep(500); } async function getAppTaskList($, marketname = "sign_in_3") { let data = await request( $, $.api.getTaskList, "获取任务列表", marketname ); return Object.values(data).flat(); } async function createNoteDaily($) { if (!$.config.token) { $.logger.info("未配置 authToken,跳过云笔记任务执行"); return; } let { headers } = await getNoteAuthToken($); if (!headers || !headers.app_auth) { $.logger.info("获取鉴权信息失败,跳过云笔记任务执行"); return; } try { let id = randomHex(32); await $.api.createNote(id, `${randomHex(3)}`, $.config.phone, headers), await $.sleep(2e3), await $.api.deleteNote(id, headers); } catch (error) { $.logger.error("创建云笔记异常", error); } } async function _clickTask($, id, currstep = 0) { let idCurrstepMap = { 434: 22 }; return idCurrstepMap[id] && currstep === idCurrstepMap[id] ? (await clickTask($, id), !0) : currstep === 0 ? await clickTask($, id) : !0; } async function _getFileList($) { try { let { message, code, data, success } = await getFileList($.http); if (success) return $.logger.debug("测试 file/list"), data.items.filter((item) => item.type === "file").map((item) => ({ name: item.name, id: item.fileId })); if (code === "04510001") return !1; $.logger.fail("获取文件列表失败", code, message); } catch (error) { $.logger.error("获取文件列表异常", error); } } async function _getFileList2($) { try { let { message, code, data, success } = await getDisk($.http, $.config.phone, $.config.catalog); if (success) return $.logger.debug("测试 file/list"), (data.getDiskResult?.contentList).map((item) => ({ name: item.contentName, id: item.contentID })); if (code === "04510001") return !1; $.logger.fail("获取文件列表失败", code, message); } catch (error) { $.logger.error("获取文件列表异常", error); } } async function getShareFile($) { let files = $.config.文件获取方式 === 1 ? await _getFileList($) : await _getFileList2($); if (files) { let file = files.find( (item) => item.name === "中国移动云盘产品手册.pdf" || item.name === "欢迎使用彩云.pdf" || item.name.startsWith("asign-") ) || files[randomNumber(0, files.length - 1)]; return file ? { id: file.id, name: file.name } : { id: void 0 }; } return { id: $.config.tasks.shareFile || $.store.files?.[0] }; } async function delShareFile($, linkIDs) { try { let { code, message, data } = await $.api.delOutLink($.config.phone, linkIDs); if (code === "0") return $.logger.debug("删除分享成功", linkIDs, message), !0; $.logger.debug("分享文件失败", code, message, data.result); } catch (error) { $.logger.debug("删除分享文件失败", error); } } async function shareTime($) { try { let { id, name } = await getShareFile($); if (!id) { $.logger.debug("本次没有上传任务,跳过分享任务"); return; } $.logger.debug("分享", id, name || ""); let { code, message, data } = await $.api.getOutLink( $.config.phone, [id], "" ); if (code === "0") { $.logger.success("分享文件成功(分享成功不等于任务完成)", message); try { await delShareFile($, [data.getOutLinkRes.getOutLinkResSet[0].linkID]); } catch { } return !0; } $.logger.fail("分享文件失败", code, message, data && data.result); } catch (error) { $.logger.error("分享文件异常", error); } } async function clickTask($, id, taskStr) { try { let { code, msg, result } = await $.api.clickTask(id, taskStr); if (code === 0) return result && result.msg && $.logger.info(id, result.msg), !0; $.logger.fail(`点击任务${id}失败`, msg); } catch (error) { $.logger.error(`点击任务${id}异常`, error); } return !1; } // ../../core/caiyun/service/backup-gift.ts init_esm_shims(); async function backupGiftTask($) { $.logger.start("------【备份好礼】------"); try { let { state, curMonth } = await request($, $.api.getBackupGift, "backupGiftTask"); if (!curMonth) return; switch (state) { case -1: $.logger.warn("未开启备份,请前往 APP 手动开启"); return; case 1: $.logger.success("本月已领取"); return; case 0: $.logger.info("领取备份奖励"); let result = await request($, $.api.receiveBackupGift, "backupGiftTask"); typeof result == "number" && $.logger.success("领取成功,获得云朵", result); return; default: $.logger.warn("未知状态", state); } } catch (error) { $.logger.error("备份好礼", error); } } // ../../core/caiyun/service/blind-box.ts init_esm_shims(); async function openBlindbox($) { try { $.logger.debug("开盲盒"); let { code, msg, result } = await $.api.openBlindbox(); switch (code) { case 0: return $.logger.info("获得", result.prizeName); case 200103: return $.logger.fail("本月奖励已领完", code, msg); case 200105: return $.logger.debug("什么都没有哦"); case 200106: return $.logger.error("异常", code, msg); default: return $.logger.warn("未知原因失败", code, msg); } } catch (error) { $.logger.error("openBlindbox 异常", error); } } async function openBlindboxAfterGetCount($) { try { let { chanceNum } = await request($, $.api.blindboxUser, "获取盲盒任务"); if (!chanceNum) return; await $.sleep(666); for (let i = 0; i < chanceNum; i++) await openBlindbox($), await $.sleep(666); } catch (error) { $.logger.error("开盒异常", error); } } async function registerBlindboxTask($, taskId) { await request($, $.api.registerBlindboxTask, "注册盲盒", taskId); } async function openMoreBlindbox($) { try { let taskList = await request($, $.api.getBlindboxTask, "获取盲盒任务"); if (!Array.isArray(taskList)) return; let tasks2 = taskList.filter((task) => task.memo && !task.memo.includes("isLimit") && task.status === 0); if (tasks2.length <= 0) return; for (let { taskName, taskId } of tasks2) $.logger.debug("注册盲盒任务", taskName), await registerBlindboxTask($, taskId), await $.sleep(666), await openBlindboxAfterGetCount($); } catch (error) { $.logger.error(error); } } async function blindboxJournaling2({ api, sleep: sleep2 }) { await api.journaling("National_BlindBox_userLogin"), await sleep2(200), await api.journaling("National_BlindBox_login"), await sleep2(200), await api.journaling("National_BlindBox_loginAppOuterEnd"), await sleep2(200); } async function blindboxTask($) { $.logger.start("------【开盲盒】------"); try { await blindboxJournaling2($); let r1 = await request($, $.api.blindboxUser, "获取盲盒用户信息"); if (typeof r1.chanceNum != "number") return $.logger.debug(r1.chanceNum), await openBlindbox($); if (r1.chanceNum === 0 && r1.taskNum >= 2) { $.logger.info("今日已完成"); return; } r1.firstTime && $.logger.success("今日首次登录,获取次数 +1"); for (let i = 0; i < r1.chanceNum; i++) await openBlindbox($), await $.sleep(666); await openMoreBlindbox($); } catch (error) { $.logger.error("开盲盒任务异常", error); } } // ../../core/caiyun/service/cloud-phone-redpack.ts init_esm_shims(); // ../../core/caiyun/api/cloud-phone-redpack.ts init_esm_shims(); function userAccountInfo(http, headers) { return http.post(`${cloudPhoneMarketUrl}/redpacket/userAccountInfo`, {}, { headers }); } function configTaskList(http, headers) { return http.post(`${cloudPhoneMarketUrl}/redpacket/configTaskList`, {}, { headers }); } function userSign(http, headers) { return http.post(`${cloudPhoneMarketUrl}/redpacket/userSign`, {}, { headers }); } function getTyrzToken(http) { return http.get( `${caiyunUrl}/portal/auth/getTyrzToken.action?sourceId=001216&_=${Date.now()}` ); } function tokenValidate(http, token, headers) { return http.post( `${cloudPhoneMarketUrl}/user/tokenValidate`, { version: "1.0", pintype: 13, token }, { headers } ); } // ../../core/caiyun/service/cloud-phone-redpack.ts function getHeader(md52, token) { let appId = "12345681", requestId = createTime() + Date.now() + randomString(8), timestamp = Date.now(); return { sign: getSign(md52, { requestId, appId, token }, timestamp), requestId, appId, token, timestamp: String(timestamp) }; } function getSign(md52, params, timestamp) { let code = "e10adc3949ba59abbe56e057f20f883e", paramsStr = Object.values(params).reduce( (acc, value) => acc + (isNullish(value) ? "" : typeof value == "object" ? JSON.stringify(value) : value), "" ); return md52(paramsStr + code + timestamp).toLowerCase(); } async function cloudPhoneRedpackTask($) { $.logger.start("------【云手机红包派对】------"); try { if (await login($), !$.store?.cloudPhoneToken) { $.logger.error("云手机红包派对", "登录失败"); return; } await printUser($), await $.sleep(1e3), await sign($); } catch (error) { $.logger.error("云手机红包派对", error); } } async function getConfigTaskList({ http, logger, md5: md52, store }) { try { let { header, data } = await configTaskList(http, getHeader(md52, store.cloudPhoneToken)); if (header.status !== "200") { logger.error("getConfigTaskList 失败", header); return; } return data; } catch (error) { logger.error("getConfigTaskList", error); } } async function sign($) { let task = await getConfigTaskList($); if (!task) return; let { configTaskSignList } = task, today