everywall/ladder

GitHub: everywall/ladder

自托管 HTTP 代理工具,通过灵活的规则集修改请求头和页面内容,帮助开发者测试和分析网站的付费墙及访问控制实现。

Stars: 6431 | Forks: 301

Ladder

License go.mod Go version GitHub tag (with filter) GitHub (Pre-)Release Date GitHub Downloads all releases GitHub Build Status (with event)
*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: ]*\s+)?src="(/)([^"]*)" replace: - 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: ]*\s+)?src="(/)([^"]*)" replace: