Ladder
*Ladder 是一个 HTTP Web 代理。*
Ladder 是一款开发者工具,用于测试和分析现代网站上的付费墙实现及内容交付行为。
它允许开发者、研究人员和出版商模拟不同的客户端环境(例如浏览器和爬虫),并观察在不同条件下内容的提供方式。这使得它对于调试付费墙配置、验证访问控制、HTTP headers 以及确保不同 User Agent 的行为一致性非常有用。
Ladder 旨在仅用于合法的测试、研究和质量保证目的。使用时必须遵守适用的法律以及目标网站的服务条款。
### 工作原理
```
sequenceDiagram
client->>+ladder: GET
ladder-->>ladder: apply RequestModifications
ladder->>+website: GET
website->>-ladder: 200 OK
ladder-->>ladder: apply ResultModifications
ladder->>-client: 200 OK
```
### 功能特性
- [x] 从响应、资源和图像中移除/修改 CORS headers ...
- [x] 移除/修改其他 headers(例如 Content-Security-Policy)
- [x] 移除/注入自定义代码(HTML、CSS、JavaScript)到页面中
- [x] 应用基于域名的规则集/代码来修改响应或请求的 URL
- [x] 保持网站可浏览
- [x] API
- [x] 获取 RAW HTML
- [x] 自定义 User Agent
- [x] 自定义 X-Forwarded-For IP
- [x] [Docker 容器](https://github.com/everywall/ladder/pkgs/container/ladder)(amd64, arm64)
- [x] Linux 二进制文件
- [x] Mac OS 二进制文件
- [x] Windows 二进制文件(未经测试)
- [x] Basic Auth
- [x] 访问日志
- [x] 可能会破坏跟踪、广告和其他 3rd party 内容
- [x] 将代理限制在特定的域名列表中
- [x] 将规则集暴露给其他 ladder
- [ ] Robots.txt 测试
- [ ] 可选的 TOR 代理
- [ ] 用于分享代理 URL 的密钥
### 限制
某些网站会根据访问它们的客户端类型(例如,搜索引擎爬虫还是标准的 Web 浏览器)提供不同的内容(伪装,Cloaking)。Ladder 可以配置为模拟不同的客户端类型,以便为了测试、自动化或研究目的检索可公开访问的内容。
然而,许多网站采用了高级机制来限制自动化访问,例如指纹识别、速率限制或行为分析。Ladder 不会绕过此类保护,对于主动限制或控制访问的服务,它可能无法正常运行。
目前已存在诸如 FlareSolverr 等第三方工具,可以独立用于在 headless browser 环境中渲染网页。这些工具不属于 Ladder 的一部分,其使用可能受法律和合同的限制。用户需自行负责确保其使用符合所有适用的法规。
## 安装说明
### Binary
1. 在[此处](https://github.com/everywall/ladder/releases/latest)下载二进制文件
2. 解压并运行二进制文件 `./ladder -r https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml`
3. 打开浏览器(默认:http://localhost:8080)
### Docker
```
docker run -p 8080:8080 -d --env RULESET=https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml --name ladder ghcr.io/everywall/ladder:latest
```
### Docker Compose
```
curl https://raw.githubusercontent.com/everywall/ladder/main/docker-compose.yaml --output docker-compose.yaml
docker-compose up -d
```
### Helm
有关更多信息,请参阅 helm-chart 子目录中的 [README.md](/helm-chart/README.md)。
## 使用方法
### 浏览器
1. 打开浏览器(默认:http://localhost:8080)
2. 输入 URL
3. 按 Enter 键
或者直接将 URL 附加到代理 URL 的末尾:
http://localhost:8080/https://www.example.com
或者使用以下 URL 创建书签:
```
javascript:window.location.href="http://localhost:8080/"+location.href
```
### API
```
curl -X GET "http://localhost:8080/api/https://www.example.com"
```
### RAW
http://localhost:8080/raw/https://www.example.com
### 正在运行的规则集
http://localhost:8080/ruleset
## 配置说明
### 环境变量
| Variable | Description | Value |
| --- | --- | --- |
| `PORT` | 监听端口 | `8080` |
| `PREFORK` | 启动多个服务器实例 | `false` |
| `USER_AGENT` | 要模拟的 User Agent | `Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)` |
| `X_FORWARDED_FOR` | IP 转发地址 | `66.249.66.1` |
| `USERPASS` | 启用 Basic Auth,格式为 `admin:123456` | `` |
| `LOG_URLS` | 记录获取的 URL | `true` |
| `DISABLE_FORM` | 禁用表单首页 | `false` |
| `FORM_PATH` | 自定义表单 HTML 的路径 | `` |
| `RULESET` | 规则集文件的路径或 URL,支持本地目录 | `https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml` 或 `/path/to/my/rules.yaml` 或 `/path/to/my/rules/` |
| `EXPOSE_RULESET` | 将你的规则集提供给其他 ladder 使用 | `true` |
| `ALLOWED_DOMAINS` | 允许的域名的逗号分隔列表。为空 = 无限制 | `` |
| `ALLOWED_DOMAINS_RULESET` | 允许来自规则集的域名。false = 无限制 | `false` |
| `FLARESOLVERR_HOST` | 用于绕过 Cloudflare 的 FlareSolverr 服务的 URL(可选) | `http://localhost:8191` |
`ALLOWED_DOMAINS` 和 `ALLOWED_DOMAINS_RULESET` 会结合在一起使用。如果两者都为空,则应用无限制。
### 规则集
你可以应用自定义规则来修改响应或请求的 URL。这可以用来移除页面中不需要的元素或对元素进行修改。规则集是一个 YAML 文件、包含 YAML 文件的目录,或者是包含每个域名规则列表的 YAML 文件的 URL。这些规则在启动时加载。
在一个单独的仓库 [ruleset.yaml](https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml) 中提供了一个基础的规则集。欢迎添加你自己的规则并创建 Pull Request。
```
- domain: example.com # Includes all subdomains
domains: # Additional domains to apply the rule
- www.example.de
- www.beispiel.de
headers:
x-forwarded-for: none # override X-Forwarded-For header or delete with none
referer: none # override Referer header or delete with none
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
content-security-policy: script-src 'self'; # override response header
cookie: privacy=1
regexRules:
- match:
- domain: www.anotherdomain.com # Domain where the rule applies
useFlareSolverr: false # Use FlareSolverr for Cloudflare bypass (optional, default: false)
paths: # Paths where the rule applies
- /article
googleCache: false # Use Google Cache to fetch the content
regexRules: # Regex rules to apply
- match: