统一项目路径并修复虚拟环境引用
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
## 项目结构
|
## 项目结构
|
||||||
|
|
||||||
```
|
```
|
||||||
douyu_login_py/
|
live-hub-py/
|
||||||
├── core/ # 核心业务逻辑
|
├── core/ # 核心业务逻辑
|
||||||
│ ├── models.py # Account, ProxyConfig 数据类
|
│ ├── models.py # Account, ProxyConfig 数据类
|
||||||
│ ├── douyu/ # 斗鱼登录模块
|
│ ├── douyu/ # 斗鱼登录模块
|
||||||
@@ -53,7 +53,7 @@ douyu_login_py/
|
|||||||
应用宝充值 Worker 已合并到 Web 应用容器中,内部仅监听 `127.0.0.1:8810`,不发布额外端口。任务数据与应用数据一起保存在 `data/yyb-worker-jobs/`。
|
应用宝充值 Worker 已合并到 Web 应用容器中,内部仅监听 `127.0.0.1:8810`,不发布额外端口。任务数据与应用数据一起保存在 `data/yyb-worker-jobs/`。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /opt/douyu_login_py
|
cd /opt/live-hub-py
|
||||||
python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
|
python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ set -euo pipefail
|
|||||||
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
cd "$ROOT_DIR"
|
cd "$ROOT_DIR"
|
||||||
|
|
||||||
# 目录改名后,旧 shell 可能仍携带 douyu_login_py/.venv;交给 uv 选择当前项目环境。
|
# 目录改名后,旧 shell 可能仍携带旧项目的 VIRTUAL_ENV。
|
||||||
if [ "${VIRTUAL_ENV:-}" != "$ROOT_DIR/.venv" ]; then
|
# 开发脚本始终使用当前仓库的环境,不要求每次手工指定或重新激活环境。
|
||||||
unset VIRTUAL_ENV
|
unset VIRTUAL_ENV
|
||||||
fi
|
export UV_PROJECT_ENVIRONMENT="$ROOT_DIR/.venv"
|
||||||
|
|
||||||
# 使用新的项目标识;可通过环境变量覆盖。
|
# 使用新的项目标识;可通过环境变量覆盖。
|
||||||
COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-live-hub-py}"
|
COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-live-hub-py}"
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "douyu-login-py"
|
name = "live-hub-py"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
description = "直播账号运营 Web 后台"
|
description = "直播账号运营 Web 后台"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
|
import path from 'node:path';
|
||||||
|
import { fileURLToPath } from 'node:url';
|
||||||
import { JSDOM, ResourceLoader } from 'jsdom';
|
import { JSDOM, ResourceLoader } from 'jsdom';
|
||||||
import { patchEnvironment } from './scripts/jsdom-patch-env.mjs';
|
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 taskId = process.argv[2] || '142265ef3d874ce6';
|
||||||
const out = `${ROOT}/data/yyb-worker-dev/${taskId}/jsdom-order`;
|
const out = path.join(ROOT, 'data', 'yyb-worker-dev', taskId, 'jsdom-order');
|
||||||
const goodsUrl = JSON.parse(fs.readFileSync(`${out}/device-fp.json`, 'utf8')).goods_url;
|
const goodsUrl = JSON.parse(fs.readFileSync(path.join(out, 'device-fp.json'), 'utf8')).goods_url;
|
||||||
const pageInfoPath = process.argv[3] || `${out}/web-page-info-response.json`;
|
const pageInfoPath = process.argv[3] || path.join(out, 'web-page-info-response.json');
|
||||||
const pageInfo = fs.existsSync(pageInfoPath)
|
const pageInfo = fs.existsSync(pageInfoPath)
|
||||||
? fs.readFileSync(pageInfoPath, 'utf8')
|
? fs.readFileSync(pageInfoPath, 'utf8')
|
||||||
: '{"ret":0,"msg":"","info":{}}';
|
: '{"ret":0,"msg":"","info":{}}';
|
||||||
@@ -14,7 +18,7 @@ const pageInfo = fs.existsSync(pageInfoPath)
|
|||||||
const captured = [];
|
const captured = [];
|
||||||
const requests = [];
|
const requests = [];
|
||||||
const pageErrors = [];
|
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,
|
url: goodsUrl,
|
||||||
referrer: 'https://z.iwan.yyb.qq.com/',
|
referrer: 'https://z.iwan.yyb.qq.com/',
|
||||||
pretendToBeVisual: true,
|
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" },
|
{ 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]]
|
[[package]]
|
||||||
name = "ecdsa"
|
name = "ecdsa"
|
||||||
version = "0.19.2"
|
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" },
|
{ 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]]
|
[[package]]
|
||||||
name = "loguru"
|
name = "loguru"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
|
|||||||
@@ -19,6 +19,6 @@ def get_app_version() -> str:
|
|||||||
return version
|
return version
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return package_version("douyu-login-py")
|
return package_version("live-hub-py")
|
||||||
except PackageNotFoundError:
|
except PackageNotFoundError:
|
||||||
return "0.0.0"
|
return "0.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user