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)

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