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/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
+