fix(qdreader): use upstream executable task endpoints
This commit is contained in:
@@ -38,13 +38,13 @@ var DEFAULT_SIGN_API = "https://api.120399.xyz/qdreader"
|
||||
var QIDIAN_BASE = "https://h5.if.qidian.com"
|
||||
var CHECKIN_PATH = "/argus/api/v3/checkin/checkin"
|
||||
var QD_TASKS = [
|
||||
{ key: "reward", label: "领取奖励", path: "/argus/api/v3/checkin/getcurrentweekcheckininfo", method: "GET", defaultEnabled: true, builtin: true },
|
||||
{ key: "adv", label: "激励任务", path: "/argus/api/v2/video/adv/mainPage", method: "GET", settingKey: ADV_JOB_ENABLE_KEY },
|
||||
{ key: "extraAdv", label: "每日任务", path: "/argus/api/v2/video/adv/packageList", method: "GET", settingKey: EXTRA_ADV_JOB_ENABLE_KEY },
|
||||
{ key: "lottery", label: "每日抽奖", path: "/argus/api/v2/video/lottery", method: "POST", settingKey: LOTTERY_ENABLE_KEY, body: { source: "autman" } },
|
||||
{ key: "weeklyExchange", label: "每周兑换", path: "/argus/api/v2/video/exchange/page", method: "GET", settingKey: WEEKLY_EXCHANGE_ENABLE_KEY, sundayOnly: true },
|
||||
{ key: "chapterCard", label: "章节卡片", path: "/argus/api/v2/video/chapterCard/info", method: "GET", settingKey: CHAPTER_CARD_ENABLE_KEY },
|
||||
{ key: "messageBox", label: "大咖荐书", path: "/ajax/message/getMessageBox", method: "GET", settingKey: MESSAGE_BOX_ENABLE_KEY, params: { type: "qdreader" } }
|
||||
{ key: "reward", label: "领取奖励", handler: "receiveGifts", defaultEnabled: true, builtin: true },
|
||||
{ key: "adv", label: "激励任务", handler: "adv", settingKey: ADV_JOB_ENABLE_KEY },
|
||||
{ key: "extraAdv", label: "每日任务", handler: "daily", settingKey: EXTRA_ADV_JOB_ENABLE_KEY },
|
||||
{ key: "lottery", label: "每日抽奖", handler: "lottery", settingKey: LOTTERY_ENABLE_KEY },
|
||||
{ key: "weeklyExchange", label: "每周兑换", handler: "exchange", settingKey: WEEKLY_EXCHANGE_ENABLE_KEY, sundayOnly: true },
|
||||
{ key: "chapterCard", label: "章节卡片", handler: "chapterCard", settingKey: CHAPTER_CARD_ENABLE_KEY },
|
||||
{ key: "messageBox", label: "大咖荐书", handler: "messageBox", settingKey: MESSAGE_BOX_ENABLE_KEY }
|
||||
]
|
||||
|
||||
function defined(name) { try { return typeof this[name] !== "undefined" } catch (e) { return false } }
|
||||
@@ -386,11 +386,12 @@ function qidianRequest(path, method, data, cookie) {
|
||||
var info = normalizeCookie(cookie)
|
||||
if (!info.uid) throw new Error("Cookie 缺少 uid/QDHeader")
|
||||
var signApi = String(cfgGet(SIGN_API_KEY, DEFAULT_SIGN_API)).replace(/\/+$/, "")
|
||||
var payload = { qdh: info.qdh, qdheader: info.qdheader, url: QIDIAN_BASE + path, method: method, data: data || {}, uid: info.uid, guid: info.guid, qimei: info.qimei, qimei36: info.qimei36 }
|
||||
var targetUrl = /^https?:\/\//i.test(path) ? path : QIDIAN_BASE + path
|
||||
var payload = { qdh: info.qdh, qdheader: info.qdheader, url: targetUrl, method: lower(method), data: data || {}, uid: info.uid, guid: info.guid, qimei: info.qimei, qimei36: info.qimei36 }
|
||||
var headers = normalizeSignHeaders(postJson(signApi + "/sign", payload))
|
||||
headers.Cookie = info.cookie
|
||||
if (!headers["User-Agent"]) headers["User-Agent"] = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/QDReaderiOS/5.9.456/728/QDReaderAppstore"
|
||||
var req = { url: QIDIAN_BASE + path, method: lower(method), dataType: "json", timeOut: 10000, headers: headers }
|
||||
var req = { url: targetUrl, method: lower(method), dataType: "json", timeOut: 10000, headers: headers }
|
||||
if (method === "GET") {
|
||||
var query = qs(data || {})
|
||||
if (query) req.url += (req.url.indexOf("?") >= 0 ? "&" : "?") + query
|
||||
@@ -570,7 +571,108 @@ function taskMenuForUid(uid) {
|
||||
setTaskPrefs(all)
|
||||
return reply(task.label + "已" + (enable ? "开启" : "关闭") + "(账号 " + maskUid(uid) + ")\n" + taskStatusLines(uid))
|
||||
}
|
||||
function qdGet(path, data, cookie) { return qidianRequest(path, "GET", data || {}, cookie) }
|
||||
function qdPost(path, data, cookie) { return qidianRequest(path, "POST", data || {}, cookie) }
|
||||
function firstArray() {
|
||||
for (var i = 0; i < arguments.length; i++) if (Array.isArray(arguments[i])) return arguments[i]
|
||||
return []
|
||||
}
|
||||
function nested(obj, path) {
|
||||
var cur = obj
|
||||
for (var i = 0; i < path.length; i++) {
|
||||
if (!cur || cur[path[i]] === undefined || cur[path[i]] === null) return undefined
|
||||
cur = cur[path[i]]
|
||||
}
|
||||
return cur
|
||||
}
|
||||
function makeVideoPayload(taskId) {
|
||||
return { TaskId: String(taskId || ""), BanId: "0", BanMessage: "", Challenge: "", CaptchaType: "0", Fee: "", Gif: "", Gt: "", NewCaptcha: "0", Offline: "0", PhoneTicket: "", SessionKey: "" }
|
||||
}
|
||||
function doReceiveGifts(cookie) {
|
||||
var res = qdPost("/argus/api/v3/checkin/receivegifts", { GameId: "0" }, cookie)
|
||||
var ok = taskResultOk(res)
|
||||
return { name: "领取奖励", ok: !!ok, msg: resultMsg(res) || (ok ? "领取成功" : "领取失败"), path: "/argus/api/v3/checkin/receivegifts" }
|
||||
}
|
||||
function doAdvTask(cookie) {
|
||||
var main = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
|
||||
if (!taskResultOk(main)) return { name: "激励任务", ok: false, msg: resultMsg(main) || "获取任务失败", path: "/argus/api/v2/video/adv/mainPage" }
|
||||
var tasks = firstArray(nested(main, ["Data", "VideoRewardTab", "TaskList"]), nested(main, ["data", "VideoRewardTab", "TaskList"]), nested(main, ["Data", "TaskList"]), nested(main, ["data", "TaskList"]))
|
||||
var done = 0
|
||||
for (var i = 0; i < tasks.length; i++) {
|
||||
var t = tasks[i] || {}
|
||||
if (Number(t.IsFinished) === 1) continue
|
||||
var tid = t.TaskId || t.TaskID || t.taskId || ""
|
||||
if (!tid) continue
|
||||
var r = qdPost("/argus/api/v1/video/adv/finishWatch", makeVideoPayload(tid), cookie)
|
||||
if (taskResultOk(r)) done++
|
||||
else return { name: "激励任务", ok: false, msg: resultMsg(r) || ("任务 " + tid + " 失败"), path: "/argus/api/v1/video/adv/finishWatch" }
|
||||
}
|
||||
return { name: "激励任务", ok: true, msg: done ? ("完成 " + done + " 个视频任务") : "无待完成任务", path: "/argus/api/v2/video/adv/mainPage" }
|
||||
}
|
||||
function doDailyTask(cookie) {
|
||||
var list = qdGet("/argus/api/v3/checkin/packagelist", {}, cookie)
|
||||
if (!taskResultOk(list)) return { name: "每日任务", ok: false, msg: resultMsg(list) || "获取任务列表失败", path: "/argus/api/v3/checkin/packagelist" }
|
||||
var tasks = firstArray(nested(list, ["Data", "TaskList"]), nested(list, ["data", "TaskList"]), nested(list, ["Data", "PackageList"]), nested(list, ["data", "PackageList"]))
|
||||
var target = null
|
||||
for (var i = 0; i < tasks.length; i++) { var n = String(tasks[i].TaskName || tasks[i].Name || tasks[i].Title || ""); if (/每日|daily/i.test(n)) { target = tasks[i]; break } }
|
||||
if (!target && tasks.length) target = tasks[0]
|
||||
if (!target) return { name: "每日任务", ok: true, msg: "无每日任务", path: "/argus/api/v3/checkin/packagelist" }
|
||||
if (Number(target.IsFinished) === 1) return { name: "每日任务", ok: true, msg: "已完成", path: "/argus/api/v3/checkin/packagelist" }
|
||||
var count = Math.max(1, Math.min(3, Number(target.NeedWatchCount || target.Times || 1) || 1))
|
||||
var tid = target.TaskId || target.TaskID || target.taskId || ""
|
||||
var done = 0
|
||||
for (var j = 0; j < count; j++) { var r = qdPost("/argus/api/v1/video/adv/finishWatch", makeVideoPayload(tid), cookie); if (taskResultOk(r)) done++ }
|
||||
return { name: "每日任务", ok: done > 0, msg: done > 0 ? ("完成 " + done + " 次") : "任务未完成", path: "/argus/api/v3/checkin/packagelist" }
|
||||
}
|
||||
function doLotteryTask(cookie) {
|
||||
var detail = qdGet("/argus/api/v2/checkin/detail", {}, cookie)
|
||||
if (!taskResultOk(detail)) return { name: "每日抽奖", ok: false, msg: resultMsg(detail) || "获取抽奖信息失败", path: "/argus/api/v2/checkin/detail" }
|
||||
var data = detail.Data || detail.data || {}
|
||||
var times = Number(data.HasVideoUrge || 0) + Number(data.LotteryCount || data.LotteryChance || data.ChanceCount || 0)
|
||||
if (!times) return { name: "每日抽奖", ok: true, msg: "无可用抽奖次数", path: "/argus/api/v2/checkin/detail" }
|
||||
times = Math.min(times, 10)
|
||||
var okCount = 0
|
||||
for (var i = 0; i < times; i++) { var r = qdPost("/argus/api/v2/checkin/lottery", { GameId: "0", IsVideo: i < Number(data.HasVideoUrge || 0) ? "1" : "0" }, cookie); if (taskResultOk(r)) okCount++ }
|
||||
return { name: "每日抽奖", ok: okCount > 0, msg: "成功 " + okCount + "/" + times + " 次抽奖", path: "/argus/api/v2/checkin/lottery" }
|
||||
}
|
||||
function doWeeklyExchange(cookie) {
|
||||
var page = qdGet("/argus/api/v3/checkin/checkinexchangepage", {}, cookie)
|
||||
if (!taskResultOk(page)) return { name: "每周兑换", ok: false, msg: resultMsg(page) || "获取兑换页失败", path: "/argus/api/v3/checkin/checkinexchangepage" }
|
||||
var data = page.Data || page.data || {}
|
||||
var balance = Number(data.Balance || data.Score || 0)
|
||||
var goods = firstArray(data.GoodsList, data.GiftList, data.List, data.Items)
|
||||
var chosen = null
|
||||
for (var i = 0; i < goods.length; i++) { var price = Number(goods[i].NeedScore || goods[i].Price || goods[i].Score || 0); if (price > 0 && price <= balance && (!chosen || price > Number(chosen.NeedScore || chosen.Price || chosen.Score || 0))) chosen = goods[i] }
|
||||
if (!chosen) return { name: "每周兑换", ok: true, msg: "无可兑换商品或余额不足(" + balance + ")", path: "/argus/api/v3/checkin/checkinexchangepage" }
|
||||
var r = qdPost("/argus/api/v3/checkin/exchangegoods", { GoodsId: chosen.GoodsId || chosen.Id || chosen.GoodsID }, cookie)
|
||||
return { name: "每周兑换", ok: taskResultOk(r), msg: resultMsg(r) || (taskResultOk(r) ? "兑换成功" : "兑换失败"), path: "/argus/api/v3/checkin/exchangegoods" }
|
||||
}
|
||||
function doChapterCard(cookie) {
|
||||
var res = qdGet("/argus/api/v1/readtime/scoremall/chaptercardwithbook", {}, cookie)
|
||||
var ok = taskResultOk(res)
|
||||
var cards = firstArray(nested(res, ["Data", "Cards"]), nested(res, ["data", "Cards"]), nested(res, ["Data", "ChapterCards"]), nested(res, ["data", "ChapterCards"]))
|
||||
return { name: "章节卡片", ok: !!ok, msg: ok ? (cards.length ? ("章节卡 " + cards.length + " 张") : "暂无章节卡") : (resultMsg(res) || "查询失败"), path: "/argus/api/v1/readtime/scoremall/chaptercardwithbook" }
|
||||
}
|
||||
function messageTokenFromCookie(cookie) {
|
||||
var jar = parseCookieString(cookie)
|
||||
var uid = extractUid(cookie)
|
||||
var raw = uid ? String((BigInt(uid) * 4n & 0x7ffffffffffffffcn) ^ 0x113a4fen) : ""
|
||||
return raw || uid || jar.ywguid || ""
|
||||
}
|
||||
function doMessageBox(cookie) {
|
||||
var token = messageTokenFromCookie(cookie)
|
||||
if (!token) return { name: "大咖荐书", ok: true, msg: "缺少消息 token,已跳过", path: "https://magev6.if.qidian.com/argus/api/v2/message/pullmessage" }
|
||||
var res = qdGet("https://magev6.if.qidian.com/argus/api/v2/message/pullmessage", { token: token, type: "0", pg: "1", pz: "10" }, cookie)
|
||||
return { name: "大咖荐书", ok: taskResultOk(res), msg: taskResultOk(res) ? "消息检查完成" : (resultMsg(res) || "消息检查失败"), path: "https://magev6.if.qidian.com/argus/api/v2/message/pullmessage" }
|
||||
}
|
||||
function doExtraTask(task, cookie) {
|
||||
if (task.handler === "receiveGifts") return doReceiveGifts(cookie)
|
||||
if (task.handler === "adv") return doAdvTask(cookie)
|
||||
if (task.handler === "daily") return doDailyTask(cookie)
|
||||
if (task.handler === "lottery") return doLotteryTask(cookie)
|
||||
if (task.handler === "exchange") return doWeeklyExchange(cookie)
|
||||
if (task.handler === "chapterCard") return doChapterCard(cookie)
|
||||
if (task.handler === "messageBox") return doMessageBox(cookie)
|
||||
var data = task.body || task.params || {}
|
||||
var res = qidianRequest(task.path, task.method || "GET", data, cookie)
|
||||
var ok = taskResultOk(res)
|
||||
|
||||
Reference in New Issue
Block a user