fix(qdreader): treat risk-conf as verification block

This commit is contained in:
2026-07-02 14:32:09 +08:00
parent 012c3a9cb1
commit 7ef173c6c7
3 changed files with 138 additions and 30 deletions
+39 -12
View File
@@ -4,7 +4,7 @@
//[author: Hermes]
//[service: BOSS]
//[class: 工具类]
// [version: 2.15.6]
// [version: 2.15.7]
// [platform: web,qq,wx,tg,tb,fs,we]
// [public: false]
// [price: 0]
@@ -447,13 +447,27 @@ function resultOk(obj) {
if (String(status) === "401" || String(status) === "403") return false
return code === undefined || code === 0 || code === "0" || code === 200 || code === "200" || status === "ok" || status === "success"
}
function isLoginExpiredMsg(msg) {
msg = String(msg || "")
return /登录状态已失效|登录已失效|登录状态.*过期|登录.*过期|用户未登录|未登录|请登录|重新登录|Cookie.*失效|CK.*失效|cookie.*expired|login.*expired|not\s*login/i.test(msg)
}
function resultMsg(obj) {
obj = responseEnvelope(obj)
if (!obj) return ""
var status = obj.status || obj.Status || obj.statusCode || obj.StatusCode
if (String(status) === "401") return "登录状态已失效,请更新 Cookie"
if (String(status) === "403") return "接口鉴权失败,请更新 Cookie"
return obj.Message || obj.Msg || obj.message || obj.msg || obj.error || obj.toast || (obj.data && (obj.data.message || obj.data.msg || obj.data.error || obj.data.toast || obj.data.Message || obj.data.Msg)) || (obj.Data && (obj.Data.message || obj.Data.msg || obj.Data.error || obj.Data.toast || obj.Data.Message || obj.Data.Msg)) || ""
var msg = obj.Message || obj.Msg || obj.message || obj.msg || obj.error || obj.toast || (obj.data && (obj.data.message || obj.data.msg || obj.data.error || obj.data.toast || obj.data.Message || obj.data.Msg)) || (obj.Data && (obj.Data.message || obj.Data.msg || obj.Data.error || obj.Data.toast || obj.Data.Message || obj.Data.Msg)) || ""
if (isLoginExpiredMsg(msg)) return "登录状态已失效,请更新 Cookie"
return msg
}
function isCookieExpiredResult(obj) {
var env = responseEnvelope(obj)
if (!env) return false
var status = env.status || env.Status || env.statusCode || env.StatusCode
if (String(status) === "401") return true
var rawMsg = env.Message || env.Msg || env.message || env.msg || env.error || env.toast || (env.data && (env.data.message || env.data.msg || env.data.error || env.data.toast || env.data.Message || env.data.Msg)) || (env.Data && (env.Data.message || env.Data.msg || env.Data.error || env.Data.toast || env.Data.Message || env.Data.Msg)) || ""
return isLoginExpiredMsg(rawMsg)
}
function successLikeMsg(msg) {
msg = String(msg || "")
@@ -708,12 +722,18 @@ function taskRunCount(task, def) {
if (n > 10) n = 10
return n
}
function taskAccepted(res) { return taskResultOk(res) || Number(resultCode(res)) === 9 }
function taskAccepted(res) { return (taskResultOk(res) || Number(resultCode(res)) === 9) && !riskConf(res) }
function riskConf(res) {
res = responseEnvelope(res)
var data = res && (res.Data || res.data || res.ResultData || res.resultData)
return data && (data.RiskConf || data.riskConf || data.Risk || data.risk)
}
function riskBlockedMsg(res) {
var rc = riskConf(res)
if (!rc) return ""
var url = rc.CaptchaURL || rc.captchaUrl || rc.Url || rc.url || ""
return url ? "触发风控验证,任务未确认完成" : "触发风控验证,任务未确认完成"
}
function finishVideoTask(taskOrId, cookie, repeat) {
var tid = typeof taskOrId === "object" ? taskIdOf(taskOrId || {}) : taskOrId
var n = repeat || (typeof taskOrId === "object" ? taskRunCount(taskOrId, 1) : 1)
@@ -758,13 +778,13 @@ function doAdvTask(cookie) {
var fr = finishVideoTask(tid, cookie, 1)
submittedCount += fr.ok
if (riskConf(fr.last)) riskSubmitted = true
if (fr.ok < fr.total) return { name: "激励任务", ok: false, msg: resultMsg(fr.last) || ("第 " + (i + 1) + " 个任务失败"), path: "/argus/api/v1/video/adv/finishWatch" }
if (fr.ok < fr.total) return { name: "激励任务", ok: false, msg: riskBlockedMsg(fr.last) || resultMsg(fr.last) || ("第 " + (i + 1) + " 个任务失败"), path: "/argus/api/v1/video/adv/finishWatch" }
}
var verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
var after = advTaskList(verify)
var finished = !!(after && after.length && after.every(function (t) { return taskFinished(t) }))
if (finished) return { name: "激励任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" }
if (submittedCount > 0 && riskSubmitted) return { name: "激励任务", ok: true, msg: "已提交,状态待刷新", path: "/argus/api/v2/video/adv/mainPage" }
if (submittedCount > 0 && riskSubmitted) return { name: "激励任务", ok: false, msg: "触发风控验证,任务未确认完成", path: "/argus/api/v2/video/adv/mainPage" }
return { name: "激励任务", ok: false, msg: submittedCount ? "部分任务未完成" : "未找到可提交任务", path: "/argus/api/v2/video/adv/mainPage" }
}
function taskReceived(task) {
@@ -781,7 +801,7 @@ function doDailyTask(cookie) {
var pr = finishVideoTask(taskIdOf(pre), cookie, 1)
done += pr.ok
if (riskConf(pr.last)) riskSubmitted = true
if (pr.ok < pr.total) return { name: "每日任务", ok: false, msg: resultMsg(pr.last) || "惊喜福利任务失败", path: "/argus/api/v1/video/adv/finishWatch" }
if (pr.ok < pr.total) return { name: "每日任务", ok: false, msg: riskBlockedMsg(pr.last) || resultMsg(pr.last) || "惊喜福利任务失败", path: "/argus/api/v1/video/adv/finishWatch" }
}
var tasks = dailyTaskList(main)
if (!tasks.length) return { name: "每日任务", ok: false, msg: "任务列表为空", path: "/argus/api/v2/video/adv/mainPage" }
@@ -796,7 +816,7 @@ function doDailyTask(cookie) {
var ar = finishVideoTask(taskIdOf(oneAd), cookie, 1)
done += ar.ok
if (riskConf(ar.last)) riskSubmitted = true
if (ar.ok < ar.total) return { name: "每日任务", ok: false, msg: resultMsg(ar.last) || "完成1个广告任务失败", path: "/argus/api/v1/video/adv/finishWatch" }
if (ar.ok < ar.total) return { name: "每日任务", ok: false, msg: riskBlockedMsg(ar.last) || resultMsg(ar.last) || "完成1个广告任务失败", path: "/argus/api/v1/video/adv/finishWatch" }
}
if (!target) return { name: "每日任务", ok: false, msg: "未找到每日任务任务", path: "/argus/api/v2/video/adv/mainPage" }
if (taskReceived(target)) return { name: "每日任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" }
@@ -805,13 +825,13 @@ function doDailyTask(cookie) {
var tr = finishVideoTask(tid, cookie, 3)
done += tr.ok
if (riskConf(tr.last)) riskSubmitted = true
if (tr.ok < tr.total) return { name: "每日任务", ok: false, msg: resultMsg(tr.last) || "每日任务广告失败", path: "/argus/api/v1/video/adv/finishWatch" }
if (tr.ok < tr.total) return { name: "每日任务", ok: false, msg: riskBlockedMsg(tr.last) || resultMsg(tr.last) || "每日任务广告失败", path: "/argus/api/v1/video/adv/finishWatch" }
var verify = qdGet("/argus/api/v2/video/adv/mainPage", {}, cookie)
var after = dailyTaskList(verify)
var finished = false
for (var v = 0; v < after.length; v++) if (taskTitle(after[v]) === "完成3个广告任务得奖励" && taskReceived(after[v])) { finished = true; break }
if (finished) return { name: "每日任务", ok: true, msg: "任务已完成", path: "/argus/api/v2/video/adv/mainPage" }
if (done > 0 && riskSubmitted) return { name: "每日任务", ok: true, msg: "已提交,状态待刷新", path: "/argus/api/v2/video/adv/mainPage" }
if (done > 0 && riskSubmitted) return { name: "每日任务", ok: false, msg: "触发风控验证,任务未确认完成", path: "/argus/api/v2/video/adv/mainPage" }
return { name: "每日任务", ok: false, msg: "任务未完成", path: "/argus/api/v2/video/adv/mainPage" }
}
function doLotteryTask(cookie) {
@@ -907,9 +927,9 @@ function doMessageBox(cookie) {
var bookId = data.BookId || ""
if (data.Status !== undefined && Number(data.Status) !== 1) continue
if (chance <= 0 && bookStatus !== 0 && bookStatus !== 1 && bookStatus !== 2) continue
if (chance > 0) { var cb = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "1" }, cookie); if (taskResultOk(cb) || String(resultCode(cb)) === "0") handled++; continue }
if (bookStatus === 0 || bookStatus === 1) { if (!bookId) continue; var add = qdPost("/argus/api/v1/interaction/rewardaddshelf", { orderId: orderId, bookId: bookId }, cookie); if (taskResultOk(add) || String(resultCode(add)) === "0") handled++; continue }
if (bookStatus === 2) { var rc = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "1" }, cookie); if (!taskResultOk(rc) && String(resultCode(rc)) !== "0") continue; var r2 = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "0" }, cookie); if (taskResultOk(r2) || String(resultCode(r2)) === "0") handled++ }
if (chance > 0) { var cb = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "1" }, cookie); if (!riskConf(cb) && (taskResultOk(cb) || String(resultCode(cb)) === "0")) handled++; continue }
if (bookStatus === 0 || bookStatus === 1) { if (!bookId) continue; var add = qdPost("/argus/api/v1/interaction/rewardaddshelf", { orderId: orderId, bookId: bookId }, cookie); if (!riskConf(add) && (taskResultOk(add) || String(resultCode(add)) === "0")) handled++; continue }
if (bookStatus === 2) { var rc = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "1" }, cookie); if (riskConf(rc) || (!taskResultOk(rc) && String(resultCode(rc)) !== "0")) continue; var r2 = qdPost("/argus/api/v1/interaction/rewardcallback", { orderId: orderId, checkRisk: "0" }, cookie); if (!riskConf(r2) && (taskResultOk(r2) || String(resultCode(r2)) === "0")) handled++ }
}
}
return { name: "大咖荐书", ok: true, msg: handled ? ("成功处理 " + handled + " 个荐书") : "无待处理荐书", path: "https://magev6.if.qidian.com/argus/api/v2/message/pullmessage" }
@@ -932,6 +952,13 @@ function doTaskChain(uid, cookie, source, runId) {
var startedAt = nowIso()
var details = []
var checkin = qidianRequest(CHECKIN_PATH, "POST", {}, cookie)
if (isCookieExpiredResult(checkin)) {
var expiredMsg = resultMsg(checkin) || "登录状态已失效,请更新 Cookie"
var expiredDetail = { name: "签到结果", ok: false, msg: expiredMsg, path: CHECKIN_PATH, cookieExpired: true }
var expiredResult = { uid: String(uid), ok: false, msg: expiredMsg, time: nowIso(), startedAt: startedAt, source: source || "manual", runId: runId || "", tasks: [expiredDetail], cookieExpired: true }
setLastResult(uid, expiredResult)
return { uid: uid, ok: false, msg: expiredMsg, raw: checkin, log: expiredResult, cookieExpired: true }
}
var ok = taskResultOk(checkin)
var msg = resultMsg(checkin) || (ok ? "签到请求成功" : ("签到失败" + (resultCode(checkin) !== undefined ? " code=" + resultCode(checkin) : "")))
details.push({ name: "签到结果", ok: !!ok, msg: String(msg || ""), path: CHECKIN_PATH })