-
Notifications
You must be signed in to change notification settings - Fork 0
Home
HadesTop edited this page Aug 17, 2026
·
4 revisions
一个 gRPC 分布式 HTTP 请求代理。 把「发 HTTP 请求」这件事变成一个可以跨机器调度的 服务:调用方说要抓哪个网址,服务端用合适的适配器去抓——普通 HTTP、带 TLS 指纹伪装的、 或者真起一个浏览器把 JS 跑完再取 DOM。
from ipclick import Downloader
with Downloader() as d:
resp = d.get("https://example.com")
print(resp.status_code, len(resp.content))
print(resp.trace.node_id, resp.trace.adapter, resp.trace.attempts)| 你想做的事 | IPClick 怎么做 |
|---|---|
| 从多台机器的出口 IP 发请求 | 集群:任务打给任一节点,按策略分发到其余节点执行 |
| 目标站点认 TLS 指纹 | 默认适配器 curl_cffi 自带浏览器指纹伪装 |
| 页面内容要 JS 跑完才有 | 浏览器渲染:四个引擎可选,返回渲染后的 DOM |
| 想知道刚才那个请求为什么 403 | 链路记录:每个请求记一条,Web 端可查 |
| 不想把对方站点打挂 | 按 host 限流:并发与 QPS 双闸门 |
| 服务端不能被当成内网跳板 | SSRF 防护:协议白名单 + 内网/元数据地址拦截 |
| 想在网页上把可选组件装上 | Web 管理端:装 / 卸 / 下浏览器本体,不用重启 |
pip install ipclick # 17 个包,只带默认适配器
ipclick init # 生成 ipclick.toml 与 .env(600 权限)
ipclick run -w # 起服务 + Web 管理端控制台会打出 Web 管理端地址与登录信息。然后:
from ipclick import Downloader
with Downloader() as d: # 不配置就连本机
print(d.get("https://example.com").status_code)详见 快速开始。
这些规矩贯穿整个代码库,读代码前知道它们会省很多事:
-
配置错误必须报错,绝不静默降级。
mode = "cluster"却没配节点 → 直接失败, 而不是悄悄退回单机。静默降级的问题会在你最需要它工作的时候才暴露。 -
只有瞬时传输故障才返回
status_code == -1。 参数写错、鉴权失败、依赖没装 一律抛异常。把用法错误伪装成网络故障会让人查错方向。 - 不做无谓的重试。 参数错误、脚本语法错、服务端能力缺失,重试多少次都是同样的 结果,只会拖慢失败反馈。见故障排查。
-
机密不进配置文件。 令牌、密码、集群密钥走
.env或环境变量;写进ipclick.toml仍然生效,但启动时会点名提醒。见安全。 - 可观测性数据绝不反压业务。 链路记录写盘跟不上就丢弃并计数, 丢了要能看见——静默丢弃比丢弃更糟。
当前 0.4.0。完整变更见仓库里的 CHANGELOG.md。
0.4.0 主要是 Web 管理端从"能看能改"变成"能装能修":
- 布局大改版(左导航 + 主内容 + 右状态栏)+ 明暗主题切换
- 可以从页面上装 / 卸可选组件,安装状态不重启也能刷新(连卸载都能正确反映)
- 集群节点保存即生效,不用再重启
- 节点「测试连接」能分清"连不上"和"鉴权不通过"
- 「试一试」可以粘 curl 自动填表、可以点名目标节点
- 修了一个确凿 bug:
[LOG].output填目录时被静默改写成同级文件
升级前请看 CHANGELOG 的「破坏性变更」一节——那里有 [LOG].output 的行为变化。
0.3.0 是一次较大的改动:集群新增「服务端转发」形态、Prometheus 换成内置链路记录、
Web 管理端从只读看板变成可配置可试请求的管理界面,并移除了 httpx 适配器。