mirror of
https://github.com/violettoolssite/CFspider.git
synced 2026-04-05 11:29:03 +08:00
feat: 添加 my_domain 参数支持自动配置自定义域名
This commit is contained in:
18
README.md
18
README.md
@@ -961,6 +961,24 @@ workers.stop()
|
|||||||
| `ACCESSKEY` | `accesskey` | 访问密钥(破皮版 /x2727admin 用) |
|
| `ACCESSKEY` | `accesskey` | 访问密钥(破皮版 /x2727admin 用) |
|
||||||
| `TWO_PROXY` | `two_proxy` | 双层代理(格式: host:port:user:pass) |
|
| `TWO_PROXY` | `two_proxy` | 双层代理(格式: host:port:user:pass) |
|
||||||
|
|
||||||
|
**自定义域名:**
|
||||||
|
| 参数 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `my_domain` | 自定义域名(如 `proxy.example.com`),域名需已在 Cloudflare 托管 |
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 使用自定义域名
|
||||||
|
workers = cfspider.make_workers(
|
||||||
|
api_token="your-token",
|
||||||
|
account_id="your-account-id",
|
||||||
|
my_domain="proxy.example.com" # 自动配置自定义域名
|
||||||
|
)
|
||||||
|
|
||||||
|
print(workers.url) # https://proxy.example.com(自定义域名)
|
||||||
|
print(workers.workers_dev_url) # https://xxx.workers.dev(workers.dev 地址)
|
||||||
|
print(workers.custom_url) # https://proxy.example.com(自定义域名)
|
||||||
|
```
|
||||||
|
|
||||||
### 浏览器模式
|
### 浏览器模式
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
|||||||
@@ -83,7 +83,8 @@ class WorkersManager:
|
|||||||
worker_name: Optional[str] = None,
|
worker_name: Optional[str] = None,
|
||||||
auto_recreate: bool = True,
|
auto_recreate: bool = True,
|
||||||
check_interval: int = 60,
|
check_interval: int = 60,
|
||||||
env_vars: Optional[dict] = None
|
env_vars: Optional[dict] = None,
|
||||||
|
my_domain: Optional[str] = None
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
初始化 Workers 管理器
|
初始化 Workers 管理器
|
||||||
@@ -108,8 +109,10 @@ class WorkersManager:
|
|||||||
self.auto_recreate = auto_recreate
|
self.auto_recreate = auto_recreate
|
||||||
self.check_interval = check_interval
|
self.check_interval = check_interval
|
||||||
self.env_vars = env_vars or {}
|
self.env_vars = env_vars or {}
|
||||||
|
self.my_domain = my_domain
|
||||||
|
|
||||||
self._url: Optional[str] = None
|
self._url: Optional[str] = None
|
||||||
|
self._custom_url: Optional[str] = None
|
||||||
self._uuid: Optional[str] = None
|
self._uuid: Optional[str] = None
|
||||||
self._healthy = False
|
self._healthy = False
|
||||||
self._check_thread: Optional[threading.Thread] = None
|
self._check_thread: Optional[threading.Thread] = None
|
||||||
@@ -122,6 +125,10 @@ class WorkersManager:
|
|||||||
# 创建 Workers
|
# 创建 Workers
|
||||||
self._create_worker()
|
self._create_worker()
|
||||||
|
|
||||||
|
# 配置自定义域名
|
||||||
|
if my_domain and self._healthy:
|
||||||
|
self._setup_custom_domain(my_domain)
|
||||||
|
|
||||||
# 启动健康检查
|
# 启动健康检查
|
||||||
if auto_recreate:
|
if auto_recreate:
|
||||||
self._start_health_check()
|
self._start_health_check()
|
||||||
@@ -220,6 +227,92 @@ class WorkersManager:
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def _get_zone_id(self, domain: str) -> Optional[str]:
|
||||||
|
"""根据域名获取 Zone ID"""
|
||||||
|
# 提取根域名(如 proxy.example.com -> example.com)
|
||||||
|
parts = domain.split('.')
|
||||||
|
if len(parts) >= 2:
|
||||||
|
root_domain = '.'.join(parts[-2:])
|
||||||
|
else:
|
||||||
|
root_domain = domain
|
||||||
|
|
||||||
|
try:
|
||||||
|
api_url = f"https://api.cloudflare.com/client/v4/zones?name={root_domain}"
|
||||||
|
response = requests.get(
|
||||||
|
api_url,
|
||||||
|
headers={"Authorization": f"Bearer {self.api_token}"},
|
||||||
|
timeout=10
|
||||||
|
)
|
||||||
|
if response.ok:
|
||||||
|
result = response.json()
|
||||||
|
if result.get("success") and result.get("result"):
|
||||||
|
return result["result"][0].get("id")
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _setup_custom_domain(self, domain: str) -> bool:
|
||||||
|
"""配置自定义域名"""
|
||||||
|
# 获取 Zone ID
|
||||||
|
zone_id = self._get_zone_id(domain)
|
||||||
|
if not zone_id:
|
||||||
|
print(f"[CFspider] 无法找到域名 {domain} 的 Zone,请确保域名已添加到 Cloudflare")
|
||||||
|
return False
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 使用 Custom Domains API(推荐)
|
||||||
|
api_url = f"https://api.cloudflare.com/client/v4/accounts/{self.account_id}/workers/domains"
|
||||||
|
response = requests.put(
|
||||||
|
api_url,
|
||||||
|
headers={
|
||||||
|
"Authorization": f"Bearer {self.api_token}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
json={
|
||||||
|
"hostname": domain,
|
||||||
|
"zone_id": zone_id,
|
||||||
|
"service": self.worker_name,
|
||||||
|
"environment": "production"
|
||||||
|
},
|
||||||
|
timeout=30
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.ok:
|
||||||
|
result = response.json()
|
||||||
|
if result.get("success"):
|
||||||
|
self._custom_url = f"https://{domain}"
|
||||||
|
print(f"[CFspider] 自定义域名配置成功: {self._custom_url}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
# 如果 Custom Domains 失败,尝试使用 Workers Routes
|
||||||
|
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/workers/routes"
|
||||||
|
response = requests.post(
|
||||||
|
api_url,
|
||||||
|
headers={
|
||||||
|
"Authorization": f"Bearer {self.api_token}",
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
json={
|
||||||
|
"pattern": f"{domain}/*",
|
||||||
|
"script": self.worker_name
|
||||||
|
},
|
||||||
|
timeout=30
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.ok:
|
||||||
|
result = response.json()
|
||||||
|
if result.get("success"):
|
||||||
|
self._custom_url = f"https://{domain}"
|
||||||
|
print(f"[CFspider] 自定义域名路由配置成功: {self._custom_url}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
print(f"[CFspider] 自定义域名配置失败: {response.text[:200]}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[CFspider] 自定义域名配置异常: {e}")
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
def _enable_subdomain(self):
|
def _enable_subdomain(self):
|
||||||
"""启用 workers.dev 子域名路由"""
|
"""启用 workers.dev 子域名路由"""
|
||||||
try:
|
try:
|
||||||
@@ -333,9 +426,19 @@ class WorkersManager:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def url(self) -> Optional[str]:
|
def url(self) -> Optional[str]:
|
||||||
"""获取 Workers URL"""
|
"""获取 Workers URL(优先返回自定义域名)"""
|
||||||
|
return self._custom_url or self._url
|
||||||
|
|
||||||
|
@property
|
||||||
|
def workers_dev_url(self) -> Optional[str]:
|
||||||
|
"""获取 workers.dev URL"""
|
||||||
return self._url
|
return self._url
|
||||||
|
|
||||||
|
@property
|
||||||
|
def custom_url(self) -> Optional[str]:
|
||||||
|
"""获取自定义域名 URL"""
|
||||||
|
return self._custom_url
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def uuid(self) -> Optional[str]:
|
def uuid(self) -> Optional[str]:
|
||||||
"""获取 UUID"""
|
"""获取 UUID"""
|
||||||
@@ -372,7 +475,9 @@ def make_workers(
|
|||||||
host: Optional[str] = None,
|
host: Optional[str] = None,
|
||||||
key: Optional[str] = None,
|
key: Optional[str] = None,
|
||||||
accesskey: Optional[str] = None,
|
accesskey: Optional[str] = None,
|
||||||
two_proxy: Optional[str] = None
|
two_proxy: Optional[str] = None,
|
||||||
|
# 自定义域名
|
||||||
|
my_domain: Optional[str] = None
|
||||||
) -> WorkersManager:
|
) -> WorkersManager:
|
||||||
"""
|
"""
|
||||||
创建 Cloudflare Workers 并返回管理器
|
创建 Cloudflare Workers 并返回管理器
|
||||||
@@ -400,6 +505,7 @@ def make_workers(
|
|||||||
key: 加密密钥
|
key: 加密密钥
|
||||||
accesskey: 访问密钥(破皮版用)
|
accesskey: 访问密钥(破皮版用)
|
||||||
two_proxy: 双层代理地址(格式: host:port:user:pass)
|
two_proxy: 双层代理地址(格式: host:port:user:pass)
|
||||||
|
my_domain: 自定义域名(如 proxy.example.com,域名需已在 Cloudflare)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
WorkersManager: Workers 管理器,可直接用于 cf_proxies
|
WorkersManager: Workers 管理器,可直接用于 cf_proxies
|
||||||
@@ -477,7 +583,8 @@ def make_workers(
|
|||||||
worker_name=worker_name,
|
worker_name=worker_name,
|
||||||
auto_recreate=auto_recreate,
|
auto_recreate=auto_recreate,
|
||||||
check_interval=check_interval,
|
check_interval=check_interval,
|
||||||
env_vars=final_env_vars if final_env_vars else None
|
env_vars=final_env_vars if final_env_vars else None,
|
||||||
|
my_domain=my_domain
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user