feat(browser): add two_proxy support for Browser class

This commit is contained in:
violettools
2026-01-23 13:19:40 +08:00
parent 45190564aa
commit 634230ea02
2 changed files with 21 additions and 7 deletions

View File

@@ -10,10 +10,12 @@ CFspider - Cloudflare 代理 IP 池 Python 库
- 网页镜像(保存网页到本地,自动重写资源链接)
UUID 使用说明:
需要 UUID 的方法(使用 VLESS 协议):
需要 UUID 的方法(使用 VLESS 协议,支持双层代理 two_proxy
- cfspider.get/post/... (使用 cf_proxies 时)
- cfspider.Session
- cfspider.StealthSession
- cfspider.Browser (浏览器自动化UUID 可自动获取)
- cfspider.WebMirror (网页镜像)
无需 UUID 的方法(使用 /proxy API
- cfspider.AsyncSession

View File

@@ -108,22 +108,26 @@ class Browser:
>>> browser.close()
"""
def __init__(self, cf_proxies=None, headless=True, timeout=30, uuid=None):
def __init__(self, cf_proxies=None, headless=True, timeout=30, uuid=None, two_proxy=None):
"""
初始化浏览器 / Initialize browser
⚠️ 需要 UUID使用 VLESS 协议)
Args:
cf_proxies (str, optional): 代理地址 / Proxy address
- CFspider Workers URL推荐: "https://cfspider.violetqqcom.workers.dev"
UUID 将自动从 Workers 获取 / UUID auto-fetched from Workers
- VLESS 链接: "vless://uuid@host:port?path=/xxx#name"
- HTTP 代理: "http://ip:port""ip:port"
- SOCKS5 代理: "socks5://ip:port"
- HTTP 代理: "http://ip:port""ip:port"
- SOCKS5 代理: "socks5://ip:port"
不填则直接使用本地网络 / None for direct connection
headless (bool): 是否无头模式,默认 True / Headless mode (default: True)
timeout (int): 请求超时时间(秒),默认 30 / Timeout in seconds (default: 30)
uuid (str, optional): VLESS UUID可选不填则自动获取
/ VLESS UUID (optional, auto-fetched)
two_proxy (str, optional): 双层代理配置,格式 "host:port:user:pass"
用于国内无法直连时使用第二层代理
Examples:
>>> # 简化用法(推荐)
@@ -135,6 +139,13 @@ class Browser:
... uuid="c373c80c-58e4-4e64-8db5-40096905ec58"
... )
>>>
>>> # 使用双层代理
>>> browser = Browser(
... cf_proxies="https://cfspider.violetqqcom.workers.dev",
... uuid="c373c80c-58e4-4e64-8db5-40096905ec58",
... two_proxy="us.cliproxy.io:3010:user:pass"
... )
>>>
>>> # 使用 VLESS 链接
>>> browser = Browser(cf_proxies="vless://uuid@v2.example.com:443?path=/")
>>>
@@ -149,6 +160,7 @@ class Browser:
self.cf_proxies = cf_proxies
self.headless = headless
self.timeout = timeout
self.two_proxy = two_proxy
self._vless_proxy = None
# 解析代理地址
@@ -159,7 +171,7 @@ class Browser:
if vless_info:
# 使用 VLESS 链接
ws_url = f"wss://{vless_info['host']}{vless_info['path']}"
self._vless_proxy = LocalVlessProxy(ws_url, vless_info['uuid'])
self._vless_proxy = LocalVlessProxy(ws_url, vless_info['uuid'], two_proxy=two_proxy)
port = self._vless_proxy.start()
proxy_url = f"http://127.0.0.1:{port}"
# 2. HTTP/SOCKS5 代理格式
@@ -171,7 +183,7 @@ class Browser:
# 使用 VLESS 代理
hostname = cf_proxies.replace('https://', '').replace('http://', '').split('/')[0]
ws_url = f'wss://{hostname}/{uuid}'
self._vless_proxy = LocalVlessProxy(ws_url, uuid)
self._vless_proxy = LocalVlessProxy(ws_url, uuid, two_proxy=two_proxy)
port = self._vless_proxy.start()
proxy_url = f"http://127.0.0.1:{port}"
else:
@@ -186,7 +198,7 @@ class Browser:
uuid = uuid or self._get_workers_uuid(f"https://{hostname}")
if uuid:
ws_url = f'wss://{hostname}/{uuid}'
self._vless_proxy = LocalVlessProxy(ws_url, uuid)
self._vless_proxy = LocalVlessProxy(ws_url, uuid, two_proxy=two_proxy)
port = self._vless_proxy.start()
proxy_url = f"http://127.0.0.1:{port}"
else: