Skip to content

Installation

元气码农少女酱 edited this page Aug 20, 2026 · 4 revisions

安装

最小安装

pip install ipclick

装完是 17 个包,只带默认适配器 curl_cffi。这是刻意的:绝大多数用途只需要发 HTTP 请求,不该为此拖进四个浏览器内核和上 G 的浏览器本体。

核心依赖 10 项:grpciogrpcio-health-checkingprotobufcurl-cfficlickfake-useragentlogurupython-boxuuid-utilstyping-extensions

可选组件(extras)

pip install "ipclick[niquests]"       # HTTP/2 + HTTP/3 适配器
pip install "ipclick[camoufox]"       # 浏览器渲染:Firefox 反检测(Linux/macOS 默认)
pip install "ipclick[drissionpage]"   # 浏览器渲染:CDP 直连(Windows 默认)
pip install "ipclick[patchright]"     # 浏览器渲染:Chromium 反检测
pip install "ipclick[playwright]"     # 浏览器渲染:原版,最稳

按平台打包好的组合:

pip install "ipclick[win]"     # curl_cffi + DrissionPage
pip install "ipclick[linux]"   # curl_cffi + camoufox + patchright

多个可以一起装:pip install "ipclick[niquests,camoufox]"

zsh 用户注意:方括号会被当成 glob,必须加引号 —— pip install "ipclick[niquests]"

也可以在 Web 管理端点按钮装/components 页列出全部五个组件的两级安装 状态,就地装 / 卸、下载浏览器本体,装完不用重启进程。见 Web 管理端 · 组件

版本区间

各 extra 的版本区间写在 pyproject.toml 里。有一条约束值得单独知道:

camoufox 钉着 playwright<1.61,所以 [camoufox][playwright] 真的互斥。 这一点在 pyproject.toml[tool.uv].conflicts 里显式声明了出来,uv 会为两者 各解一份依赖——于是 [playwright] 能跟上上游(当前 >=1.62.0),同时 [camoufox] 仍然装得上它自己那份 playwright<1.61

代价是 --all-extras 用不了(它会同时点亮这两个互斥 extra 而直接失败), 装可选适配器时要逐个 --extra 列出。

只装 [playwright] 不装 camoufox 的话,区间上限 <2.0.0 允许你拿到最新版。

为什么没有 [all]

四个浏览器内核全装是 70+ 个包和上 G 的浏览器本体,而一台机器只会用其中一个。 提供 [all] 只会让人不假思索地装上,然后抱怨包太大。

各组合的实际体积

命令 包数
pip install ipclick 17
+ [niquests] 22
+ [niquests,playwright] 27
+ [win](DrissionPage) 20
+ [linux](camoufox + patchright) 33

(不含浏览器本体,见下。)

浏览器引擎是两步安装

pip install 只装 Python 包(几 MB)。浏览器本体要单独准备

python -m camoufox fetch        # camoufox:下载它自己那份 Firefox,约 1 GB → ~/.cache/camoufox
patchright install chromium     # patchright
playwright install chromium     # playwright
# DrissionPage 用本机已装的 Chrome/Chromium,不用额外下载

只做第一步的话,ipclick config-info 与 Web 管理端会明确显示 「包已装,浏览器本体未就绪」,请求会直接报 FAILED_PRECONDITION 并告诉你该跑哪条命令。

Web 管理端的 /components 页也能直接点「下载浏览器本体」——camoufox fetch 要下约 1 GB,跑在后台并实时显示输出,不会把页面卡住。

卸载的语义pip uninstall camoufox 不会删掉 ~/.cache/camoufox 里那 1 GB 浏览器本体。Web 端的「卸载」同样只卸 Python 包,但会把本体的路径和体积摆出来告诉你 ——不说的话容易以为空间已经释放了。真要回收就自己删那个目录。

为什么不让它自动下载?

camoufox 的 API 默认行为就是「缺本体就当场下」(camoufox_path(download_if_missing=True))。 而那一刻已经在 gRPC 的请求处理线程上:第一个请求会卡着下 1 GB 然后超时,超时返回后 下载还在后台跑,并发的多个首请求还可能各自触发一次。所以 IPClick 自己解析路径并显式 传给它,缺了就报错。

连「查一下装没装」也不能走它的接口——launch_path() 内部同样会触发下载, 光渲染一次 Web 管理端总览页就够了。

复用系统已装的浏览器

playwright / patchright / DrissionPage 都可以用系统浏览器,省掉 150 MB 下载:

[BROWSER]
engine = "playwright"
executable_path = "/usr/bin/chromium"   # 容器里常见

设了 executable_path 之后,安装状态检测以它为准。camoufox 例外——它必须用自己那份 打过补丁的 Firefox,指别的没有意义。

从源码安装

git clone https://github.com/yuanqimanong/IPClick.git
cd IPClick
uv sync --all-extras --all-groups      # 推荐,用 uv
#
pip install -e ".[niquests,playwright]"

改了 .proto 之后要重新生成:

uv run python src/ipclick/dto/proto/generate.py

(这个脚本会调 protoc 并把生成代码里的顶层导入改成包内相对导入。)

系统要求

  • Python ≥ 3.11(用到了 tomllibStrEnum 等)
  • 内存:纯 HTTP 用途几十 MB 足够;开浏览器渲染每个引擎实例约 600 MB, 集群里每个会执行渲染的节点各占一份,见性能与容量
  • 操作系统:Linux / macOS / Windows 都支持。浏览器引擎的默认选择按平台不同: Windows → DrissionPage,其余 → camoufox

Docker

仓库里有多阶段构建、非 root 运行的 Dockerfile:

docker build -f docker/Dockerfile -t ipclick .
docker run -p 9528:9528 \
  -v "$PWD/ipclick.toml:/app/ipclick.toml:ro" \
  --env-file .env \
  ipclick

容器里跑浏览器渲染要注意两点:

  • --disable-dev-shm-usage:容器默认 /dev/shm 只有 64 MB,Chromium 会崩。 配置里设 no_sandbox = true 会自动带上这个参数。
  • 沙箱:容器里通常没有 user namespace,需要 no_sandbox = true, 或者给容器 --cap-add=SYS_ADMIN

验证装好了

ipclick --version
ipclick config-info      # 逐项显示"什么真生效了"

config-info 会告诉你:绑定地址、鉴权与 TLS 状态、每个机密来自哪里 (环境变量 / 配置文件 / 未配置)、限流设置、浏览器引擎与浏览器本体是否就绪、 链路记录状态。配错了的东西在这里一眼能看出来。

"装没装"是每次现查的(走 importlib.util.find_spec,不执行模块代码)。 这意味着在终端里装完 / 卸完,Web 管理端点一下「刷新状态」就能看到,不用重启进程。 换成模块级 try: import 的话,结论会固化在进程启动那一刻,卸载更是完全探测不出来。

下一步

Clone this wiki locally