Skip to content

[Enhancement] 统一通知与统计的日期口径,并在签到失败时提示系统时钟偏差 #466

Description

@qiyinxi

两项低优先级改进,都不影响功能正确性,只影响用户能否看懂发生了什么。


1. 通知标题与统计时间用本地日,历史归档用东 4 区日,两者会差一天

各脚本的通知标题和统计 end_time 用本地日期:

# app/task/*/manager.py
title = f"{datetime.now().strftime('%m-%d')} |{success_symbol}| ..."

出现位置:MAA/manager.pyM9A/manager.py(2 处)、MaaEnd/manager.pygeneral/manager.pySRC/manager.pyOkNte/manager.pyOkww/manager.pyHSR/manager.py

而历史记录目录用东 4 区日期。两者在分歧窗口内差一天:

run = datetime(2026, 8, 31, 22, 30, tzinfo=ZoneInfo("Europe/Berlin"))
print(run.strftime("%m-%d"))                       # 08-31   <- 通知标题
print(run.astimezone(UTC4).strftime("%Y-%m-%d"))   # 2026-09-01  <- 历史归档目录

UTC+2 用户每天 22:00–24:00 跑的任务都会这样:通知说的是昨天,历史归到明天,对账时对不上。UTC+8 用户的对应窗口是本地 00:00–04:00。

Webhook 模板变量 {date} / {datetime} / {time} 同理(app/services/notification.pytemplate_vars)。

建议:通知与统计的日期统一走 UTC4;或在标题里同时给出两个口径,例如 09-01(本地 08-31)


2. 签到失败时无法区分「凭据失效」和「系统时钟不准」

森空岛签名用 epoch 毫秒,与时区无关,但依赖系统时钟绝对准确

app/tools/skland.py:340, 342   int(time.time() * 1000)
app/tools/skland.py:517        str(int(time.time()))
app/tools/skland.py:629        str(int(time.time() * 1000 - 2000))[:-3]

机器时钟偏差超出服务端容忍时签名会被拒绝,但错误信息呈现为凭据类失败,用户会反复重新登录、重新填 token,始终不知道真正原因。

海外机器(尤其是长期休眠的笔记本、虚拟机、未正确配置 NTP 的系统)时钟漂移概率高于国内。

建议:签到失败时附带一次时钟自检——与响应头的 Date 或任一可信时间源比对,偏差超过阈值就明确提示「系统时钟偏差 N 秒,请先校时」,而不是笼统报凭据错误。

环境

  • 上游 dev @ 9e6b0d0a(2026-08-30)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions