diff --git a/docs/2026-09-21-17-51-fix-add-account-request-id-windows-release.md b/docs/2026-09-21-17-51-fix-add-account-request-id-windows-release.md new file mode 100644 index 0000000..0c70e27 --- /dev/null +++ b/docs/2026-09-21-17-51-fix-add-account-request-id-windows-release.md @@ -0,0 +1,39 @@ +# 添加小号失败修复与 Windows 发布记录 + +## 问题与修复 + +日志中的真实异常为: + +```text +[操作失败] 添加账号:TypeError +``` + +根因是界面请求统一注入 `_request_id`,账号添加分支却将完整请求字典传给 `Store.add(**data)`;`Store.add()` 不接受 `_request_id`,因此抛出 `TypeError`。 + +修复:`src/account_engine.py` 的 `add` 分支改为显式传递 `role`、`name`、`uid`、`owner`,保留请求元数据供 UI 回包,但不传入存储层。`src/test_accounts.py` 增加带 `_request_id` 的回归输入。 + +## 本地验证 + +- `src/test_accounts.py` + `src/test_plan01.py`:54 项通过。 +- onboarding UI 相关聚焦测试:1 项通过。 +- Python 编译、`git diff --check`:通过。 +- 完整 onboarding UI 测试在当前 Linux offscreen 环境的既有 profile 测试处超时;未将其归因于本次改动。 +- 其余本地测试 77 项通过,另有 1 项既有日志文案断言与当前文案不一致,未扩大本次修复范围。 + +## Windows 原生构建与安装 + +- 主机:`10.1.1.101` +- 构建目录:`C:\Users\Rogee\douyin-pc-build-20260920-follow` +- 安装目录:`C:\Users\Rogee\AppData\Local\Programs\DouyinAccounts` +- Windows Python:3.12.10 +- 构建命令:`python build_windows.py` +- PyInstaller、打包离线冒烟、CLI `--help`、Inno Setup:通过。 +- 安装包:`release/DouyinAccounts-0.1.8-Windows-x64-Setup.exe` +- 安装包大小:222,720,245 bytes +- SHA-256:`12591caf2359f21a333e3b2a1232265ce0b935c49709280afdf2edf470a9c512` +- 安装退出码:`0` +- 安装日志:`Installation process succeeded.` +- 构建目录与安装目录的 `DouyinAccounts.exe` SHA-256 均为:`6f16dd1818449363be1df262cc5aa0d1b8ac987552ba3ab188cbda769e58821d` +- 原有本地数据目录仍存在,未传输、删除或修改登录目录、Cookie、数据库内容。 + +源码和构建文件通过 SSH 传输;未传输账号数据。安装后通过 Windows MCP 启动并检查 GUI,窗口及“添加账号/停止全部/设置”等控件正常显示。未自动登录、启动业务规则、关注、私信或标记已读;应用当前保持打开供用户手动验证。 diff --git a/src/account_engine.py b/src/account_engine.py index 0ab55d9..e86733f 100644 --- a/src/account_engine.py +++ b/src/account_engine.py @@ -928,7 +928,12 @@ class Engine: async def _command(self, name, data): if name == "add": - ident = self.store.add(**data) + ident = self.store.add( + role=data["role"], + name=data["name"], + uid=data.get("uid"), + owner=data.get("owner"), + ) self.begin_login(ident) return ident if name == "rule": diff --git a/src/test_accounts.py b/src/test_accounts.py index 8292c1d..5dcd3c6 100644 --- a/src/test_accounts.py +++ b/src/test_accounts.py @@ -756,7 +756,12 @@ class EngineTest(unittest.IsolatedAsyncioTestCase): async def test_unbound_group_cannot_start_and_add_starts_login_only(self): with patch.object(self.engine, "begin_login") as login: ident = await self.engine.command( - "add", {"role": "main", "name": "界面名称"} + "add", + { + "role": "main", + "name": "界面名称", + "_request_id": "request-1", + }, ) login.assert_called_once_with(ident) with self.assertRaises(ValueError):