Skip to content

Releases: kele551/ms-wallpaper-assistant

v2.4.2(2026-10-26)

Choose a tag to compare

@kele551 kele551 released this 26 Oct 07:21

v2.4.2(2026-10-26)

这一版把自 v2.4.1 以来攒在本机的改动真正对外放出去(此前 version.json 停在 2.4.1,已装 2.4.1 的用户在升级循环里永远得到「已是最新」,这些修复一个都收不到)。

  • 修「点图标打不开控制台」:面板端口是系统随机发的,能发到 6666 这类 Firefox/Chromium 都禁行的端口 —— 页面其实活着,但浏览器直接 ERR_UNSAFE_PORT。现在按两家浏览器禁行表的并集绕开,并当场试开确认端口可用才算数。
  • 控制台收成「当前 / 图库 / 设置」三块:图库缩略图走索引 + 304 缓存;地址栏不再带 ?t= 令牌;日志框等三处排版收边。
  • 主题与配色搬进配置文件:面板端口是随机的,以前存在浏览器 localStorage 里等于换次开机就丢。
  • 新增「本地文件夹」图源:把自己文件夹里的图插进轮换池,可当图库也能点着换。
  • 必应模式收口:锁定当天一图、时间档位不再能点出矛盾状态;「最近换过」只列必应图库;顶栏改说「明天开机后换新图」;新增 /api/now 轻量探测,面板 15 秒对一次当前壁纸;热更后旧面板服务自动让位。
  • 图库上限真的执行(以前超限了只是说说),新图插队进前 1/3;打开控制台时后台没在跑就当场拉起。
  • 成品名定死 桌面壁纸.exe;GitHub Actions 产物名跟上改名(原来那一步必 throw,CI 恒红)。
  • 升级源改为 GitHub 优先、GitCode 回落。

已装用户不需要动手:下次程序自检更新时会自动拿到新版脚本并覆盖主程序。手动下载请取下面的 .exe,或取 MSWallpaperAssistant-v2.4.2.zip(纯 ASCII 文件名,国内镜像下载更稳)。

v2.4.1

Choose a tag to compare

@kele551 kele551 released this 23 Oct 09:10

v2.4.1 — 2026-10-23

用户报「手动挑了一张壁纸,到 30 分钟不切换下一张」。查下来轮换逻辑本身没问题,
是后台守护进程早就不在了 —— 开机自启只在登录时跑一次,之后没有任何东西能把它拉回来,
用户看到的却是「到点不换,那个『下次自动换』的时间永远不兑现」。

后台没在跑就永远不换 → 打开控制台自动拉起来

  • menu.ps1:打开控制台时检查「开机自动换是开着的、后台却没在跑」→ 当场把后台拉起来并写日志
    (控制台: 后台没在跑, 已自动拉起)。开机自动换是关着的就什么都不做(尊重用户选择)。
  • 为什么不在别处兜:只有用户打开程序的那一刻,程序才有机会执行代码;后台进程自己死了,
    能发现它的只有下一次"有人来找它"。所以把这件事放在最常发生的那一步(双击图标)。

后台不再"一声不响地退出"

  • launcher.py 的守护进程主循环整轮包了兜底:一轮里出任何意外只丢这一轮(睡 1 分钟接着跑),
    不再把整个后台带走;以前一个没预料到的异常 = 壁纸从此不再自动换。
  • 后台启动 / 收到停止信号 / 这一轮出错现在都写进 wallpaper.log。
    以前后台被 --stop 停掉时一行日志都没有,事后分不清"它自己崩了"还是"有人叫它停"——
    这次排查就卡在这里。

轮换队列:必应 / 聚焦按张数比例交错(2026-10-23 用户要求「改」)

  • 起因:用户问「现在必应和聚焦的新图片比较多,是否轮换切换?」。查下来两边确实在同一条队列里,
    但排序是全局"最旧优先"——1109 张 2020–2023 的必应老图全排前面,205 张 2026 年的聚焦新图
    要等约 23 天才轮到。
  • 现在:每个来源内部仍按原来的"最旧优先",来源之间按各自张数比例均匀穿插
    (1109 : 205 ≈ 每 6 张里 1 张聚焦),算法是"平滑加权轮转",不会成段扎堆。
  • 效果:实测队列前 40 张是 必必必聚必必必必必聚…,第一张 2026 聚焦图从第 1109 位提到第 4 位
    (约 1.5 小时后就能看到);两边的完整轮回时长也拉平到约 3 周。

四个实打实的毛病(用户 2026-10-23 要求「修正」)

  • 「必应库上限」以前根本没执行:设 200 张、实际长到 1110 张(4.6 GB),因为旧逻辑只淘汰
    「看过的」图,而绝大多数图一辈子没被轮到过。现在上限就是上限:先淘汰看过的最老的,
    不够再按文件名日期从早到晚补;只保护「当前壁纸 / 收藏 / 做了记号的外来图」,
    每轮最多搬 250 张,搬的是回收站(可还原)。
  • 新下载的图以前等于白下:队列只在「空了 / 重洗」时才重建,新图要等下次重洗才轮得到。
    现在新图(含「补几张新图」「补齐某月」下的、后台补货)插进当前队列前 1/3——
    既不下一张就是它,也不用等一整天。
  • 每次点图标就多一个控制台进程:旧的要等 30 分钟闲置才退,实测同时挂 4 个、每个约 140 MB。
    现在启动时先看有没有在跑的服务(记录文件 + 进程在 + 端口在听,三样都对),
    有就直接把浏览器指过去复用,连不上/进程已死则自动清掉过期记录再新起。
  • 收藏里的死链:清掉了两条指向早已不存在的文件的收藏(收藏夹里点了会提示"找不到")。

面板「打开数据目录 / 保存位置」:窗口现在会提到最前

  • 用户报:「打开数据目录,怎么是网页背后跳出」——面板的服务进程是隐藏的后台 PowerShell,
    它起的资源管理器窗口没有前台权,于是常在浏览器后面开出来,看着像"点了没反应"。
  • 现在打开后主动按窗口标题把那个资源管理器窗口激活到最前(最多等 2 秒;提不到也不影响目录已经打开)。

v2.4.0

Choose a tag to compare

@kele551 kele551 released this 23 Oct 05:32

界面整体改成本机网页控制台

  • 双击 exe 直接打开浏览器里的控制台(本机 127.0.0.1 + 一次性令牌):大图预览、点缩略图换图、拖滑块调间隔
  • 不再有黑窗:启动器不再申请控制台窗口
  • 文本菜单移除,menu.ps1 1834 行 → 77 行

功能

  • 聚焦模式 / 必应模式两个按钮,切换当场生效
  • 必应模式下更换节奏固定 24 小时,其它档位与滑块锁死(服务端也钉住)
  • 桌面快捷方式开关有真实动作(开=桌面建图标,关=真删并先确认)
  • 修复最近用过的/收藏空白、修复强制重建被保护逻辑挡住

升级与合规

  • 升级源去掉已停更的旧仓库兜底,只留 GitCode 主源 + GitHub 兜底
  • 发布文件里不再出现旧仓库地址
  • 发版自检 72 项,含老客户端连主程序一起自动替换的完整演练

v2.3.3

Choose a tag to compare

@kele551 kele551 released this 20 Oct 04:38

v2.3.3 — 2026-10-20

菜单打开快了一截;新增「必应模式」(只想每天看一张必应壁纸的人要的);面板上的仓库地址换成可点的 GitHub 链接。

菜单打开提速

  • 现象:双击 exe 到菜单出现约 3.5~4 秒,用户反馈「没有以前的快」。
  • 根因(逐项计时查出来的,不是猜的):真正花时间的不是程序本身(exe 启动 ~0.1 秒),而是菜单一进来就干的几件事——
    ① 用 Start-Job 起一个后台作业去扫坏图(PS 5.1 起作业本身就要 ~0.8 秒);
    ② 每次都把两张库里的图片过一遍,标记"陌生图"(~0.4 秒);
    ③ 每次都联网查一次更新(网络慢时更久)。
  • 改法:
    ① 坏图扫描改成"另起一个隐藏的独立进程、扫完写结果文件",菜单不再等它——同一次扫描只做一次,12 小时内不重复;
    ② "陌生图"标记改成 24 小时最多做一次(它只影响日志提示,不影响换图);
    ③ 菜单启动不再联网:只读本地缓存的升级信息([U] 手动检查更新照旧联网)。
  • 实测:同一台机器、同一份真实图库,3.8~4.0 秒 → 2.4~2.7 秒(快约 1/3)。
    再往下就是 PowerShell 自身启动的固定开销(~1.2 秒),不改技术栈压不动了。

新增「必应模式」

  • 设置里多一项 [e] 必应模式(菜单 [S] → [e],默认关闭)。
  • 打开后:每天只贴必应当日图,不再进入半小时轮换;开机/重启后自动把当天的必应图重新贴回来。
  • 当天必应图取不到时不会乱贴:本轮跳过,下一轮再试(不会换成库里的旧图)。
  • 关掉就恢复原来的行为(必应当日图 + 聚焦图片按时轮换)。

面板与升级通道

  • 菜单页脚的仓库地址改成 github.com/kele551/ms-wallpaper-assistant;主菜单新增 [G] 打开主页,
    控制台里点不了链接,按一下就调默认浏览器打开项目主页。
  • 升级源的脚本地址从 Gitee 换到 GitCode(Gitee 已停更,继续指那边会导致热更校验不过)。

v2.3.2

Choose a tag to compare

@kele551 kele551 released this 17 Oct 04:45

v2.3.2

升级源 / 下载地址切到 GitCode(国内访问更快)。

升级源切到 GitCode

  • 升级检查优先走 GitCode(国内),Gitee / GitHub 保留兜底;
  • 主程序下载地址优先 GitCode(Gitee 发行版附件照旧保留,作回退);
  • 老用户升级到本版后自动切换,无需重装、无需改配置。

验签照旧

  • Ed25519 公钥验签不变:验不过 / 缺签名 / 签名格式不对,一律拒绝并保留当前版本。

v2.3.1

Choose a tag to compare

@kele551 kele551 released this 17 Oct 01:51

v2.3.1

修复:每天开机后第一张壁纸显示成「居中」而不是「填充」。

修复

  • 现象:每天开机/重启后,第一张壁纸的填充方式是「居中」,桌面没有铺满;过一会儿换下一张才恢复「填充」。
  • 根因:换壁纸时,如果新图与当前桌面是同一张,旧代码直接跳过、不重新设置「填充方式」;而 Windows 每次开机/重启常把壁纸填充方式重置回「居中」,于是第一张就一直居中。
  • 修复:① 图没变时也校对填充方式,不对就重设;② 每次轮换开工时校对一遍,开机后被系统改坏的填充方式立刻恢复;只在校对到确实被改坏时才重设,不会多余刷新桌面。

v2.3.0

Choose a tag to compare

@kele551 kele551 released this 16 Oct 10:10

v2.3.0

升级通道加固:在线升级增加 Ed25519 公钥验签(验不过 / 缺签名一律拒绝并保留当前版本)。

升级通道增加 Ed25519 公钥验签(安全加固)

  • 为什么:以前的升级校验只比 sha256,而 sha256 与脚本 / 安装包放在同一个升级源里——源被整体替换(例如仓库账号被盗、有人推了恶意 version.json + 恶意脚本)时,sha256 会一起被改,等于没验。
  • 现在:升级源 version.json 必须带同目录 version.json.sig,客户端用内置公钥验签;验签不过 / 缺签名 / 签名格式不对,一律拒绝并保留当前版本,绝不"先替换再校验"。
  • 密钥:签名私钥只在维护者机器上(绝不进程序、不进仓库);客户端只带公钥(公开无妨)。
  • 能力边界(如实说明):签名防"升级源被篡改 / 中间人换包",防不了"维护者机器上的私钥被偷",也不等于 Windows 代码签名证书(那解决的是杀软误报,属另一件事)。
  • 兼容性:老版本不认识 .sig、只读 version.json,升级行为不受影响;本版起强制验签。

文档与治理(随本版一并带上)

  • 三平台(Gitee / GitHub / AtomGit)代码一致;README / SECURITY / COMPLIANCE / ARCHITECTURE / CONTRIBUTING 补「自动更新怎么保证安全」口径。

v2.2.1

Choose a tag to compare

@kele551 kele551 released this 12 Oct 06:53

v2.2.1

产品更名 + 三方代码审查修复批(审查范围:core.ps1 / menu.ps1 / launcher / 发布链)。

更名:「微软壁纸助手」→「壁纸助手」

  • 去掉他人商标前缀。exe 文件名、数据目录(%LOCALAPPDATA%\壁纸助手)、图标文件名都换新名;界面显示名仍是「桌面壁纸」(2026-10-09 起就没有商标字样);仓库名与升级源地址不动——改了会断全体存量用户的自动升级链。
  • 老用户无感:自动升级是原位覆盖、文件名不变(还是旧名);数据目录在第一次启动时从旧目录复制迁移(逐文件校验,旧目录保留不删作回滚);便携 U 盘上的老目录继续识别、照用。
  • 菜单的固定名 / 进程探测 / 图标定位全部新旧双名兼容。

修复(按严重度)

  1. P0 · 自己放进图库的照片会被定时换到桌面:10-10 晚"永远最旧优先"合并时,外来图过滤被主路径旁路;现在返回点补同一道过滤(全是外来图时兜底照常用,与旧口径一致)。
  2. P0 · 改名迁移链:启动器新增旧 appdata 目录复制迁移 + 老便携目录识别;launcher.txt 每次启动自愈(exe 挪窝后主程序升级不再"找不到主程序路径");make_version_json / publish / preflight 的附件名同步改名;自检闸门新增「version.json 的 url 文件名 == 成品文件名」「文档无旧名残留」「测试套件必跑」三道检查。
  3. P1 · 必应库上限不再静默回收老用户旧图(方案 A):config.json 缺 bing_cap 字段的老用户按 0=不限;只有全新安装默认 200。
  4. P1 · [U] 手动检查更新强制联网(与狐径 FoxPath v1.1.1 同款缺陷):展示取值原来走 6 小时缓存,成功框的目标版本/主程序判定可能基于旧数据;现在强制联网,首页横幅注明「信息截至 <时间>」。
  5. P1 · 热更脚本原子写 + 回滚:原来直接覆盖 core.ps1/menu.ps1,写到一半断电会留下永远不自愈的半截脚本;现在临时文件 → 读回验 sha → 原子替换 → 再验,失败自动用本机 .bak 恢复。
  6. P1 · 下载只允许 https:sha256 与文件同源,http 源被中间人可同时伪造两者;升级源、脚本、主程序的所有 http:// 入口一律拒绝(本地路径用法不受影响)。
  7. P1 · Get-BwBytes 超时真正生效:原来 timeoutSec 参数从未接到任何超时设置(WebClient 默认 100 秒),死地址能把后台巡检拖成几分钟干等;换 HttpWebRequest 显式设 Timeout/ReadWriteTimeout。
  8. P1 · 轮换跨实例锁(cycle.lock):计划任务与菜单/守护并发时曾连跳两张、history 重复记账、两份快照互相整份覆盖。
  9. P1 · 原子写临时文件带 PID:菜单与守护并发写 state.json 曾共用 .tmp 互相覆盖互删;损坏恢复端改为按「<文件名>*.tmp」找最新一份。
  10. P1 · 升级后"打开新版本"改脱离式启动:老窗口不再同步等新菜单退出(原来屏幕会同时挂两个窗口)。

顺手小修

首启向导给退出路径(原来选不出可写目录只能强杀);手输盘根 D:\ 不再被裁成 D:;浏览设壁纸序号补 TryParse+范围检查;主循环两处裸 [int] 加护栏;"最旧优先"队列日志文案与合并后的实际行为对齐;若干过时注释与编辑残留清理;测试套件新增「老名 appdata 迁移」「launcher.txt 自愈」两个用例。

v2.2.0

Choose a tag to compare

@kele551 kele551 released this 10 Oct 02:36

v2.2.0

「把升级链路上最后一颗雷排掉」:这一版主要是修问题——其中一条会让特定用户
永远升不了级、却以为升成功了。另外补上依赖与许可证声明、修好测试与自检脚本,
让「照文档就能复现」这句话真正成立。

升级可靠性(本次最要紧的一条)

  • 修掉"升级小助手起不来":启动小助手时 -File 的参数没加引号。
    PowerShell 5.1 只把参数按空格拼成命令行、不会替你补引号 —— 于是
    Windows 账户名或临时目录带空格的电脑(如 C:\Users\Zhang San\…)上路径被截断,
    小助手一行都不执行:exe 已经下好、校验也过了、界面还弹绿框说"程序会自己重启",
    实际一个字节没换;程序目录里每次多留一个约 7.7MB 的 .new,升级锁卡 10 分钟,
    下次启动重演一遍 —— 用户永远停在旧版。
    同类写法共三处一并修好(提权修盘权限、升级小助手、菜单里打开数据目录)。
  • 发版前自检新增第 ⑥ 项「空格路径防线」:把这类不加引号的写法钉死,以后不会再写回来。

别的修复

  • 合成缓存清理真正生效了:清理时只找 *.png,而缓存实际存的是 .jpg ——
    等于一个都没删过,「最多 12 张 / 48MB」两道上限形同虚设,硬盘只增不减。
  • 热更过的脚本不再被悄悄换回旧版:原来只要数据目录里少任何一个载荷文件
    (用户很容易顺手删掉「使用说明.txt」或图标),程序就会把已经热更好的新脚本覆盖回
    exe 内嵌的旧版、并把版本号写回去 —— 用户界面莫名退回旧版且毫无提示。
    现在处于热更状态时只补真正缺失的文件,绝不覆盖已存在的、绝不动版本号。

可复现性与合规

  • 测试脚本不再写死作者本机路径(原来写死 F:\wp-src,别人照 README 跑第一步就报错),
    改成按脚本自身位置推导;顺手给没带 BOM 的测试脚本补上 BOM。
  • 新增 requirements.txt 与 README「第三方组件与许可」小节:运行主程序
    零第三方依赖(只用 Python 标准库 + Windows 自带 PowerShell),只有打包与发版
    工具需要 PyInstaller / requests,许可证一并列清。
  • COMPLIANCE.md 不再指向一份不存在的声明,改为指向上面那份。
  • README / 使用说明里「图片在 C 盘会挪到别的盘」改成与实现一致的说法
    (只在别的盘已有现成图片文件夹时才换盘;新机器上一个都没有时仍留在「图片」里)。

发布工具

  • tools/publish.py 里写死的作者本机路径改走环境变量;发版前自检脚本两种目录布局都认
    —— 换台机器也能跑。

本版没有改动程序功能与界面,装上去用起来和 v2.1.0 一样;
改的是"升级能不能成功""脚本会不会被换回去""别人能不能复现"这些底层问题。

v2.1.0

Choose a tag to compare

@kele551 kele551 released this 09 Oct 06:15

v2.1.0

「改个名字,修一批升级链路上的真问题」:显示名从「微软壁纸助手」改成 桌面壁纸
(原名里带着别人的商标,用在参赛作品里不合适);同时把"升级之后新版起不来"
这个真机事故的根因查清并修掉。

显示名与合规

  • 显示名改为 桌面壁纸:界面标题、首次运行向导、主菜单、升级窗口、快捷方式名与描述、
    exe 属性里的描述都改了。文件名、数据目录、下载地址、仓库名一律没变
    (升级链不断、链接不失效);老快捷方式会自动改名,不会出现两个开机自启。
  • 文档补上「与各图源厂商无隶属关系、名称仅描述来源、图片版权归原提供方」的声明。

升级可靠性(真机事故修复)

  • 修掉"升级之后程序起不来"的真因:升级小助手是从主程序里起的,会继承主程序
    (单文件 exe)的 _PYI_* 环境变量;新版本的引导程序一看就以为"已经解过包了",
    于是去找那个早已被删掉的临时目录,报 Failed to load Python DLL,新版永远起不来。
    现在起新版本之前先擦掉这些变量。
    (2026-10-08 那次同类故障当时记为"杀毒软件拦截",真因即此,特此更正。)
  • 升级失败不再"静悄悄地坏":新版连续起不来时按设计保留旧版本并在日志里写清原因,
    不会出现"程序没了"。

健壮性

  • 单张图片下载改成总时长硬期限(原来 Invoke-WebRequest -TimeoutSec 只管响应头,
    图床慢速吐字节时实测能卡 2 分钟以上),超时就放弃换下一张;同一源连续超时会自动退避。
  • 心跳恢复显示当前图片分辨率(PowerShell 5.1 没有 Split-Path -Extension,此前一直是空的)。
  • 数据目录里的脚本载荷按内容同步,不再只比版本号(避免"界面显示的与实际代码不一致")。

两个实验性图源的结论(如实说明)

  • 本版试过接入 NASA 图像库 与 大都会博物馆公版名画 两个图源。实机下载评估后确认
    它们的图片比例不适合做壁纸(NASA 多为方形星云图、名画多为超宽长卷),
    已从产品里移除,界面上不再出现。
  • 相关通用能力(画质门槛、比例筛选、"不放大居中 + 同款模糊底"显示、多源均衡轮换、慢源退避)
    保留在代码里并标注「暂未启用 —— 等合适的图源」,将来接入合适的源即可直接用。