# JDCat
JDCat 是一个 Python 包装工具,提供命令行入口来启动本地安全测试助手服务。该服务是 sensitive-check-local 项目的 FastAPI 服务封装,用于安全测试中的代理和数据捕获。
## 项目说明
- **功能**:包装并启动本地助手 FastAPI 服务,提供安全测试所需的代理功能
- **技术栈**:Python 3.10-3.14, FastAPI, uvicorn, mitmproxy
- **默认端口**:17866
- **业务逻辑**:完全来自 sensitive-check-local 项目,本包仅提供 CLI 入口
## 本地调试
### 开发环境安装
```bash
# 克隆项目并进入 jdcat 目录
cd jdcat
# 安装开发依赖(可编辑模式)
uv pip install -e .
```
### 本地开发调试
```bash
# 使用本地代码运行(推荐开发方式,默认会自动打开浏览器)
uv run python -m jdcat start
# 或者直接运行模块
python -m jdcat start
# 启动但不自动打开浏览器
uv run python -m jdcat start --no-open-browser
# 停止服务
uv run python -m jdcat stop
```
### 构建测试
```bash
# 构建包
uv pip install -U build
python -m build
# 验证构建结果
ls -la dist/
```
## 分发服务
### 一键构建和发布
```bash
# 在 jdcat 目录下执行构建脚本
./build_and_publish.sh
```
该脚本会自动完成:
- 清理之前的构建文件
- 安装构建工具(build、twine)
- 构建分发包(wheel 和 tar.gz)
- 检查包完整性
- 可选择上传到 PyPI 或 Test PyPI
## 分发后使用
### 安装方式
**使用 pip(推荐)**
```bash
# 安装最新版本
pip install jdcat
# 升级到最新版本
pip install --upgrade jdcat
# 安装指定版本
pip install jdcat==1.0.4
```
**使用 pipx(隔离安装)**
```bash
# 安装 pipx
python -m pip install --user pipx
python -m pipx ensurepath
# 安装 jdcat 最新版本
pipx install jdcat
# 升级 jdcat 到最新版本
pipx upgrade jdcat
# 强制重新安装最新版本
pipx uninstall jdcat && pipx install jdcat
```
**使用 uv(快速安装)**
```bash
# 直接运行最新版本(无需安装)
uv run --from jdcat jdcat start
# 安装到全局
uv tool install jdcat
# 升级到最新版本
uv tool upgrade jdcat
```
### 基本使用
```bash
# 启动服务(默认会自动打开浏览器到 http://aq.jdtest.net:8007/)
jdcat start
# 启动服务但不自动打开浏览器
jdcat start --no-open-browser
# 启动服务并指定自定义浏览器URL
jdcat start --browser-url "http://localhost:8007/"
# 指定端口启动服务
jdcat start --port 18000
# 停止服务
jdcat stop
# 查看帮助
jdcat --help
# 检查版本
jdcat --version
```
### 常见问题
**externally-managed-environment 错误**
- 原因:现代 Python 环境管理安全特性(PEP 668)
- 解决:使用 uv 或 pipx 安装,避免直接在系统 Python 中安装
```bash
# 推荐使用 uv
uv run --from jdcat jdcat start --port 17866
# 或使用 pipx
pipx install jdcat
```
**mitmdump 不存在**
- 原因:jdcat 依赖 mitmproxy 提供的 mitmdump 工具
- 解决方案:
1. **检查版本**:确保使用最新版本的 jdcat
```bash
# 检查当前版本
jdcat --version
# 升级到最新版本(当前:1.0.3)
pip install --upgrade jdcat
# 或使用 pipx
pipx upgrade jdcat
```
2. **重新安装**:完全重新安装 jdcat 和依赖
```bash
# 使用 pip
pip uninstall jdcat mitmproxy
pip install jdcat
# 使用 pipx
pipx uninstall jdcat
pipx install jdcat
```
3. **手动安装 mitmproxy**:
```bash
# macOS
brew install mitmproxy
# 使用 pip
pip install mitmproxy
# 验证安装
mitmdump --version
```
4. **使用 uv(推荐)**:
```bash
# 直接运行,自动处理依赖
uv run --from jdcat jdcat start
```
**端口占用**
- 解决:指定其他端口
```bash
jdcat start --port 18000
```
## 开源信息
- 作者:Sensitive Check Team
- 许可:详见 LICENSE 文件
- Python 版本:3.10 - 3.14
Raw data
{
"_id": null,
"home_page": null,
"name": "jdcat",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.15,>=3.10",
"maintainer_email": null,
"keywords": "security, proxy, sensitive-data, testing, mitmproxy",
"author": "Sensitive Check Team",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/16/ef/05d334286bde04e0b410366968d80033819b3af5ce1753b795032ec88c7b/jdcat-1.0.20.tar.gz",
"platform": null,
"description": "# JDCat\n\nJDCat \u662f\u4e00\u4e2a Python \u5305\u88c5\u5de5\u5177\uff0c\u63d0\u4f9b\u547d\u4ee4\u884c\u5165\u53e3\u6765\u542f\u52a8\u672c\u5730\u5b89\u5168\u6d4b\u8bd5\u52a9\u624b\u670d\u52a1\u3002\u8be5\u670d\u52a1\u662f sensitive-check-local \u9879\u76ee\u7684 FastAPI \u670d\u52a1\u5c01\u88c5\uff0c\u7528\u4e8e\u5b89\u5168\u6d4b\u8bd5\u4e2d\u7684\u4ee3\u7406\u548c\u6570\u636e\u6355\u83b7\u3002\n\n## \u9879\u76ee\u8bf4\u660e\n\n- **\u529f\u80fd**\uff1a\u5305\u88c5\u5e76\u542f\u52a8\u672c\u5730\u52a9\u624b FastAPI \u670d\u52a1\uff0c\u63d0\u4f9b\u5b89\u5168\u6d4b\u8bd5\u6240\u9700\u7684\u4ee3\u7406\u529f\u80fd\n- **\u6280\u672f\u6808**\uff1aPython 3.10-3.14, FastAPI, uvicorn, mitmproxy\n- **\u9ed8\u8ba4\u7aef\u53e3**\uff1a17866\n- **\u4e1a\u52a1\u903b\u8f91**\uff1a\u5b8c\u5168\u6765\u81ea sensitive-check-local \u9879\u76ee\uff0c\u672c\u5305\u4ec5\u63d0\u4f9b CLI \u5165\u53e3\n\n## \u672c\u5730\u8c03\u8bd5\n\n### \u5f00\u53d1\u73af\u5883\u5b89\u88c5\n```bash\n# \u514b\u9686\u9879\u76ee\u5e76\u8fdb\u5165 jdcat \u76ee\u5f55\ncd jdcat\n\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\uff08\u53ef\u7f16\u8f91\u6a21\u5f0f\uff09\nuv pip install -e .\n```\n\n### \u672c\u5730\u5f00\u53d1\u8c03\u8bd5\n```bash\n# \u4f7f\u7528\u672c\u5730\u4ee3\u7801\u8fd0\u884c\uff08\u63a8\u8350\u5f00\u53d1\u65b9\u5f0f\uff0c\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u6253\u5f00\u6d4f\u89c8\u5668\uff09\nuv run python -m jdcat start\n\n# \u6216\u8005\u76f4\u63a5\u8fd0\u884c\u6a21\u5757\npython -m jdcat start\n\n# \u542f\u52a8\u4f46\u4e0d\u81ea\u52a8\u6253\u5f00\u6d4f\u89c8\u5668\nuv run python -m jdcat start --no-open-browser\n\n# \u505c\u6b62\u670d\u52a1\nuv run python -m jdcat stop\n```\n\n### \u6784\u5efa\u6d4b\u8bd5\n```bash\n# \u6784\u5efa\u5305\nuv pip install -U build\npython -m build\n\n# \u9a8c\u8bc1\u6784\u5efa\u7ed3\u679c\nls -la dist/\n```\n\n## \u5206\u53d1\u670d\u52a1\n\n### \u4e00\u952e\u6784\u5efa\u548c\u53d1\u5e03\n```bash\n# \u5728 jdcat \u76ee\u5f55\u4e0b\u6267\u884c\u6784\u5efa\u811a\u672c\n./build_and_publish.sh\n```\n\n\u8be5\u811a\u672c\u4f1a\u81ea\u52a8\u5b8c\u6210\uff1a\n- \u6e05\u7406\u4e4b\u524d\u7684\u6784\u5efa\u6587\u4ef6\n- \u5b89\u88c5\u6784\u5efa\u5de5\u5177\uff08build\u3001twine\uff09\n- \u6784\u5efa\u5206\u53d1\u5305\uff08wheel \u548c tar.gz\uff09\n- \u68c0\u67e5\u5305\u5b8c\u6574\u6027\n- \u53ef\u9009\u62e9\u4e0a\u4f20\u5230 PyPI \u6216 Test PyPI\n\n## \u5206\u53d1\u540e\u4f7f\u7528\n\n### \u5b89\u88c5\u65b9\u5f0f\n\n**\u4f7f\u7528 pip\uff08\u63a8\u8350\uff09**\n\n```bash\n# \u5b89\u88c5\u6700\u65b0\u7248\u672c\npip install jdcat\n\n# \u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c\npip install --upgrade jdcat\n\n# \u5b89\u88c5\u6307\u5b9a\u7248\u672c\npip install jdcat==1.0.4\n```\n\n**\u4f7f\u7528 pipx\uff08\u9694\u79bb\u5b89\u88c5\uff09**\n\n```bash\n# \u5b89\u88c5 pipx\npython -m pip install --user pipx\npython -m pipx ensurepath\n\n# \u5b89\u88c5 jdcat \u6700\u65b0\u7248\u672c\npipx install jdcat\n\n# \u5347\u7ea7 jdcat \u5230\u6700\u65b0\u7248\u672c\npipx upgrade jdcat\n\n# \u5f3a\u5236\u91cd\u65b0\u5b89\u88c5\u6700\u65b0\u7248\u672c\npipx uninstall jdcat && pipx install jdcat\n```\n\n**\u4f7f\u7528 uv\uff08\u5feb\u901f\u5b89\u88c5\uff09**\n\n```bash\n# \u76f4\u63a5\u8fd0\u884c\u6700\u65b0\u7248\u672c\uff08\u65e0\u9700\u5b89\u88c5\uff09\nuv run --from jdcat jdcat start\n\n# \u5b89\u88c5\u5230\u5168\u5c40\nuv tool install jdcat\n\n# \u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c\nuv tool upgrade jdcat\n```\n\n### \u57fa\u672c\u4f7f\u7528\n\n```bash\n# \u542f\u52a8\u670d\u52a1\uff08\u9ed8\u8ba4\u4f1a\u81ea\u52a8\u6253\u5f00\u6d4f\u89c8\u5668\u5230 http://aq.jdtest.net:8007/\uff09\njdcat start\n\n# \u542f\u52a8\u670d\u52a1\u4f46\u4e0d\u81ea\u52a8\u6253\u5f00\u6d4f\u89c8\u5668\njdcat start --no-open-browser\n\n# \u542f\u52a8\u670d\u52a1\u5e76\u6307\u5b9a\u81ea\u5b9a\u4e49\u6d4f\u89c8\u5668URL\njdcat start --browser-url \"http://localhost:8007/\"\n\n# \u6307\u5b9a\u7aef\u53e3\u542f\u52a8\u670d\u52a1\njdcat start --port 18000\n\n# \u505c\u6b62\u670d\u52a1\njdcat stop\n\n# \u67e5\u770b\u5e2e\u52a9\njdcat --help\n\n# \u68c0\u67e5\u7248\u672c\njdcat --version\n```\n\n### \u5e38\u89c1\u95ee\u9898\n\n**externally-managed-environment \u9519\u8bef**\n- \u539f\u56e0\uff1a\u73b0\u4ee3 Python \u73af\u5883\u7ba1\u7406\u5b89\u5168\u7279\u6027\uff08PEP 668\uff09\n- \u89e3\u51b3\uff1a\u4f7f\u7528 uv \u6216 pipx \u5b89\u88c5\uff0c\u907f\u514d\u76f4\u63a5\u5728\u7cfb\u7edf Python \u4e2d\u5b89\u88c5\n```bash\n# \u63a8\u8350\u4f7f\u7528 uv\nuv run --from jdcat jdcat start --port 17866\n\n# \u6216\u4f7f\u7528 pipx\npipx install jdcat\n```\n\n**mitmdump \u4e0d\u5b58\u5728**\n- \u539f\u56e0\uff1ajdcat \u4f9d\u8d56 mitmproxy \u63d0\u4f9b\u7684 mitmdump \u5de5\u5177\n- \u89e3\u51b3\u65b9\u6848\uff1a\n 1. **\u68c0\u67e5\u7248\u672c**\uff1a\u786e\u4fdd\u4f7f\u7528\u6700\u65b0\u7248\u672c\u7684 jdcat\n ```bash\n # \u68c0\u67e5\u5f53\u524d\u7248\u672c\n jdcat --version\n \n # \u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c\uff08\u5f53\u524d\uff1a1.0.3\uff09\n pip install --upgrade jdcat\n \n # \u6216\u4f7f\u7528 pipx\n pipx upgrade jdcat\n ```\n 2. **\u91cd\u65b0\u5b89\u88c5**\uff1a\u5b8c\u5168\u91cd\u65b0\u5b89\u88c5 jdcat \u548c\u4f9d\u8d56\n ```bash\n # \u4f7f\u7528 pip\n pip uninstall jdcat mitmproxy\n pip install jdcat\n \n # \u4f7f\u7528 pipx\n pipx uninstall jdcat\n pipx install jdcat\n ```\n 3. **\u624b\u52a8\u5b89\u88c5 mitmproxy**\uff1a\n ```bash\n # macOS\n brew install mitmproxy\n \n # \u4f7f\u7528 pip\n pip install mitmproxy\n \n # \u9a8c\u8bc1\u5b89\u88c5\n mitmdump --version\n ```\n 4. **\u4f7f\u7528 uv\uff08\u63a8\u8350\uff09**\uff1a\n ```bash\n # \u76f4\u63a5\u8fd0\u884c\uff0c\u81ea\u52a8\u5904\u7406\u4f9d\u8d56\n uv run --from jdcat jdcat start\n ```\n\n**\u7aef\u53e3\u5360\u7528**\n- \u89e3\u51b3\uff1a\u6307\u5b9a\u5176\u4ed6\u7aef\u53e3\n```bash\njdcat start --port 18000\n```\n\n## \u5f00\u6e90\u4fe1\u606f\n\n- \u4f5c\u8005\uff1aSensitive Check Team\n- \u8bb8\u53ef\uff1a\u8be6\u89c1 LICENSE \u6587\u4ef6\n- Python \u7248\u672c\uff1a3.10 - 3.14\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u4fee\u590d\u8d8a\u6743\u6d4b\u8bd5\u5224\u65ad\u903b\u8f91",
"version": "1.0.20",
"project_urls": {
"Homepage": "https://github.com/sensitive-check/jdcat",
"Issues": "https://github.com/sensitive-check/jdcat/issues",
"Repository": "https://github.com/sensitive-check/jdcat"
},
"split_keywords": [
"security",
" proxy",
" sensitive-data",
" testing",
" mitmproxy"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0d83bbeeffb35c103e0ab3ad39ab0399605da23e2292717bf55d38a8b3991866",
"md5": "66a896c82d9c6891dc047808fe7bc359",
"sha256": "65e728736ff6642fca14c9ecca1c2303b91a39f578a2a1d0e14960546c018d14"
},
"downloads": -1,
"filename": "jdcat-1.0.20-py3-none-any.whl",
"has_sig": false,
"md5_digest": "66a896c82d9c6891dc047808fe7bc359",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.15,>=3.10",
"size": 95566,
"upload_time": "2025-10-24T07:08:26",
"upload_time_iso_8601": "2025-10-24T07:08:26.445451Z",
"url": "https://files.pythonhosted.org/packages/0d/83/bbeeffb35c103e0ab3ad39ab0399605da23e2292717bf55d38a8b3991866/jdcat-1.0.20-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "16ef05d334286bde04e0b410366968d80033819b3af5ce1753b795032ec88c7b",
"md5": "32a1e5cab2c1be03f7fc70fe0d618006",
"sha256": "89abbe5a53fa490ae5c785c937f41ad522f0e74c4d95d18c0e6cf7907cff734d"
},
"downloads": -1,
"filename": "jdcat-1.0.20.tar.gz",
"has_sig": false,
"md5_digest": "32a1e5cab2c1be03f7fc70fe0d618006",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.15,>=3.10",
"size": 84158,
"upload_time": "2025-10-24T07:08:29",
"upload_time_iso_8601": "2025-10-24T07:08:29.929550Z",
"url": "https://files.pythonhosted.org/packages/16/ef/05d334286bde04e0b410366968d80033819b3af5ce1753b795032ec88c7b/jdcat-1.0.20.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-24 07:08:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "sensitive-check",
"github_project": "jdcat",
"github_not_found": true,
"lcname": "jdcat"
}