chore: 完成正式代码包结构
创建 app 包与 main.py 入口,将根目录 cdp.py 迁入 app/cdp.py,并保留最小 app.gui 占位入口。 修正 prototypes/demo.py 与 demo.bat,让原型脚本从项目根导入 app.cdp。 更新任务看板、当前状态和进度记录,标记 T-000 完成并记录本机 Python 解释器差异。
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
"""cmshopee official application package."""
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
"""Package entry point for `python -m app`."""
|
||||||
|
|
||||||
|
from .gui import main
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
|
|
||||||
+7
-6
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# cdp.py —— 共享 CDP 底座:连接 Chrome、定位/打开商品 tab、执行 JS、模拟拖拽。
|
# app/cdp.py —— 共享 CDP 底座:连接 Chrome、定位/打开商品 tab、执行 JS、模拟拖拽。
|
||||||
# 被 demo.py 及各能力脚本复用。
|
# 被正式模块和 prototypes/demo.py 复用。
|
||||||
#
|
#
|
||||||
# 依赖:pip install websocket-client requests
|
# 依赖:pip install websocket-client requests
|
||||||
|
|
||||||
@@ -14,14 +14,13 @@ import json
|
|||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
import requests
|
CDP_HOST = os.environ.get("CDP_HOST", "127.0.0.1:9222")
|
||||||
from websocket import create_connection
|
|
||||||
|
|
||||||
CDP_HOST = os.environ.get("CDP_HOST", "192.168.0.224:9333")
|
|
||||||
BASE = f"http://{CDP_HOST}"
|
BASE = f"http://{CDP_HOST}"
|
||||||
|
|
||||||
|
|
||||||
def http_get(path):
|
def http_get(path):
|
||||||
|
import requests
|
||||||
|
|
||||||
s = requests.Session()
|
s = requests.Session()
|
||||||
s.trust_env = False # 忽略环境代理
|
s.trust_env = False # 忽略环境代理
|
||||||
return s.get(f"{BASE}{path}", timeout=10).json()
|
return s.get(f"{BASE}{path}", timeout=10).json()
|
||||||
@@ -31,6 +30,8 @@ class CDP:
|
|||||||
"""单个 target 的 CDP 客户端:命令同步、事件回调异步。"""
|
"""单个 target 的 CDP 客户端:命令同步、事件回调异步。"""
|
||||||
|
|
||||||
def __init__(self, ws_url):
|
def __init__(self, ws_url):
|
||||||
|
from websocket import create_connection
|
||||||
|
|
||||||
# suppress_origin=True:不发 Origin 头,避免 Chrome 未开 --remote-allow-origins 时 403。
|
# suppress_origin=True:不发 Origin 头,避免 Chrome 未开 --remote-allow-origins 时 403。
|
||||||
self.ws = create_connection(ws_url, max_size=None, suppress_origin=True)
|
self.ws = create_connection(ws_url, max_size=None, suppress_origin=True)
|
||||||
self._id = 0
|
self._id = 0
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
"""GUI entry point placeholder.
|
||||||
|
|
||||||
|
The real PySide6 main window is implemented by task T-104.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
print("cmshopee GUI 尚未实现:请继续执行 T-104 构建 PySide6 主窗口。")
|
||||||
|
return 0
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
@echo off
|
@echo off
|
||||||
rem 单账号原型演示:脚本已移到 prototypes/,设 PYTHONPATH 让根目录 cdp.py 可导入
|
rem 单账号原型演示:脚本在 prototypes/,demo.py 从项目根导入 app.cdp
|
||||||
cd /d %~dp0
|
cd /d %~dp0
|
||||||
set PYTHONPATH=%~dp0
|
|
||||||
python prototypes\demo.py
|
python prototypes\demo.py
|
||||||
pause
|
pause
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
| ID | 任务 | 依赖 | 验收要点 | 状态 |
|
| ID | 任务 | 依赖 | 验收要点 | 状态 |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| T-000 | 正式代码包结构:创建 `app/`、迁入 `cdp.py` 为 `app/cdp.py`、新增 `app/__init__.py`、`app/__main__.py`、根入口 `main.py`、最小 `app/gui.py` 占位入口,并修正 prototypes 导入 | - | `python -m compileall app main.py` 通过;`python -m app`/`python main.py` 可进入入口(GUI 未完成时给明确提示并退出);`prototypes/demo.py` 可从项目根导入 `app.cdp` | TODO |
|
| T-000 | 正式代码包结构:创建 `app/`、迁入 `cdp.py` 为 `app/cdp.py`、新增 `app/__init__.py`、`app/__main__.py`、根入口 `main.py`、最小 `app/gui.py` 占位入口,并修正 prototypes 导入 | - | `python -m compileall app main.py` 通过;`python -m app`/`python main.py` 可进入入口(本机 `python` 不符合版本时用 `py -3 -m app`);GUI 未完成时给明确提示并退出;`prototypes/demo.py` 可从项目根导入 `app.cdp` | DONE |
|
||||||
| T-001 | `app/editor.py`:改标题/换封面/点更新/登录检测/**采集(读旧标题+旧封面下载)**/apply_task,复用 `app/cdp.py` | T-000 | 函数可调用,在测试商品跑通;与 `prototypes/demo.py` 行为一致 | TODO |
|
| T-001 | `app/editor.py`:改标题/换封面/点更新/登录检测/**采集(读旧标题+旧封面下载)**/apply_task,复用 `app/cdp.py` | T-000 | 函数可调用,在测试商品跑通;与 `prototypes/demo.py` 行为一致 | TODO |
|
||||||
| T-002 | `app/appconfig.py` + `config.json`(含 image_dir、ai 选择/参数段、端口等默认值;不含 AI Key) | T-000 | 读写正常;不存在则写默认;AI Key 留给 `config/ai_models.json`/T-501 | TODO |
|
| T-002 | `app/appconfig.py` + `config.json`(含 image_dir、ai 选择/参数段、端口等默认值;不含 AI Key) | T-000 | 读写正常;不存在则写默认;AI Key 留给 `config/ai_models.json`/T-501 | TODO |
|
||||||
| T-003 | `app/db.py` + SQLite 建表(batches/accounts/tasks,含 Excel 行定位、状态、时间戳、重试字段) | T-000 | `init_db` 幂等;`connect` 设置 WAL/busy_timeout/foreign_keys;账号/批次/任务/各 set_* 可用;schema 同架构 5.2 | TODO |
|
| T-003 | `app/db.py` + SQLite 建表(batches/accounts/tasks,含 Excel 行定位、状态、时间戳、重试字段) | T-000 | `init_db` 幂等;`connect` 设置 WAL/busy_timeout/foreign_keys;账号/批次/任务/各 set_* 可用;schema 同架构 5.2 | TODO |
|
||||||
|
|||||||
+15
-9
@@ -6,9 +6,9 @@
|
|||||||
## 当前快照
|
## 当前快照
|
||||||
|
|
||||||
- 日期:2026-06-26
|
- 日期:2026-06-26
|
||||||
- 阶段:V0 单账号 CDP 流程已验证;V1 多账号管理 + 5 Tab GUI + Excel/AI 流水线为既定设计,尚未开始编码。
|
- 阶段:V0 单账号 CDP 流程已验证;V1 已完成 T-000 正式代码包结构,下一步开始模块化 editor/config/DB。
|
||||||
- 技术栈:Python 3.10+,自研 CDP(websocket-client + requests),SQLite(sqlite3)+ `config.json` + openpyxl + AI(服务商待定),GUI PySide6 5 Tab(已定)。
|
- 技术栈:Python 3.10+,自研 CDP(websocket-client + requests),SQLite(sqlite3)+ `config.json` + openpyxl + AI(服务商待定),GUI PySide6 5 Tab(已定)。
|
||||||
- 生产代码:正式目标为 `app/` 包 + 根入口 `main.py`,尚未创建;现有根目录 `cdp.py` 是已验证 CDP 底座,待 T-000 迁入 `app/cdp.py`。
|
- 生产代码:已建立 `app/` 包 + 根入口 `main.py`;`app/cdp.py` 为已验证 CDP 底座;`app/gui.py` 目前是入口占位,完整 PySide6 主窗口待 T-104。
|
||||||
- 测试:当前以 `py_compile` + 在测试商品上手动跑 `prototypes/demo.py` 为主;`tests/` 与 `python -m unittest discover -s tests` 由 T-006 建立,T-006 完成前不把缺少 `tests/` 视为验证失败。
|
- 测试:当前以 `py_compile` + 在测试商品上手动跑 `prototypes/demo.py` 为主;`tests/` 与 `python -m unittest discover -s tests` 由 T-006 建立,T-006 完成前不把缺少 `tests/` 视为验证失败。
|
||||||
- 数据:无 `config.json`、`config/ai_models.json`、`cmshopee.db`、`chrome_user_data_dir/`、`images/`(待 Phase 0/1 建立,均须 gitignore)。
|
- 数据:无 `config.json`、`config/ai_models.json`、`cmshopee.db`、`chrome_user_data_dir/`、`images/`(待 Phase 0/1 建立,均须 gitignore)。
|
||||||
|
|
||||||
@@ -28,11 +28,12 @@
|
|||||||
| 路径 | 状态 | 说明 |
|
| 路径 | 状态 | 说明 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `docs/` | 已有 | 本 harness coding 文档集合 |
|
| `docs/` | 已有 | 本 harness coding 文档集合 |
|
||||||
| `cdp.py` | 已有 | 已验证 CDP 底座来源;T-000 迁入 `app/cdp.py` 后根目录不再放正式业务模块 |
|
| `app/cdp.py` | 已有 | CDP 底座:连接/找 tab/开 tab/执行 JS/拖拽 |
|
||||||
| `prototypes/` | 已有 | 已验证原型/探查脚本(demo/set_title/set_cover/get_title/cookies/inspect_images/grab/1.py),逻辑待并入 `app/editor.py` 后清理;见 `prototypes/README.md` |
|
| `prototypes/` | 已有 | 已验证原型/探查脚本(demo/set_title/set_cover/get_title/cookies/inspect_images/grab/1.py),逻辑待并入 `app/editor.py` 后清理;见 `prototypes/README.md` |
|
||||||
| `chrome-remote-debug-lan.md` | 已有 | WSL→Windows CDP 转发排查记录 |
|
| `chrome-remote-debug-lan.md` | 已有 | WSL→Windows CDP 转发排查记录 |
|
||||||
| `app/` / `main.py` | 待建 | 正式代码包与启动入口;T-000 产出 |
|
| `app/__init__.py` / `app/__main__.py` / `main.py` | 已有 | 正式包与启动入口;`python main.py` / `python -m app` 可运行占位入口 |
|
||||||
| `app/appconfig.py` / `app/db.py` / `app/excel.py` / `app/config.py` / `app/chrome.py` / `app/editor.py` / `app/gui.py` / `app/workers.py` | 待建 | Phase 0-3 产出 |
|
| `app/gui.py` | 已有 | GUI 占位入口;完整 PySide6 主窗口待 T-104 |
|
||||||
|
| `app/appconfig.py` / `app/db.py` / `app/excel.py` / `app/config.py` / `app/chrome.py` / `app/editor.py` / `app/workers.py` | 待建 | Phase 0-3 产出 |
|
||||||
| `config.json` / `config/ai_models.json` / `cmshopee.db` / `chrome_user_data_dir/` / `images/` | 待建 | 含配置、密钥、业务、登录态、图片,须 gitignore |
|
| `config.json` / `config/ai_models.json` / `cmshopee.db` / `chrome_user_data_dir/` / `images/` | 待建 | 含配置、密钥、业务、登录态、图片,须 gitignore |
|
||||||
|
|
||||||
## 已验证能力(单账号)
|
## 已验证能力(单账号)
|
||||||
@@ -47,15 +48,19 @@
|
|||||||
|
|
||||||
任务状态以 [`06-tasks.md`](06-tasks.md) 为准,历史记录见 [`../progress.md`](../progress.md)。
|
任务状态以 [`06-tasks.md`](06-tasks.md) 为准,历史记录见 [`../progress.md`](../progress.md)。
|
||||||
|
|
||||||
- 已完成:无(任务均为 TODO;单账号能力以脚本形式存在,待 T-001 模块化)。
|
- 已完成:T-000(正式代码包结构);单账号能力以脚本形式存在,待 T-001 模块化。
|
||||||
- 正在进行:无。
|
- 正在进行:无。
|
||||||
- 下一个可领取任务:**T-000(正式代码包结构)**。先创建 `app/`、迁入 `cdp.py`、新增 `main.py`/`app/__main__.py`,再开始 T-001/T-002/T-003。
|
- 下一个可领取任务:**T-001(`app/editor.py`:改标题/换封面/点更新/登录检测/采集/apply_task)**。虽然 T-002/T-003 也依赖满足,但任务领取规则固定为“取 `06-tasks.md` 中第一个 TODO 且依赖均 DONE 的任务”,因此当前不能任选。
|
||||||
|
|
||||||
## 当前可运行内容
|
## 当前可运行内容
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 语法检查(T-000 后)
|
# 语法检查(T-000 后;本机优先用 py -3)
|
||||||
python -m compileall app main.py
|
py -3 -m compileall app main.py
|
||||||
|
|
||||||
|
# 当前入口占位
|
||||||
|
python main.py
|
||||||
|
py -3 -m app
|
||||||
|
|
||||||
# 单元测试(T-006 完成且 tests/ 存在后)
|
# 单元测试(T-006 完成且 tests/ 存在后)
|
||||||
python -m unittest discover -s tests
|
python -m unittest discover -s tests
|
||||||
@@ -74,6 +79,7 @@ set UPDATE=1 && python prototypes/demo.py
|
|||||||
- 已 `pip install websocket-client requests`。
|
- 已 `pip install websocket-client requests`。
|
||||||
- PySide6 当前环境已可导入(验证版本 6.5.3);GUI 实现固定使用 PySide6。
|
- PySide6 当前环境已可导入(验证版本 6.5.3);GUI 实现固定使用 PySide6。
|
||||||
- 默认连 `127.0.0.1:9222`(开发期可用 `CDP_HOST` 指向 WSL 转发的 `192.168.0.224:9333`)。
|
- 默认连 `127.0.0.1:9222`(开发期可用 `CDP_HOST` 指向 WSL 转发的 `192.168.0.224:9333`)。
|
||||||
|
- 本机 `python` 当前指向 `C:\Python37\python.exe`(3.7.9,isolated,不符合 Python 3.10+ 要求且 `python -m app` 不搜索当前目录);开发/验证优先用 `py -3`(当前 3.14.4)或确认 `python` 已指向 3.10+。
|
||||||
|
|
||||||
## 开始编码前检查
|
## 开始编码前检查
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""cmshopee application entry point."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
if PROJECT_ROOT not in sys.path:
|
||||||
|
sys.path.insert(0, PROJECT_ROOT)
|
||||||
|
|
||||||
|
from app.gui import main
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -224,4 +224,13 @@
|
|||||||
- 正式启动入口为 `python main.py`,开发/包入口为 `python -m app`。
|
- 正式启动入口为 `python main.py`,开发/包入口为 `python -m app`。
|
||||||
- 下一步:按任务看板领取 T-000。
|
- 下一步:按任务看板领取 T-000。
|
||||||
|
|
||||||
|
## 【2026-06-26】T-000 正式代码包结构
|
||||||
|
|
||||||
|
- 状态:DONE
|
||||||
|
- 变更:创建 `app/` 包;将根目录 `cdp.py` 迁入 `app/cdp.py`;新增 `app/__init__.py`、`app/__main__.py`、`app/gui.py` 占位入口、根目录 `main.py`;修改 `prototypes/demo.py` 改为从项目根导入 `app.cdp`;同步 `docs/06-tasks.md` 与 `docs/current-state.md`。
|
||||||
|
- 验证:`py -3 -m compileall app main.py` 通过;`python main.py` 输出 GUI 未实现提示并退出;`py -3 main.py` 输出同样提示并退出;`py -3 -m app` 输出同样提示并退出;`py -3 -c "import prototypes.demo"` 通过。
|
||||||
|
- 决策:`app/gui.py` 只保留最小入口占位,不提前实现 PySide6 主窗口,完整 GUI 留给 T-104;`app/cdp.py` 对 `requests` / `websocket-client` 改为按需导入,使包导入不依赖外部库,真正连接 CDP 时仍要求安装依赖。
|
||||||
|
- 注意:本机 `python` 指向 Python 3.7.9 isolated,不符合项目 Python 3.10+ 要求,且 `python -m app` 不搜索当前目录;本轮用 `py -3`(Python 3.14.4)完成包入口验证。
|
||||||
|
- 下一步:按任务看板领取 T-001。
|
||||||
|
|
||||||
<!-- 新一轮从这里向下追加记录。 -->
|
<!-- 新一轮从这里向下追加记录。 -->
|
||||||
|
|||||||
+5
-3
@@ -14,9 +14,11 @@ import sys
|
|||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
|
||||||
# 确保能 import 同目录的 cdp.py(某些 Windows Python 启动方式不会自动把脚本目录加进 sys.path)
|
# 确保从项目根运行时能导入正式 CDP 包。
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
from cdp import CDP, http_get, find_product_tab, create_tab
|
if PROJECT_ROOT not in sys.path:
|
||||||
|
sys.path.insert(0, PROJECT_ROOT)
|
||||||
|
from app.cdp import CDP, http_get, find_product_tab, create_tab
|
||||||
|
|
||||||
ITEM_ID = os.environ.get("ITEM_ID", "51100639510")
|
ITEM_ID = os.environ.get("ITEM_ID", "51100639510")
|
||||||
IMG_WIN = os.environ.get("IMG_WIN", r"D:\chengma\cmshopee\1_TY030.jpg")
|
IMG_WIN = os.environ.get("IMG_WIN", r"D:\chengma\cmshopee\1_TY030.jpg")
|
||||||
|
|||||||
Reference in New Issue
Block a user