统一项目路径并修复虚拟环境引用
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
douyu_login_py/
|
||||
live-hub-py/
|
||||
├── core/ # 核心业务逻辑
|
||||
│ ├── models.py # Account, ProxyConfig 数据类
|
||||
│ ├── douyu/ # 斗鱼登录模块
|
||||
@@ -53,7 +53,7 @@ douyu_login_py/
|
||||
应用宝充值 Worker 已合并到 Web 应用容器中,内部仅监听 `127.0.0.1:8810`,不发布额外端口。任务数据与应用数据一起保存在 `data/yyb-worker-jobs/`。
|
||||
|
||||
```bash
|
||||
cd /opt/douyu_login_py
|
||||
cd /opt/live-hub-py
|
||||
python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
|
||||
```
|
||||
|
||||
|
||||
@@ -6,10 +6,10 @@ set -euo pipefail
|
||||
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
# 目录改名后,旧 shell 可能仍携带 douyu_login_py/.venv;交给 uv 选择当前项目环境。
|
||||
if [ "${VIRTUAL_ENV:-}" != "$ROOT_DIR/.venv" ]; then
|
||||
unset VIRTUAL_ENV
|
||||
fi
|
||||
# 目录改名后,旧 shell 可能仍携带旧项目的 VIRTUAL_ENV。
|
||||
# 开发脚本始终使用当前仓库的环境,不要求每次手工指定或重新激活环境。
|
||||
unset VIRTUAL_ENV
|
||||
export UV_PROJECT_ENVIRONMENT="$ROOT_DIR/.venv"
|
||||
|
||||
# 使用新的项目标识;可通过环境变量覆盖。
|
||||
COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-live-hub-py}"
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
[project]
|
||||
name = "douyu-login-py"
|
||||
name = "live-hub-py"
|
||||
version = "0.2.1"
|
||||
description = "直播账号运营 Web 后台"
|
||||
readme = "README.md"
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { JSDOM, ResourceLoader } from 'jsdom';
|
||||
import { patchEnvironment } from './scripts/jsdom-patch-env.mjs';
|
||||
|
||||
const ROOT = '/Users/yml/codes/douyu_login_py';
|
||||
// Resolve the repository from this file so the probe works after a checkout
|
||||
// is renamed or moved to another host.
|
||||
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..');
|
||||
const taskId = process.argv[2] || '142265ef3d874ce6';
|
||||
const out = `${ROOT}/data/yyb-worker-dev/${taskId}/jsdom-order`;
|
||||
const goodsUrl = JSON.parse(fs.readFileSync(`${out}/device-fp.json`, 'utf8')).goods_url;
|
||||
const pageInfoPath = process.argv[3] || `${out}/web-page-info-response.json`;
|
||||
const out = path.join(ROOT, 'data', 'yyb-worker-dev', taskId, 'jsdom-order');
|
||||
const goodsUrl = JSON.parse(fs.readFileSync(path.join(out, 'device-fp.json'), 'utf8')).goods_url;
|
||||
const pageInfoPath = process.argv[3] || path.join(out, 'web-page-info-response.json');
|
||||
const pageInfo = fs.existsSync(pageInfoPath)
|
||||
? fs.readFileSync(pageInfoPath, 'utf8')
|
||||
: '{"ret":0,"msg":"","info":{}}';
|
||||
@@ -14,7 +18,7 @@ const pageInfo = fs.existsSync(pageInfoPath)
|
||||
const captured = [];
|
||||
const requests = [];
|
||||
const pageErrors = [];
|
||||
const dom = new JSDOM(fs.readFileSync(`${out}/goods.html`, 'utf8'), {
|
||||
const dom = new JSDOM(fs.readFileSync(path.join(out, 'goods.html'), 'utf8'), {
|
||||
url: goodsUrl,
|
||||
referrer: 'https://z.iwan.yyb.qq.com/',
|
||||
pretendToBeVisual: true,
|
||||
|
||||
@@ -224,73 +224,6 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/15/ea/81cf3858b256494b31a554cf76bbd345def3ea7e7a1a592cc515633b4e28/curl_cffi-0.16.0-cp313-abi3-android_24_arm64_v8a.whl", hash = "sha256:06b1c7e07af8ff7c4c5ce4086ea89cc582ebff9adff4a37cfffa5f5de5d5b943", size = 8603463, upload-time = "2026-08-01T13:44:55.003Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "douyu-login-py"
|
||||
version = "0.2.1"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "alembic" },
|
||||
{ name = "bcrypt" },
|
||||
{ name = "curl-cffi" },
|
||||
{ name = "fastapi" },
|
||||
{ name = "loguru" },
|
||||
{ name = "numpy" },
|
||||
{ name = "onnxruntime" },
|
||||
{ name = "opencv-python-headless" },
|
||||
{ name = "pillow" },
|
||||
{ name = "pycryptodome" },
|
||||
{ name = "pydantic" },
|
||||
{ name = "pyexecjs" },
|
||||
{ name = "pymysql" },
|
||||
{ name = "python-jose", extra = ["cryptography"] },
|
||||
{ name = "python-multipart" },
|
||||
{ name = "requests", extra = ["socks"] },
|
||||
{ name = "scipy" },
|
||||
{ name = "segno" },
|
||||
{ name = "sqlalchemy" },
|
||||
{ name = "uvicorn", extra = ["standard"] },
|
||||
{ name = "websockets" },
|
||||
]
|
||||
|
||||
[package.dev-dependencies]
|
||||
dev = [
|
||||
{ name = "pyright" },
|
||||
{ name = "pytest" },
|
||||
{ name = "ruff" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "alembic", specifier = ">=1.18.4" },
|
||||
{ name = "bcrypt", specifier = ">=4.0.0" },
|
||||
{ name = "curl-cffi", specifier = ">=0.13" },
|
||||
{ name = "fastapi", specifier = ">=0.110.0" },
|
||||
{ name = "loguru", specifier = ">=0.7.0" },
|
||||
{ name = "numpy", specifier = ">=1.24.0" },
|
||||
{ name = "onnxruntime", specifier = ">=1.18.0" },
|
||||
{ name = "opencv-python-headless", specifier = ">=4.8.0" },
|
||||
{ name = "pillow", specifier = ">=10.0.0" },
|
||||
{ name = "pycryptodome", specifier = ">=3.19.0" },
|
||||
{ name = "pydantic", specifier = ">=2.0.0" },
|
||||
{ name = "pyexecjs", specifier = ">=1.5.1" },
|
||||
{ name = "pymysql", specifier = ">=1.1,<2" },
|
||||
{ name = "python-jose", extras = ["cryptography"], specifier = ">=3.3.0" },
|
||||
{ name = "python-multipart", specifier = ">=0.0.9" },
|
||||
{ name = "requests", extras = ["socks"], specifier = ">=2.31.0" },
|
||||
{ name = "scipy", specifier = ">=1.13.0" },
|
||||
{ name = "segno", specifier = ">=1.6" },
|
||||
{ name = "sqlalchemy", specifier = ">=2.0.0" },
|
||||
{ name = "uvicorn", extras = ["standard"], specifier = ">=0.27.0" },
|
||||
{ name = "websockets", specifier = ">=16.0" },
|
||||
]
|
||||
|
||||
[package.metadata.requires-dev]
|
||||
dev = [
|
||||
{ name = "pyright", specifier = ">=1.1.411" },
|
||||
{ name = "pytest", specifier = ">=9.1.1" },
|
||||
{ name = "ruff", specifier = ">=0.12.0" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ecdsa"
|
||||
version = "0.19.2"
|
||||
@@ -385,6 +318,73 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "live-hub-py"
|
||||
version = "0.2.1"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "alembic" },
|
||||
{ name = "bcrypt" },
|
||||
{ name = "curl-cffi" },
|
||||
{ name = "fastapi" },
|
||||
{ name = "loguru" },
|
||||
{ name = "numpy" },
|
||||
{ name = "onnxruntime" },
|
||||
{ name = "opencv-python-headless" },
|
||||
{ name = "pillow" },
|
||||
{ name = "pycryptodome" },
|
||||
{ name = "pydantic" },
|
||||
{ name = "pyexecjs" },
|
||||
{ name = "pymysql" },
|
||||
{ name = "python-jose", extra = ["cryptography"] },
|
||||
{ name = "python-multipart" },
|
||||
{ name = "requests", extra = ["socks"] },
|
||||
{ name = "scipy" },
|
||||
{ name = "segno" },
|
||||
{ name = "sqlalchemy" },
|
||||
{ name = "uvicorn", extra = ["standard"] },
|
||||
{ name = "websockets" },
|
||||
]
|
||||
|
||||
[package.dev-dependencies]
|
||||
dev = [
|
||||
{ name = "pyright" },
|
||||
{ name = "pytest" },
|
||||
{ name = "ruff" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "alembic", specifier = ">=1.18.4" },
|
||||
{ name = "bcrypt", specifier = ">=4.0.0" },
|
||||
{ name = "curl-cffi", specifier = ">=0.13" },
|
||||
{ name = "fastapi", specifier = ">=0.110.0" },
|
||||
{ name = "loguru", specifier = ">=0.7.0" },
|
||||
{ name = "numpy", specifier = ">=1.24.0" },
|
||||
{ name = "onnxruntime", specifier = ">=1.18.0" },
|
||||
{ name = "opencv-python-headless", specifier = ">=4.8.0" },
|
||||
{ name = "pillow", specifier = ">=10.0.0" },
|
||||
{ name = "pycryptodome", specifier = ">=3.19.0" },
|
||||
{ name = "pydantic", specifier = ">=2.0.0" },
|
||||
{ name = "pyexecjs", specifier = ">=1.5.1" },
|
||||
{ name = "pymysql", specifier = ">=1.1,<2" },
|
||||
{ name = "python-jose", extras = ["cryptography"], specifier = ">=3.3.0" },
|
||||
{ name = "python-multipart", specifier = ">=0.0.9" },
|
||||
{ name = "requests", extras = ["socks"], specifier = ">=2.31.0" },
|
||||
{ name = "scipy", specifier = ">=1.13.0" },
|
||||
{ name = "segno", specifier = ">=1.6" },
|
||||
{ name = "sqlalchemy", specifier = ">=2.0.0" },
|
||||
{ name = "uvicorn", extras = ["standard"], specifier = ">=0.27.0" },
|
||||
{ name = "websockets", specifier = ">=16.0" },
|
||||
]
|
||||
|
||||
[package.metadata.requires-dev]
|
||||
dev = [
|
||||
{ name = "pyright", specifier = ">=1.1.411" },
|
||||
{ name = "pytest", specifier = ">=9.1.1" },
|
||||
{ name = "ruff", specifier = ">=0.12.0" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "loguru"
|
||||
version = "0.7.3"
|
||||
|
||||
@@ -19,6 +19,6 @@ def get_app_version() -> str:
|
||||
return version
|
||||
|
||||
try:
|
||||
return package_version("douyu-login-py")
|
||||
return package_version("live-hub-py")
|
||||
except PackageNotFoundError:
|
||||
return "0.0.0"
|
||||
|
||||
Reference in New Issue
Block a user