wujinjun / UnoAnalyzer 优诺 登录状态保存

Published:

Version: 2.0+59e8e39 updated

Summary: 自动将会话存储(临时)保存到本地存储(持久),实现优诺多窗口登录状态同步,不再需要反复登录。支持对带前缀的 localStorage 键提供保护(防覆盖、防误删、防全量clear清除)。

License: MIT

Antifeature: unspecified

UnoAnalyzer(优诺)登录状态保存 — Tampermonkey 脚本

一个用于持久化 UnoAnalyzer 登录状态的 Tampermonkey 用户脚本。脚本自动维护 sessionStorage 与 localStorage 的同步,保持网站的登录状态,切换窗口或关闭浏览器不再丢失登录token。

❓ 为什么存在此脚本

  • 😠 登录过程繁琐
    • 🌿 正常网站登录页面: 同时显示 用户名/邮箱 + 密码 输入框,点击任意一个立即显示浏览器内置密码提示,填充密码,点击登录 -- 3步完成 Easy Piecy!
    • 💀 UnoAnalyzer奇葩设计: 邮箱输入 (-> 浏览器自动填充) -> 提交 -> 密码输入 (-> 浏览器自动填充) -> 提交 -- 6步完成 2x or more 时间消耗
    • 🚀 自动登录脚本 (this): 几乎瞬间完成 -- You're all set.
  • ⏰ 频繁登录要求
    • 🌿 正常网站: 登录状态保存到Cookie,一段时间内有效,到期自动刷新 -- 同一浏览器任一窗口打开,你已经登录
    • 💀 UnoAnalyzer: 仅存储在会话存储,关闭浏览器或其他窗口打开 失去登录 -- 用户体验极差
    • 🚀 此脚本: 不再丢失登录 -- You're all set.

📢 最近通知

  • 🧱 Greasyfork (greasyfork.org) 从2025年开始在墙内无法访问 (参见 Greatfire Test),开启***、旧版本、装满扩展/插件的浏览器可访问性也较差 (例如: "Cloudflare Challenge"小方框无限循环 🔄),因此所有脚本将会同时提供 🕊️ OpenUserJS 和 Github 平台的下载方式。

⚙️ 主要功能

  • 在页面加载前执行(@run-at document-start),尽量在网站初始化前恢复登录状态。
  • 自动扫描 localStorage 中以 fromSessionStorage_ 前缀开头的内容,并在 sessionStorage 缺失时恢复到当前会话。
  • 劫持 sessionStorage.setItem()、removeItem()、clear()
    • 任何 sessionStorage 数据写入或删除都会同步到 localStorage。
    • 拦截 localStorage 中存储 sessionStorage 的破坏,防止恶意破坏用户体验。
  • 自动维护 sessionStorage <-> localStorage 的一致性,避免切换窗口、重启浏览器或重新打开标签页后丢失登录信息。
  • 仅同步带前缀的键,避免误删其他网站数据;clear() 只会清理脚本管理的 localStorage 项,而不是整个站点的存储。
  • 适合 UnoAnalyzer 这类“登录状态只保存在 sessionStorage”的站点,在不修改网站源码的前提下延长登录持续时间。

🛠️ 安装

  1. 安装 Tampermonkey(或其他兼容脚本管理器)。
  2. 从 OpenUserJS 或 GreasyFork(📡🧗‍♂️🧱 请翻墙) 安装此脚本
  3. 如果你希望自定义同步前缀,可直接修改脚本顶部的 LOCALSTORAGE_PREFIX 常量。
  4. 刷新 UnoAnalyzer 页面,脚本会在启动时自动恢复登录状态,并随时监听和同步更改到 localStorage

🔧 配置

  • 默认无需调整。
  • 所有参数:
    • const LOCALSTORAGE_PREFIX = 'fromSessionStorage_'
      • 作用:用于在 localStorage 中保存来自 sessionStorage 的镜像数据,避免与网站自身其他存储项冲突。
      • 说明:如果你修改了这个前缀,请手动考虑旧数据迁移;脚本不会自动把旧前缀中的数据迁移到新前缀。
    • const INITIAL_SESSIONSTORAGE_TO_LOCALSTORAGE_DELAY = 0
      • 页面开始加载,初始同步到 localStorage 的延迟 (毫秒)
      • 默认0 (不延迟,立即处理)
      • 如果登录状态没有成功保存,尝试增加延迟

📚 运行原理与实现细节

  • initRestore():
    • 遍历 localStorage,定位所有以 LOCALSTORAGE_PREFIX 开头的键。
    • 对于每个镜像键,检查对应的 sessionStorage 键是否存在;如果不存在,就将本地镜像恢复回会话存储。
  • hookLocalStorage():
    • 覆盖 Storage.prototype.setItem、removeItem、clear。
    • this === window.localStorage 判断正在操作 localStorage ,执行操作时智能保护脚本前缀相关的 localStorage 键。
    • setItem:写入 localStorage 时,如果操作了脚本前缀相关的 localStorage 键,立即弹出alert警告,控制台输出错误,终止执行,不进行覆盖。
    • removeItem:删除 localStorage 项时,如果操作了脚本前缀相关的 localStorage 键,静默过滤,不予删除
    • clear:清空 localStorage 时,受保护的前缀项自动恢复。
  • hookSessionStorage():
    • 覆盖 Storage.prototype.setItem、removeItem、clear。
    • 只有当 this === window.sessionStorage 时才进行同步,避免误伤其他 storage 实例。
    • setItem:写入 sessionStorage 时,同步写入 localStorage。
    • removeItem:删除 sessionStorage 项时,同步删除对应的本地镜像。
    • clear:清空 sessionStorage 时只清理脚本前缀相关的 localStorage 键,保留其他站点数据。
    • 由本脚本执行的操作自动绕过 hookLocalStorage() 执行的保护策略,避免冲突。
  • 初始同步:
    • 脚本启动后再补一次扫描,若 sessionStorage 中存在数据但对应 localStorage 镜像不存在,也会自动补齐,避免首次安装后出现“已有登录但未映射”的状态。

这是一种“镜像式同步”方案,核心目标不是直接改写网站代码,而是让浏览器的 sessionStorage 和本地 persistent storage 保持一致,从而让跨窗口/重开页面时保留登录上下文。

🐞 调试

  • 打开浏览器开发者工具 -> Console,查找脚本前缀输出。
  • 脚本内部使用了 console.log / console.warn / console.error / console.debug,输出格式为 [脚本名] ...。
  • 常见检查点:
    • localStorage 是否存在 fromSessionStorage_ 开头的键。
    • sessionStorage 是否已被恢复或写入。
    • 页面是否在 document-start 前执行失败。
    • 如果网站改版,原始 session key 可能发生变化,导致同步对象不再命中。
    • localStorage 保护是否生效:
      • 网站/其他脚本尝试覆盖带前缀的键,控制台是否输出error,浏览器是否显示alert
      • 网站/其他脚本尝试删除带前缀的键,控制台是否输出error,是否静默忽略删除操作
      • 网站/其他脚本尝试清除 localStorage,受保护的前缀项是否自动恢复
  • 建议在脚本启用状态下,登录一次后刷新页面,观察 localStorage 和 sessionStorage 中对应键是否保持一致。

🤔 常见问题 (FAQ)

  • Q: 脚本为什么不生效?
    • A: 先确认 Tampermonkey 已启用,并且当前页面 URL 匹配 https://*.unoanalyzer.com/* 或 https://unoanalyzer.com/*。重新刷新页面后检查控制台是否有脚本日志。
  • Q: 登录状态还是会丢失?
    • A: 可能原因包括:
      • 网站改版,登录数据改到了其他 Storage / IndexedDB / Cache 中;
      • Token 已过期;
      • 你手动清理过 localStorage 中的 fromSessionStorage_ 前缀项;
      • 网站登出逻辑在代码中直接清空了 sessionStorage,此时脚本也会同步清理本地镜像。
  • Q: 会不会误删其他页面数据?
    • A: 不会。脚本只处理前缀为 LOCALSTORAGE_PREFIX 的键,并且只在 sessionStorage 触发相关操作时才删除/清理对应镜像,不会覆盖其他 website 或 app 使用的 localStorage 项。
  • Q: 如果我更换浏览器或清理了浏览器数据怎么办?
    • A: 这类行为通常会清空 localStorage,脚本无法保留历史登录状态。脚本的目标是“在同一浏览器实例中保留登录”,而不是作为云同步或跨设备登录方案。
  • Q: 这个方案能否解决所有登录问题?
    • A: 它适用于“登录数据使用 sessionStorage 存储”的站点,前提是数据存储位置和 key 结构保持稳定。若网站后续切换到其他持久化方式,这个脚本需要相应调整。

📜 更新日志

  • 1.0
    • 全网首发: 两大平台 (OpenUserJS 和 GreasyFork) 无相关搜索结果
    • 初版发布;实现 sessionStorage 与 localStorage 的前缀镜像同步;
    • 页面启动时自动恢复缺失的登录状态;
    • 拦截 setItem/removeItem/clear,保证后续登录变更持续同步;
    • 增加脚本日志,用于排查状态同步问题。
  • 2.0
    • localStorage 劫持,防止网站直接清空或覆盖 localStorage 导致登录状态丢失
    • 初始同步到 localStorage: 已添加延时,避免开始时碰撞
    • 部分日志 (例如 *Storage 变更) 等级调为 debug,以减少控制台输出干扰和防止登录信息泄露。如需查看,在控制台日志等级启用 "Verbose" 或 "Debug" 即可

🔑 许可

  • MIT

:param AFF

💡 多站点广告拦截和体验优化: Adguard规则 (兼容Adguard浏览器扩展和APP | 可兼容AdBlock Plus | 持续更新)

✅ XJTLU自动登录系列:

  1. 西浦自动登录: 自动登录LearningMall Core、UIM、sso、mail、eBridge、IDP
  2. XJTLU box 自动登录: 自动登录box,并自动勾选 7天内保持登录
  3. XJTLU UIM 自动登录 (请求用户名+密码+OTP): UIM自动登录(自动完成二次验证)
  4. XJTLU xpcyjgy 自动登录: XJTLU(TC)线上自助服务自动登录

😊 XJTLU体验提升 (QoL):

  1. XJTLU AMS Sign-in Code 优化
  2. XJTLU utalk 不要欢迎视频
  3. XJTLU utalk 调整 (专为低性能设备优化)
  4. XJTLU eBridge 登录过期自动重新登录
  5. XJTLU eBridge 考试信息提示弹窗拦截

其他自动登录系列:

  1. UnoAnalyzer 优诺 自动登录: 如题

其他体验提升:

  1. UnoAnalyzer 优诺 登录状态保存: 持久化优诺登录状态,新窗口打开优诺无需重复登录,关闭浏览器不再丢失登录状态

Rating: 0