nekodu/linkgate-bypass
GitHub: nekodu/linkgate-bypass
一个通过逆向工程和自动化浏览器技术解析广告门短链真实目标地址的工具,支持绕过 Cloudflare Turnstile 验证。
Stars: 0 | Forks: 0
# linkgate-bypass
[](https://github.com/nekodu/linkgate-bypass/actions/workflows/ci.yml)
[](pyproject.toml)
[](LICENSE)
解析“广告门”链接缩短器(adlinkfly / aylink 系列)背后的真实目标地址,无需点击广告、触发追踪器,也无需让浏览器占据你的屏幕。
🇩🇪 [德语版本](README.de.md) · 📓 [工程日志](docs/engineering-log.md)
## 为什么需要它
这些缩短器从不直接在页面上暴露目标地址。它们将其隐藏在 Cloudflare Turnstile 验证、倒计时以及多步骤的 token 交换背后,然后将 URL 埋藏在一个只有在第二次点击时才会触发的 DOM 属性中。手动访问验证页面会导致数据泄露给广告网络和通知权限陷阱,而且最终目标地址有时可能包含恶意。
这个工具在隐藏的虚拟显示器中通过验证,直接从验证页面存储目标地址的地方读取它,并跟随任何中间重定向直到终点,最后打印出真实的 URL。它绝不会点击广告按钮。
关于我是如何做到这一点的完整故事(包括每一种失败的尝试),都在[工程日志](docs/engineering-log.md)中。那份日志是这个仓库中最有趣的部分。
## 技术细节
- 使用 SeleniumBase UC Mode 绕过 Cloudflare Turnstile,该模式会在验证期间切断 DevTools 连接,让浏览器看起来是干净的
- 对验证页面的压缩 JavaScript 进行逆向工程,找出其两步 token 交换机制以及它实际存储目标地址的位置
- 保护机密信息:代理凭据仅存放在 `.env` 中,防止 WebRTC 泄露,保持沙箱开启,抓取的页面内容被视为不可信数据
- 包含两个后端的引擎接口,并将 URL 逻辑拆分为无需浏览器即可运行的纯函数,以便进行单元测试
- 在 GitHub Actions 上运行 pytest 和 ruff
如果你想知道真实的故事,包括所有最初失败的尝试,[工程日志](docs/engineering-log.md)是最真实的版本。
## 安装
```
git clone https://github.com/nekodu/linkgate-bypass
cd linkgate-bypass
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
# hidden virtual display 的系统依赖
sudo apt install -y xvfb
```
可选步骤,仅在你需要代理时使用:
```
cp .env.example .env
# 编辑 .env 并设置 PROXY_URL
```
## 用法
```
# 默认:hidden virtual display,全自动,打印真实 URL
python scripts/bypass.py https://ay.live/dzpal2
# 在真实屏幕上观看(调试)
python scripts/bypass.py https://ay.live/dzpal2 --show
# 一次性解析多个
python scripts/bypass.py --batch links.txt
# JSON 输出,并对结果进行 VirusTotal 信誉检查
python scripts/bypass.py https://ay.live/dzpal2 --json --check
# 为单次运行关闭代理
python scripts/bypass.py https://ay.live/dzpal2 --no-proxy
```
解析出的 URL 会输出到 `stdout`,所有日志消息会输出到 `stderr`,因此可以进行管道传输:
```
xdg-open "$(python scripts/bypass.py https://ay.live/dzpal2)"
```
## 工作原理
1. SeleniumBase UC Mode 会在隐藏的 `xvfb` 显示器中打开一个真实的 Chromium 浏览器。在 Turnstile 验证期间,它会断开 DevTools 连接,让浏览器看起来是干净的,然后在验证后重新连接,并通过 PyAutoGUI 从 chromedriver 外部点击复选框。
2. 倒计时结束后(`#go-link` 会获得 `go-link` 类),它会点击一次真实的“前往链接”按钮。这会触发验证页面的 `POST /get/tk` token 验证,以及一个返回目标地址的第二次 POST 请求。
3. 验证页面不会直接打开目标地址。它会将其作为 `window.open("REAL_URL","_blank")` 写入 `#main` 的 `onclick` 属性中。工具会读取该属性并提取出 URL。没有弹窗,不需要第二次点击,也不存在竞态条件。
4. 如果 URL 是一个中间跳转点(例如通知权限页面),工具会跟随重定向链直达最终目标地址。
5. 验证域名、广告网络和追踪器会被过滤掉,因此只会返回真实的目标地址。
此外还有一个更快的辅助引擎(`--engine fast`,使用 patchright),它利用网络响应拦截机制来处理不使用 Cloudflare 的验证页面。
## 引擎
| | `stealth` (默认) | `fast` |
|---|---|---|
| 后端 | SeleniumBase UC Mode | patchright |
| Cloudflare Turnstile | 可通过 | 无法通过 |
| 速度 | 较慢 (~30s) | 较快 (~5s) |
| 抓取方式 | 读取 `#main` 的 onclick,跟随重定向 | JSON 响应拦截 |
| 适用场景 | 受 Cloudflare 保护的验证页面 | 无 Cloudflare 的验证页面 |
## 安全性
- 代理凭据仅存放在被 gitignore 忽略的 `.env` 文件中,绝不硬编码在代码里,并且日志中只记录代理主机名。
- SeleniumBase 会将包含明文凭据的代理认证浏览器扩展写入磁盘;该目录已被 gitignore 忽略,因此不会泄露。
- WebRTC UDP 被强制通过代理
(`--force-webrtc-ip-handling-policy=disable_non_proxied_udp`),因此真实 IP 不会泄露。
- 浏览器沙箱保持启用状态;在 fast 引擎中禁用下载。
- 在逆向工程期间读取的页面内容被视为不可信数据,而不是指令。
## 开发
```
pip install -e ".[dev]"
pytest # unit tests, no browser required
ruff check linkgate tests
```
`linkgate/extract.py` 中的纯辅助函数承载了无需浏览器即可测试的逻辑(目标检测、JSON URL 提取、代理解析),从而确保测试套件保持快速且确定性。
## 负责任的使用
本项目旨在理解广告门缩短器的工作原理,并在信任链接之前检查其指向何处。
- 每次仅用于检查单个链接,不用于批量抓取
- 不欺骗广告网络或产生虚假展示量
- 不作为访问无权获取内容的工具
- 遵守相关服务的条款以及你所在地的法律
## 许可证
MIT
标签:BeEF, JavaScript逆向, Selenium, 反广告, 安全规则引擎, 爬虫, 逆向工具, 链接解析, 验证码绕过