一、先回答你最想问的三个问题
问题 | 一句话答案 |
---|---|
Ladder 到底是什么? | 一个用 Go 写的轻量级 HTTP 代理,能让你在内网里自建一个“1ft.io/12ft.io”同款付费墙绕行服务。 |
会不会很难? | 不需要写代码,会敲 3 行命令就能跑;Windows、macOS、Linux、Docker 都有现成二进制。 |
合法吗? | 项目只提供技术框架,作者明确声明“仅教育用途”;是否合规取决于你所在地区的法律以及你访问的内容版权。 |
二、它到底怎么把墙“搬走”?
把大象放进冰箱只要 3 步,Ladder 也是 3 步:
-
你在浏览器里输入 http://你的服务器:8080/https://www.xxx.com/article
-
Ladder 先把请求套一层“搜索引擎爬虫”马甲(Googlebot UA + 66.249.66.1 的 X-Forwarded-For),再去目标站点拿文章。 -
拿到 HTML 后,按规则集删掉付费弹窗、改写图片地址、去掉 CORS 限制,再吐回给你。
用一条 mermaid 图说话:
sequenceDiagram
participant 浏览器
participant Ladder
participant 目标站点
浏览器->>Ladder: GET /https://xxx.com/article
Ladder->>Ladder: 套爬虫马甲、按规则改请求头
Ladder->>目标站点: 伪装成 Googlebot 请求
目标站点->>Ladder: 返回全文 HTML
Ladder->>Ladder: 删掉 paywall 标签、重写图片地址
Ladder->>浏览器: 200 OK,干净页面
三、一分钟跑起来(二进制版)
系统 | 步骤 |
---|---|
Windows | 1. 打开 releases 页面 下载 ladder_windows_amd64.exe 2. 双击运行,黑框里出现 Listening on :8080 即可。3. 浏览器访问 http://localhost:8080 把想看的文章地址粘进去。 |
macOS | 1. 下载 ladder_darwin_arm64 (M1/M2)或 amd64 (Intel)。2. chmod +x ladder 给权限,再 ./ladder 启动。3. 同上。 |
Linux | 1. wget https://github.com/everywall/ladder/releases/latest/download/ladder_linux_amd64 2. chmod +x ladder && ./ladder 3. 如果想后台跑: nohup ./ladder & |
第一次启动默认端口 8080,没任何认证,仅限本机。一旦要让同事或外网访问,务必先加 Basic Auth,方法见第六节。
四、Docker 党:一条命令就上线
docker run -d \
-p 8080:8080 \
-e RULESET=https://t.ly/14PSf \
--name ladder \
ghcr.io/everywall/ladder:latest
想升级时:
docker pull ghcr.io/everywall/ladder:latest
docker stop ladder && docker rm ladder
# 再跑一遍上面那条 run 命令
五、Docker Compose:把配置写进文件,下次不敲字
把下面内容保存为 docker-compose.yaml
:
version: "3.9"
services:
ladder:
image: ghcr.io/everywall/ladder:latest
ports:
- "8080:8080"
environment:
USERPASS: "admin:123456" # 先给 Basic Auth,别偷懒
RULESET: "https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml"
LOG_URLS: "true"
restart: unless-stopped
然后:
docker compose up -d
六、公开部署前,务必做的 3 件小事
事项 | 为什么 |
---|---|
1. 加 Basic Auth | 作者警告:不加密=任何人都能用你的代理浏览非法内容,后果你背。 |
2. 改默认端口 | 8080 是扫描器最爱,换成 8888/9000 之类减少骚扰。 |
3. 配防火墙 | 云服务器安全组只放 80/443 给反向代理,ladder 监听 127.0.0.1:8888,再由 Nginx 转发。 |
七、配置清单:所有环境变量中文速查表
变量名 | 默认值 | 干嘛的 | 示例 |
---|---|---|---|
PORT | 8080 | 监听端口 | 8888 |
PREFORK | false | 是否多进程,低配机别开 | true |
USER_AGENT | Googlebot 2.1 | 伪装成谁去要网页 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) … |
X_FORWARDED_FOR | 66.249.66.1 | 伪装的爬虫 IP | 留空即不发 |
USERPASS | 空 | Basic Auth 账号密码 | admin:StrongPass |
LOG_URLS | true | 是否打印访问了哪些 URL | false 就安静 |
DISABLE_FORM | false | 把首页那个输入框关掉 | true |
FORM_PATH | 空 | 用自己写的漂亮首页 | /opt/ladder/form.html |
RULESET | 官方规则 | 规则文件路径或 URL | /opt/ladder/rules.yaml |
EXPOSE_RULESET | true | 是否让别人的 ladder 拉取你的规则 | false |
ALLOWED_DOMAINS | 空 | 只允许代理这些站,逗号分隔 | nytimes.com,washingtonpost.com |
ALLOWED_DOMAINS_RULESET | false | 是否把规则里出现的域名自动加入白名单 | true |
八、规则集:让代理“长眼睛”
规则集就是一份 YAML,告诉 ladder “遇到某站,这么改”。核心能力 4 样:
-
改请求头(headers) -
改返回头(同样 headers 字段) -
用正则改 HTML(regexRules) -
往页面里塞代码(injections)
最小可运行示例:把 example.com
里所有本地脚本地址补全域名,再清掉本地存储。
- domain: example.com
headers:
user-agent: Mozilla/5.0 (Googlebot 2.1)
regexRules:
- match: <script\s+([^>]*\s+)?src="(/)([^"]*)"
replace: <script $1 src="https://www.example.com/$3"
injections:
- position: head
append: |
<script>
window.localStorage.clear();
console.log('paywall removed by ladder');
</script>
九、实战:给纽约时报写一条“去软墙”规则
仅示范技术思路,是否可行随对方策略变动。
- domain: nytimes.com
headers:
referer: https://www.google.com/
regexRules:
- match: <div[^>]*class="[^"]*css-paywall[^"]*"[^>]*>
replace: <div style="display:none">
injections:
- position: head
prepend: |
<style>
.css-paywall { display:none !important; }
</style>
把这段保存成 nyt.yaml
,本地启动时:
./ladder -r ./nyt.yaml
十、API 模式:把梯子当“纯后端”
前端或脚本里直接调:
# 拿完整 HTML
curl http://localhost:8080/api/https://www.example.com/article
# 只要源码,不注入任何脚本
curl http://localhost:8080/raw/https://www.example.com/article
返回就是 UTF-8 纯 HTML,可在 Python、Node、浏览器插件里二次处理。
十一、常见报错 FAQ
现象 | 最可能原因 | 排查 |
---|---|---|
页面只有文字,图片裂图 | 对方用了 JS 懒加载 | 在规则里把 data-src 换成 src ,或改用 Google Cache 模式 |
502 Bad Gateway | 目标站反爬,直接拒绝 Googlebot | 换 USER_AGENT 为普通桌面浏览器 |
启动提示 “ruleset yaml unmarshal error” | YAML 缩进不对 | 在线 YAML 校验器过一遍 |
docker logs 里一直 “permission denied” | 挂载了本地 rules.yaml,但容器里没权限 | 给文件 644 权限,或把 SELinux 设宽松 |
十二、升级与回滚
-
二进制:旧文件重命名 ladder.bak
,下载新版,重启进程。 -
Docker: docker pull …
后重新run
,旧镜像自动变 dangling,回滚只需docker tag
切回去。 -
规则集:ladder 启动时一次性读入,改完规则必须重启进程;生产环境建议先测本地,再 CI 推送。
十三、开发者视角:本地源码跑起来
前提:Go 1.20+、pnpm(可选,仅改样式才用)
git clone https://github.com/everywall/ladder.git
cd ladder
echo "dev" > handlers/VERSION
RULESET="./ruleset.yaml" go run cmd/main.go
改 Tailwind 样式:
pnpm install
pnpm build # 生成 dist/output.css
十四、 Helm 部署:K8s 集群一条命令
helm repo add ladder https://everywall.github.io/ladder
helm install myladder ladder/ladder \
--set userpass=admin:123456 \
--set service.type=ClusterIP
具体值文件见项目内 /helm-chart
目录,支持 Ingress、持久化规则、资源限制等。
十五、写在最后的提醒
-
任何付费内容都有版权,技术中立,使用自担风险。 -
公开节点务必加 Basic Auth + 防火墙,否则流量与法律风险都指向你。 -
规则集随目标站点改版会失效,需定期维护;欢迎把通用规则提 PR 到官方规则仓库,让更多人受益。
祝你阅读自由,也别忘了支持优质内容生产者。