fix(qdreader): archive daily sign logs at midnight
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
//[author: Hermes]
|
||||
//[service: BOSS]
|
||||
//[class: 工具类]
|
||||
//[version: 2.4.2]
|
||||
//[version: 2.5.0]
|
||||
//[platform: web,qq,wx,tg,tb,fs,we]
|
||||
//[public: false]
|
||||
//[price: 0]
|
||||
@@ -14,7 +14,7 @@
|
||||
//[rule: ^qdreader(.*)$]
|
||||
//[admin: true]
|
||||
//[priority: 600]
|
||||
//[cron: 15 7 * * *]
|
||||
//[cron: 0 0 * * *]
|
||||
|
||||
|
||||
var BUCKET = "hermes_qidian"
|
||||
@@ -26,6 +26,7 @@ var RETRY_KEY = "qdreader_retry_count"
|
||||
var CRON_SILENT_KEY = "qdreader_cron_silent"
|
||||
var LAST_RESULT_KEY = "qdreader_last_result_json"
|
||||
var LAST_RUN_KEY = "qdreader_last_run_json"
|
||||
var ARCHIVE_KEY = "qdreader_archive_json"
|
||||
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"
|
||||
@@ -259,7 +260,7 @@ function contentText() {
|
||||
}
|
||||
function usage() {
|
||||
return [
|
||||
"启点读书签到插件 v2.4.2",
|
||||
"启点读书签到插件 v2.5.0",
|
||||
"【一级菜单】",
|
||||
"账号管理:启点账号",
|
||||
"执行查询:启点查询",
|
||||
@@ -269,7 +270,7 @@ function usage() {
|
||||
"指定签到:启点签到 <uid>",
|
||||
"【配置】",
|
||||
"签名网关:Autman 参数 hermes_qidian.qdreader_sign_api,默认 " + DEFAULT_SIGN_API,
|
||||
"定时:每日 07:15 自动执行;QX 只负责抓 cookie。"
|
||||
"定时:每日 00:00 自动执行、归档上一日日志并清空当日日志;QX 只负责抓 cookie。"
|
||||
].join("\n")
|
||||
}
|
||||
function stripCommand(text) {
|
||||
@@ -405,8 +406,50 @@ function getLastResults() {
|
||||
}
|
||||
function setLastRunLog(log) { cfgSet(LAST_RUN_KEY, JSON.stringify(log || {})) }
|
||||
function getLastRunLog() { return safeJsonParse(cfgGet(LAST_RUN_KEY, "{}"), {}) || {} }
|
||||
function getArchiveStore() { return safeJsonParse(cfgGet(ARCHIVE_KEY, "{}"), {}) || {} }
|
||||
function setArchiveStore(obj) { cfgSet(ARCHIVE_KEY, JSON.stringify(obj || {})) }
|
||||
function localDateKey(iso) {
|
||||
var d = iso ? new Date(iso) : new Date()
|
||||
if (!d || isNaN(d.getTime())) d = new Date()
|
||||
var y = d.getFullYear()
|
||||
var m = String(d.getMonth() + 1); if (m.length < 2) m = "0" + m
|
||||
var day = String(d.getDate()); if (day.length < 2) day = "0" + day
|
||||
return y + "-" + m + "-" + day
|
||||
}
|
||||
function archiveRunLog(reason) {
|
||||
var run = getLastRunLog()
|
||||
var archive = getArchiveStore()
|
||||
var archived = false
|
||||
var key = ""
|
||||
if (run && run.finishedAt && run.total !== undefined) {
|
||||
key = localDateKey(run.finishedAt)
|
||||
archive[key] = run
|
||||
archive[key].archivedAt = nowIso()
|
||||
archive[key].archiveReason = reason || "daily-rollover"
|
||||
archived = true
|
||||
}
|
||||
setArchiveStore(archive)
|
||||
cfgSet(LAST_RESULT_KEY, "{}")
|
||||
cfgSet(LAST_RUN_KEY, "{}")
|
||||
return { archived: archived, key: key, archive: archive, run: run || {} }
|
||||
}
|
||||
function latestArchiveForVisible(uids) {
|
||||
var archive = getArchiveStore()
|
||||
var keys = []
|
||||
for (var k in archive) if (archive.hasOwnProperty(k)) keys.push(k)
|
||||
keys.sort()
|
||||
for (var i = keys.length - 1; i >= 0; i--) {
|
||||
var log = archive[keys[i]] || {}
|
||||
var items = log.items || []
|
||||
var map = {}
|
||||
for (var j = 0; j < items.length; j++) map[String(items[j].uid)] = items[j]
|
||||
if (!uids || !uids.length) return { key: keys[i], log: log, itemMap: map }
|
||||
for (var u = 0; u < uids.length; u++) if (map[String(uids[u])]) return { key: keys[i], log: log, itemMap: map }
|
||||
}
|
||||
return null
|
||||
}
|
||||
function sourceName(source) {
|
||||
if (source === "cron") return "定时任务"
|
||||
if (source === "cron") return "定时任务/零点任务"
|
||||
if (source === "menu") return "菜单立即执行"
|
||||
if (source === "manual") return "手动签到"
|
||||
return source || "未知"
|
||||
@@ -467,6 +510,12 @@ function formatStatusLine(uid, last, remarks) {
|
||||
if (!r) return "- " + name + ":暂无执行记录"
|
||||
return "- " + name + ":" + (r.ok ? "✅ " : "❌ ") + (r.msg || "无结果") + (r.time ? " @ " + r.time : "")
|
||||
}
|
||||
function formatArchiveStatusLine(uid, archiveInfo, remarks) {
|
||||
var name = maskUid(uid) + (remarks && remarks[uid] ? "(" + remarks[uid] + ")" : "")
|
||||
var r = archiveInfo && archiveInfo.itemMap ? archiveInfo.itemMap[String(uid)] : null
|
||||
if (!r) return "- " + name + ":归档中暂无该账号记录"
|
||||
return "- " + name + ":" + (r.ok ? "✅ " : "❌ ") + (r.msg || "无结果") + (r.time ? " @ " + r.time : "")
|
||||
}
|
||||
function queryStatus(targetUid) {
|
||||
var store = getStore()
|
||||
var bind = getBindStore()
|
||||
@@ -480,9 +529,19 @@ function queryStatus(targetUid) {
|
||||
}
|
||||
if (!uids.length) return "当前用户还没有保存启点读书CK"
|
||||
var title = targetUid ? "启点单账号最近签到记录:" : "启点最近签到记录:"
|
||||
var archiveInfo = latestArchiveForVisible(uids)
|
||||
var useArchive = archiveInfo && (!run || !run.finishedAt)
|
||||
if (useArchive) title = targetUid ? "启点单账号最近归档签到记录:" : "启点最近归档签到记录:"
|
||||
var lines = [title]
|
||||
if (!targetUid && run && run.finishedAt) lines.push("最近批次:" + sourceName(run.source) + " @ " + run.finishedAt + ";成功 " + (run.okCount || 0) + " / 失败 " + (run.failCount || 0) + " / 总计 " + (run.total || 0))
|
||||
for (var i = 0; i < uids.length; i++) lines.push(formatStatusLine(uids[i], last, remarks))
|
||||
if (useArchive) {
|
||||
var arun = archiveInfo.log || {}
|
||||
lines.push("最近归档:" + archiveInfo.key + ";" + sourceName(arun.source) + " @ " + (arun.finishedAt || "未知时间") + ";成功 " + (arun.okCount || 0) + " / 失败 " + (arun.failCount || 0) + " / 总计 " + (arun.total || 0))
|
||||
for (var ai = 0; ai < uids.length; ai++) lines.push(formatArchiveStatusLine(uids[ai], archiveInfo, remarks))
|
||||
} else {
|
||||
if (!targetUid && run && run.finishedAt) lines.push("最近批次:" + sourceName(run.source) + " @ " + run.finishedAt + ";成功 " + (run.okCount || 0) + " / 失败 " + (run.failCount || 0) + " / 总计 " + (run.total || 0))
|
||||
for (var i = 0; i < uids.length; i++) lines.push(formatStatusLine(uids[i], last, remarks))
|
||||
if (archiveInfo) lines.push("最近归档:" + archiveInfo.key + "(发送启点查询可按归档判断昨日签到)")
|
||||
}
|
||||
return lines.join("\n")
|
||||
}
|
||||
|
||||
@@ -709,6 +768,7 @@ function main() {
|
||||
var store = getStore()
|
||||
var bind = getBindStore()
|
||||
if (cmd === "sign" || /^(签到|sign|run)(?:\s+|$)/i.test(arg)) {
|
||||
if (isCronRun) archiveRunLog("midnight-before-sign")
|
||||
var target = trim(arg.replace(/^(签到|sign|run)\s*/i, ""))
|
||||
var out = signAll(target, isCronRun, isCronRun ? "cron" : "manual")
|
||||
if (!(isCronRun && getBool(CRON_SILENT_KEY, false) && out === "还没有保存启点读书CK")) reply(out)
|
||||
|
||||
Reference in New Issue
Block a user