diff --git a/config.example.yaml b/config.example.yaml index e7d47e7..3833b07 100644 --- a/config.example.yaml +++ b/config.example.yaml @@ -45,11 +45,11 @@ taobao: # 在「参数设置」页可以用「选择文件」按钮挑,不用手打。 chrome_path: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" - # 专属 Chrome 的用户数据目录,淘宝登录态就存在这里。 - # 默认在 %LOCALAPPDATA%\电商视频自动下载工具\淘宝浏览器\默认账号 - # [注意] 改了这个路径就要重新扫码登录一次,不要随手改。 - # 这个目录不要提交、打包或共享。 - user_data_dir: "C:\\Users\\你的用户名\\AppData\\Local\\电商视频自动下载工具\\淘宝浏览器\\默认账号" + # 淘宝和 1688 共用的用户数据目录;默认在 config.yaml 旁的 + # 运行数据\浏览器\淘宝1688。开发模式是项目根目录,打包版是 exe 旁。 + # [注意] 改路径后需分别手动重新登录两站;不要提交、打包或共享此目录。 + # 如需自定义,取消下一行注释并填写绝对路径。 + # user_data_dir: "D:\\自定义目录\\淘宝1688" # 给专属 Chrome 分配调试端口的范围。端口被占用时会往后找。 debug_port_start: 19666 diff --git a/docs/00-project-profile.md b/docs/00-project-profile.md index 2aa3376..12f2d9f 100644 --- a/docs/00-project-profile.md +++ b/docs/00-project-profile.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Project-Profile wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Project-Profile.- -wiki_revision: a6dc3ff73d753db3750b9d2421fcd0661b6bc169 -synchronized_at: 2026-09-30T01:39:55Z +wiki_revision: 7a6c27d8b2986bc87bc3eabf45fdf3813a9c7764 +synchronized_at: 2026-10-07T08:26:23Z # 项目档案 @@ -152,7 +152,7 @@ Go 与前端目录在项目骨架建立后补入[架构与代码地图](02-archi | 历史 OCR 服务地址 | 兼容旧配置 | 不再参与运行时请求 | | Gitea token | 文档同步 | 只从进程环境或 MCP 安全配置读取,**不得写入仓库** | -专属 Chrome Profile 目录默认为 `%LOCALAPPDATA%\电商视频自动下载工具\淘宝浏览器\默认账号`,沿用已验证 Python 流程的路径,避免使用者重新登录。该目录不得提交、打包或共享。 +淘宝与 1688 共用的专属 Chrome Profile 默认位于 `config.yaml` 所在目录下的 `运行数据/浏览器/淘宝1688`;开发模式在项目根目录,打包版在 exe 旁,不落入可清理的 `build/bin`。改变旧目录后需分别手动重新登录,原 Profile 不自动迁移或删除。该目录不得提交、打包或共享。 ## 项目专用验收要求 diff --git a/docs/02-architecture-and-code-map.md b/docs/02-architecture-and-code-map.md index 42d2ce9..432ca1e 100644 --- a/docs/02-architecture-and-code-map.md +++ b/docs/02-architecture-and-code-map.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Architecture-and-Code-Map wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Architecture-and-Code-Map.- -wiki_revision: 402b037c2ccb948e297aeb15e9679565ca80d2bb -synchronized_at: 2026-10-07T08:13:39Z +wiki_revision: 928afb2d53fd93391b384fe3af843180a0bfc728 +synchronized_at: 2026-10-07T08:26:24Z # 架构与代码地图 @@ -183,4 +183,4 @@ cmsp/ ## 1688 视频下载来源(2026-10-07,#37) -商品列表“下载视频”旁选择淘宝或 1688;`download.source` 写入本机 `config.yaml`,批次启动时固定来源。1688 与淘宝共用现有专属 Chrome Profile、进程和运行状态文件;两个站点均由操作者手动登录。`app_1688.go` 调用 `internal/alibaba1688/search.go`:上传商品主图到网页以图搜,按结果顺序进入候选详情,读取页面视频地址。`internal/downloader` 将候选 MP4 下载到临时文件;`internal/alibaba1688/quality.go` 用 ffprobe 校验、ffmpeg 抽帧检测黑底文字广告和静止拼图。只有判为 `usable` 的视频才晋升为商品文件,`internal/store.CompleteVideoDownload` 在同一 SQLite 事务中写视频记录与商品已下载状态。拒绝、无法判定、候选下载失败时保留原商品状态;上传仍沿用原有 erpgo 流程。 +商品列表“下载视频”旁选择淘宝或 1688;`download.source` 写入本机 `config.yaml`,批次启动时固定来源。1688 与淘宝共用现有专属 Chrome Profile、进程和运行状态文件;默认目录由 `internal/config.DefaultChromeUserDataDir` 定位到 `config.yaml` 旁的 `运行数据/浏览器/淘宝1688`,两个站点均由操作者手动登录。`app_1688.go` 调用 `internal/alibaba1688/search.go`:上传商品主图到网页以图搜,按结果顺序进入候选详情,读取页面视频地址。`internal/downloader` 将候选 MP4 下载到临时文件;`internal/alibaba1688/quality.go` 用 ffprobe 校验、ffmpeg 抽帧检测黑底文字广告和静止拼图。只有判为 `usable` 的视频才晋升为商品文件,`internal/store.CompleteVideoDownload` 在同一 SQLite 事务中写视频记录与商品已下载状态。拒绝、无法判定、候选下载失败时保留原商品状态;上传仍沿用原有 erpgo 流程。 diff --git a/docs/03-business-rules-and-glossary.md b/docs/03-business-rules-and-glossary.md index 3be88d9..a9e61a2 100644 --- a/docs/03-business-rules-and-glossary.md +++ b/docs/03-business-rules-and-glossary.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Business-Rules-and-Glossary wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Business-Rules-and-Glossary.- -wiki_revision: 9050db999007f60f94f1d1b394a447836a61762e -synchronized_at: 2026-10-07T08:13:39Z +wiki_revision: 3f8176505ad472eb9c7899fb032a41b1b5fa28b4 +synchronized_at: 2026-10-07T08:26:24Z # 业务规则与术语 @@ -77,7 +77,7 @@ MTOP 搜索方式、签名与请求参数保持现状。商品原链接以实际 | MTOP | 淘宝的 H5 接口网关。请求需要 `appKey`、毫秒时间戳、由 `_m_h5_tk` 派生的 token 和 MD5 签名 | | pcSign | MTOP 请求参数内部的一个附加签名,由紧凑 JSON 载荷加固定盐做 SHA256 后 Base64 得到 | | 专属 Chrome | 由本程序用固定 `--user-data-dir` 和调试端口启动的独立 Chrome 实例,与使用者日常浏览器互不影响 | -| Chrome Profile | 专属 Chrome 的用户数据目录,保存淘宝登录态。它是淘宝登录的唯一保存位置 | +| Chrome Profile | 淘宝与 1688 共用的专属 Chrome 用户数据目录,默认在配置文件旁的 `运行数据/浏览器/淘宝1688`;登录态只留在该目录 | | CDP | Chrome DevTools Protocol。程序通过它导航页面、读取 Cookie 名称、在页面上下文执行 JavaScript | | 深度登录检查 | 导航到「我的淘宝」后按页面标题、最终地址和正文判断服务端是否仍认可登录,而不是只看本地 Cookie 是否存在 | | 阻断词 | 页面中出现即停止自动访问的关键词;「请登录」属于登录失效,「安全验证」「访问受限」属于访问异常 | diff --git a/docs/04-local-development-and-verification.md b/docs/04-local-development-and-verification.md index 4969764..712d73b 100644 --- a/docs/04-local-development-and-verification.md +++ b/docs/04-local-development-and-verification.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Local-Development-and-Verification wiki_url: https://git.ilapage.cn/chengma/cmsp/wiki/Local-Development-and-Verification.- -wiki_revision: 222b13d06ebc82783abd51eb5c82a9e6c8ea35e4 -synchronized_at: 2026-10-07T08:13:40Z +wiki_revision: 410c1bb02afc010289a9e1787e89835aafdb8976 +synchronized_at: 2026-10-07T08:26:25Z # 本地开发与验证 @@ -235,4 +235,4 @@ Go 实现完成后适用: ## 1688 视频来源运行要求(2026-10-07,#37) -在商品列表下载按钮旁选“1688”,参数设置中检查 `taobao.chrome_path`、`taobao.user_data_dir` 与调试端口范围;这组配置供淘宝和 1688 共用。点击“打开 1688 登录”在同一专属 Chrome 中手动登录。旧 `alibaba1688` 配置块读取时忽略,保存后不再写出。1688 视频内容检测除了既有 ffprobe,还需要 `ffmpeg.exe`;打包运行时把二者放在 `cmsp.exe` 同目录,或加入 PATH。缺少 ffmpeg 时启动 1688 下载前即提示,不改变淘宝下载。`download.source` 保存在本机 `config.yaml`,默认 `taobao`。验证命令:`go test ./...`,`wails build`;真机验收分别用广告文字候选和正常商品视频检查拒绝、放行及 SQLite 状态。 +在商品列表下载按钮旁选“1688”,参数设置中检查 `taobao.chrome_path`、`taobao.user_data_dir` 与调试端口范围;这组配置供淘宝和 1688 共用。默认 Profile 位于 `config.yaml` 同目录的 `运行数据/浏览器/淘宝1688`;`config.example.yaml` 不写死本机路径。开发运行使用项目根目录,打包运行使用 exe 旁的配置目录。旧 Profile 不自动复制或删除,切换后需分别手动登录。点击“打开 1688 登录”在同一专属 Chrome 中手动登录。旧 `alibaba1688` 配置块读取时忽略,保存后不再写出。1688 视频内容检测除了既有 ffprobe,还需要 `ffmpeg.exe`;打包运行时把二者放在 `cmsp.exe` 同目录,或加入 PATH。缺少 ffmpeg 时启动 1688 下载前即提示,不改变淘宝下载。`download.source` 保存在本机 `config.yaml`,默认 `taobao`。验证命令:`go test ./...`,`wails build`;真机验收分别用广告文字候选和正常商品视频检查拒绝、放行及 SQLite 状态。 diff --git a/internal/config/config.go b/internal/config/config.go index fb333e1..4613864 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -149,20 +149,10 @@ func Default() Config { } } -// DefaultChromeUserDataDir 返回专属 Chrome 用户数据目录的默认位置。 -// -// 这个路径沿用迁移前 Python 版本的目录,改动它会导致同事需要重新 -// 扫码登录淘宝,所以不要随手改。 +// DefaultChromeUserDataDir 返回配置文件旁的共用 Chrome Profile 目录。 +// 开发模式位于项目根目录;打包版位于 exe 旁,不使用会被清理的 build/bin。 func DefaultChromeUserDataDir() string { - base := os.Getenv("LOCALAPPDATA") - if base == "" { - home, err := os.UserHomeDir() - if err != nil { - return filepath.Join(".", "淘宝浏览器", "默认账号") - } - base = home - } - return filepath.Join(base, "电商视频自动下载工具", "淘宝浏览器", "默认账号") + return filepath.Join(DataRoot(), "运行数据", "浏览器", "淘宝1688") } // DataRoot 返回程序存放数据的根目录。 @@ -371,8 +361,8 @@ taobao: # chrome.exe 的完整路径。注意是文件不是目录。 chrome_path: %s - # 专属 Chrome 的用户数据目录,淘宝登录态就存在这里。 - # [注意] 改了这个路径就要重新扫码登录一次,不要随手改。 + # 淘宝和 1688 共用的 Chrome 用户数据目录,默认位于配置文件旁的运行数据/浏览器/淘宝1688。 + # [注意] 改了这个路径就要分别手动重新登录两站,不要随手改。 # 这个目录不要提交、打包或共享。 user_data_dir: %s diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 8fb2f9a..14befec 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -398,6 +398,14 @@ func TestDataRoot跟随配置文件位置(t *testing.T) { if root != filepath.Dir(DefaultPath()) { t.Fatalf("数据根目录应当是配置文件所在目录,实际 %q", root) } + profile := DefaultChromeUserDataDir() + if want := filepath.Join(root, "运行数据", "浏览器", "淘宝1688"); profile != want { + t.Fatalf("共用浏览器目录应当跟随配置文件:got %q want %q", profile, want) + } + loaded, err := Load(cfgPath) + if err != nil || loaded.Taobao.UserDataDir != profile { + t.Fatalf("旧配置缺少浏览器目录时应使用新默认值:%v", err) + } videoDir := DefaultVideoDir() if !strings.HasPrefix(videoDir, root) {