cfspider 1.7.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cfspider/__init__.py +230 -0
- cfspider/api.py +937 -0
- cfspider/async_api.py +418 -0
- cfspider/async_session.py +281 -0
- cfspider/browser.py +335 -0
- cfspider/cli.py +81 -0
- cfspider/impersonate.py +388 -0
- cfspider/ip_map.py +522 -0
- cfspider/mirror.py +682 -0
- cfspider/session.py +239 -0
- cfspider/stealth.py +537 -0
- cfspider/vless_client.py +572 -0
- cfspider-1.7.4.dist-info/METADATA +1390 -0
- cfspider-1.7.4.dist-info/RECORD +18 -0
- cfspider-1.7.4.dist-info/WHEEL +5 -0
- cfspider-1.7.4.dist-info/entry_points.txt +2 -0
- cfspider-1.7.4.dist-info/licenses/LICENSE +201 -0
- cfspider-1.7.4.dist-info/top_level.txt +1 -0
cfspider/session.py
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CFspider Session 模块
|
|
3
|
+
|
|
4
|
+
提供会话管理功能,在多个请求之间保持代理配置、请求头和 Cookie。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .api import request
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Session:
|
|
11
|
+
"""
|
|
12
|
+
CFspider 会话类 / CFspider Session class
|
|
13
|
+
|
|
14
|
+
在多个请求之间保持相同的代理配置、请求头和 Cookie。
|
|
15
|
+
Maintains the same proxy configuration, headers, and cookies across multiple requests.
|
|
16
|
+
适合需要登录状态或连续请求的场景。
|
|
17
|
+
Suitable for scenarios requiring login state or consecutive requests.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
cf_proxies (str): Workers 代理地址 / Workers proxy address
|
|
21
|
+
headers (dict): 会话级别的默认请求头 / Session-level default headers
|
|
22
|
+
cookies (dict): 会话级别的 Cookie / Session-level cookies
|
|
23
|
+
token (str, optional): Workers API 鉴权 token / Workers API authentication token
|
|
24
|
+
|
|
25
|
+
Example:
|
|
26
|
+
>>> import cfspider
|
|
27
|
+
>>>
|
|
28
|
+
>>> # 创建会话 / Create session
|
|
29
|
+
>>> with cfspider.Session(cf_proxies="https://your-workers.dev", token="your-token") as session:
|
|
30
|
+
... # 设置会话级别的请求头 / Set session-level headers
|
|
31
|
+
... session.headers['Authorization'] = 'Bearer token'
|
|
32
|
+
...
|
|
33
|
+
... # 所有请求都会使用相同的代理和请求头
|
|
34
|
+
... # All requests use the same proxy and headers
|
|
35
|
+
... response1 = session.get("https://api.example.com/user")
|
|
36
|
+
... response2 = session.post("https://api.example.com/data", json={"key": "value"})
|
|
37
|
+
...
|
|
38
|
+
... # Cookie 会自动保持 / Cookies are automatically maintained
|
|
39
|
+
... print(session.cookies)
|
|
40
|
+
|
|
41
|
+
Note:
|
|
42
|
+
如果需要隐身模式的会话一致性(自动 Referer、随机延迟等),
|
|
43
|
+
If you need stealth mode session consistency (auto Referer, random delay, etc.),
|
|
44
|
+
请使用 cfspider.StealthSession。
|
|
45
|
+
please use cfspider.StealthSession.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, cf_proxies=None, token=None):
|
|
49
|
+
"""
|
|
50
|
+
初始化会话 / Initialize session
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
cf_proxies (str): Workers 代理地址(必填)
|
|
54
|
+
/ Workers proxy address (required)
|
|
55
|
+
例如:"https://your-workers.dev"
|
|
56
|
+
e.g., "https://your-workers.dev"
|
|
57
|
+
token (str, optional): Workers API 鉴权 token
|
|
58
|
+
/ Workers API authentication token
|
|
59
|
+
当 Workers 端配置了 TOKEN 环境变量时,必须提供有效的 token
|
|
60
|
+
Required when Workers has TOKEN environment variable configured
|
|
61
|
+
|
|
62
|
+
Raises:
|
|
63
|
+
ValueError: 当 cf_proxies 为空时
|
|
64
|
+
/ When cf_proxies is empty
|
|
65
|
+
|
|
66
|
+
Example:
|
|
67
|
+
>>> session = cfspider.Session(cf_proxies="https://your-workers.dev", token="your-token")
|
|
68
|
+
"""
|
|
69
|
+
if not cf_proxies:
|
|
70
|
+
raise ValueError(
|
|
71
|
+
"cf_proxies 是必填参数。\n"
|
|
72
|
+
"请提供 CFspider Workers 地址,例如:\n"
|
|
73
|
+
" session = cfspider.Session(cf_proxies='https://your-workers.dev')\n\n"
|
|
74
|
+
"如果不需要代理,可以直接使用 cfspider.get() 等函数。\n"
|
|
75
|
+
"如果需要隐身模式会话,请使用 cfspider.StealthSession。"
|
|
76
|
+
)
|
|
77
|
+
self.cf_proxies = cf_proxies.rstrip("/")
|
|
78
|
+
self.token = token
|
|
79
|
+
self.headers = {}
|
|
80
|
+
self.cookies = {}
|
|
81
|
+
|
|
82
|
+
def request(self, method, url, **kwargs):
|
|
83
|
+
"""
|
|
84
|
+
发送 HTTP 请求 / Send HTTP request
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
method (str): HTTP 方法(GET, POST, PUT, DELETE 等)
|
|
88
|
+
/ HTTP method (GET, POST, PUT, DELETE, etc.)
|
|
89
|
+
url (str): 目标 URL / Target URL
|
|
90
|
+
**kwargs: 其他参数,与 cfspider.request() 相同
|
|
91
|
+
/ Other parameters, same as cfspider.request()
|
|
92
|
+
- headers (dict): 自定义请求头 / Custom headers
|
|
93
|
+
- cookies (dict): Cookie
|
|
94
|
+
- data (dict/str): 表单数据 / Form data
|
|
95
|
+
- json (dict): JSON 数据 / JSON data
|
|
96
|
+
- timeout (int/float): 超时时间(秒) / Timeout (seconds)
|
|
97
|
+
- 其他参数与 requests 库兼容
|
|
98
|
+
- Other parameters compatible with requests library
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
102
|
+
|
|
103
|
+
Note:
|
|
104
|
+
会话级别的 headers 和 cookies 会自动添加到请求中,
|
|
105
|
+
Session-level headers and cookies are automatically added to requests,
|
|
106
|
+
但请求级别的参数优先级更高。
|
|
107
|
+
but request-level parameters have higher priority.
|
|
108
|
+
"""
|
|
109
|
+
headers = self.headers.copy()
|
|
110
|
+
headers.update(kwargs.pop("headers", {}))
|
|
111
|
+
|
|
112
|
+
cookies = self.cookies.copy()
|
|
113
|
+
cookies.update(kwargs.pop("cookies", {}))
|
|
114
|
+
|
|
115
|
+
return request(
|
|
116
|
+
method,
|
|
117
|
+
url,
|
|
118
|
+
cf_proxies=self.cf_proxies,
|
|
119
|
+
token=self.token,
|
|
120
|
+
headers=headers,
|
|
121
|
+
cookies=cookies,
|
|
122
|
+
**kwargs
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def get(self, url, **kwargs):
|
|
126
|
+
"""
|
|
127
|
+
发送 GET 请求 / Send GET request
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
url (str): 目标 URL / Target URL
|
|
131
|
+
**kwargs: 其他参数,与 cfspider.get() 相同
|
|
132
|
+
/ Other parameters, same as cfspider.get()
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
136
|
+
"""
|
|
137
|
+
return self.request("GET", url, **kwargs)
|
|
138
|
+
|
|
139
|
+
def post(self, url, **kwargs):
|
|
140
|
+
"""
|
|
141
|
+
发送 POST 请求 / Send POST request
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
url (str): 目标 URL / Target URL
|
|
145
|
+
**kwargs: 其他参数,与 cfspider.post() 相同
|
|
146
|
+
/ Other parameters, same as cfspider.post()
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
150
|
+
"""
|
|
151
|
+
return self.request("POST", url, **kwargs)
|
|
152
|
+
|
|
153
|
+
def put(self, url, **kwargs):
|
|
154
|
+
"""
|
|
155
|
+
发送 PUT 请求 / Send PUT request
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
url (str): 目标 URL / Target URL
|
|
159
|
+
**kwargs: 其他参数,与 cfspider.put() 相同
|
|
160
|
+
/ Other parameters, same as cfspider.put()
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
164
|
+
"""
|
|
165
|
+
return self.request("PUT", url, **kwargs)
|
|
166
|
+
|
|
167
|
+
def delete(self, url, **kwargs):
|
|
168
|
+
"""
|
|
169
|
+
发送 DELETE 请求 / Send DELETE request
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
url (str): 目标 URL / Target URL
|
|
173
|
+
**kwargs: 其他参数,与 cfspider.delete() 相同
|
|
174
|
+
/ Other parameters, same as cfspider.delete()
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
178
|
+
"""
|
|
179
|
+
return self.request("DELETE", url, **kwargs)
|
|
180
|
+
|
|
181
|
+
def head(self, url, **kwargs):
|
|
182
|
+
"""
|
|
183
|
+
发送 HEAD 请求 / Send HEAD request
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
url (str): 目标 URL / Target URL
|
|
187
|
+
**kwargs: 其他参数,与 cfspider.head() 相同
|
|
188
|
+
/ Other parameters, same as cfspider.head()
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
192
|
+
"""
|
|
193
|
+
return self.request("HEAD", url, **kwargs)
|
|
194
|
+
|
|
195
|
+
def options(self, url, **kwargs):
|
|
196
|
+
"""
|
|
197
|
+
发送 OPTIONS 请求 / Send OPTIONS request
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
url (str): 目标 URL / Target URL
|
|
201
|
+
**kwargs: 其他参数,与 cfspider.options() 相同
|
|
202
|
+
/ Other parameters, same as cfspider.options()
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
206
|
+
"""
|
|
207
|
+
return self.request("OPTIONS", url, **kwargs)
|
|
208
|
+
|
|
209
|
+
def patch(self, url, **kwargs):
|
|
210
|
+
"""
|
|
211
|
+
发送 PATCH 请求 / Send PATCH request
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
url (str): 目标 URL / Target URL
|
|
215
|
+
**kwargs: 其他参数,与 cfspider.patch() 相同
|
|
216
|
+
/ Other parameters, same as cfspider.patch()
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
CFSpiderResponse: 响应对象 / Response object
|
|
220
|
+
"""
|
|
221
|
+
return self.request("PATCH", url, **kwargs)
|
|
222
|
+
|
|
223
|
+
def close(self):
|
|
224
|
+
"""
|
|
225
|
+
关闭会话
|
|
226
|
+
|
|
227
|
+
当前实现中,每个请求都是独立的,无需特殊清理。
|
|
228
|
+
保留此方法是为了与 requests.Session 保持接口兼容。
|
|
229
|
+
"""
|
|
230
|
+
pass
|
|
231
|
+
|
|
232
|
+
def __enter__(self):
|
|
233
|
+
"""支持上下文管理器(with 语句)"""
|
|
234
|
+
return self
|
|
235
|
+
|
|
236
|
+
def __exit__(self, *args):
|
|
237
|
+
"""退出上下文时关闭会话"""
|
|
238
|
+
self.close()
|
|
239
|
+
|