pyscriptbase 1.0.1__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.
- pybase/__init__.py +0 -0
- pybase/cipher.py +169 -0
- pybase/database.py +470 -0
- pybase/env.py +87 -0
- pybase/net.py +440 -0
- pybase/panel.py +194 -0
- pybase/pusher.py +194 -0
- pybase/script.py +90 -0
- pybase/util.py +86 -0
- pybase/webview.py +54 -0
- pyscriptbase-1.0.1.dist-info/METADATA +24 -0
- pyscriptbase-1.0.1.dist-info/RECORD +14 -0
- pyscriptbase-1.0.1.dist-info/WHEEL +5 -0
- pyscriptbase-1.0.1.dist-info/top_level.txt +1 -0
pybase/env.py
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import random
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def get(name: str, defValue: str = "") -> str:
|
|
6
|
+
"""
|
|
7
|
+
从环境变量获取一个字符串。
|
|
8
|
+
|
|
9
|
+
:param name: 环境变量名称。
|
|
10
|
+
"""
|
|
11
|
+
value = os.getenv(name) # 直接使用getenv方法来获取环境变量的值
|
|
12
|
+
if value:
|
|
13
|
+
return value
|
|
14
|
+
else:
|
|
15
|
+
return defValue
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def getList(name: str, delimiter: str = "&", default: any = [], count: int = -1, shuffle: bool = False) -> list:
|
|
19
|
+
"""
|
|
20
|
+
从环境变量获取一个以特定分隔符分割的字符串列表。
|
|
21
|
+
|
|
22
|
+
:param name: 环境变量名称。
|
|
23
|
+
:param delimiter: 用于分割环境变量字符串的分隔符,默认为'&'。
|
|
24
|
+
:param default: 如果环境变量不存在,则返回此默认值,默认为None。
|
|
25
|
+
:param count: 指定返回列表中的元素个数,默认为-1,表示返回所有元素。
|
|
26
|
+
:return: 分割后的字符串列表或默认值。
|
|
27
|
+
"""
|
|
28
|
+
value = os.getenv(name) # 直接使用getenv方法来获取环境变量的值
|
|
29
|
+
if value is not None:
|
|
30
|
+
results = []
|
|
31
|
+
for v in value.split(delimiter):
|
|
32
|
+
if v.strip() != "":
|
|
33
|
+
results.append(v.strip())
|
|
34
|
+
results = results[:count] if count != -1 else results
|
|
35
|
+
if shuffle:
|
|
36
|
+
random.shuffle(results)
|
|
37
|
+
return results
|
|
38
|
+
else:
|
|
39
|
+
return default if default is not None else []
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def getInt(name: str, default: int = 0) -> int:
|
|
43
|
+
"""
|
|
44
|
+
从环境变量获取一个整数。
|
|
45
|
+
|
|
46
|
+
:param name: 环境变量名称。
|
|
47
|
+
:param default: 如果环境变量不存在,则返回此默认值,默认为0。
|
|
48
|
+
:return: 环境变量的值,如果环境变量不存在,则返回默认值。
|
|
49
|
+
"""
|
|
50
|
+
value = os.getenv(name)
|
|
51
|
+
try:
|
|
52
|
+
return int(value) if value is not None else default
|
|
53
|
+
except:
|
|
54
|
+
return default
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def getFromFile(path: str, delimiter: str = "\n", default: any = [], count: int = -1, create=False) -> list:
|
|
58
|
+
""" """
|
|
59
|
+
if os.path.exists(path):
|
|
60
|
+
file = open(path, "r")
|
|
61
|
+
value = file.read()
|
|
62
|
+
file.close()
|
|
63
|
+
lines = value.split(delimiter)
|
|
64
|
+
lines = [line.strip() for line in lines if line.strip() != ""]
|
|
65
|
+
return lines[:count] if count != -1 else lines
|
|
66
|
+
else:
|
|
67
|
+
if create:
|
|
68
|
+
file = open(path, "w")
|
|
69
|
+
file.close()
|
|
70
|
+
return default
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def saveToFile(path: str, values: list, delimiter: str = "\n") -> None:
|
|
74
|
+
""" """
|
|
75
|
+
file = open(path, "w")
|
|
76
|
+
file.write(delimiter.join(values))
|
|
77
|
+
file.close()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def isRelease(key: str = "RELEASE") -> bool:
|
|
81
|
+
"""
|
|
82
|
+
检查名为 'key' 的环境变量是否设置为表示“发布”状态的值。
|
|
83
|
+
|
|
84
|
+
:param key: 环境变量的名称,默认为'RELEASE'。
|
|
85
|
+
:return: 如果环境变量设置为'true', 'True', 或 '1',则返回True;否则返回False。
|
|
86
|
+
"""
|
|
87
|
+
return os.getenv(key, "").lower() in ["true", "1"]
|
pybase/net.py
ADDED
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from urllib.parse import urljoin
|
|
3
|
+
import requests
|
|
4
|
+
from copy import deepcopy
|
|
5
|
+
from xmltodict import parse as xmlParse
|
|
6
|
+
import warnings
|
|
7
|
+
from time import sleep
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
warnings.filterwarnings("ignore")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class NetRequest:
|
|
14
|
+
def __init__(self, headers: dict = {}, debug=False) -> None:
|
|
15
|
+
"""
|
|
16
|
+
@headers:基础请求头
|
|
17
|
+
@useLocalProxy:是否使用系统级的代理
|
|
18
|
+
@debug:是否需要输出请求信息
|
|
19
|
+
"""
|
|
20
|
+
self.headers = deepcopy(headers)
|
|
21
|
+
self.headersFunc = None
|
|
22
|
+
self.debug = debug
|
|
23
|
+
self.proxies = None
|
|
24
|
+
self.session = requests.session()
|
|
25
|
+
self.session.trust_env = False
|
|
26
|
+
|
|
27
|
+
def _debug_(self, text: str) -> None:
|
|
28
|
+
"""
|
|
29
|
+
打印输出
|
|
30
|
+
"""
|
|
31
|
+
if self.debug:
|
|
32
|
+
print(text, flush=True)
|
|
33
|
+
|
|
34
|
+
def addHeaders(self, headers: dict) -> None:
|
|
35
|
+
"""
|
|
36
|
+
添加请求头
|
|
37
|
+
"""
|
|
38
|
+
if self.headers:
|
|
39
|
+
self.headers.update(headers)
|
|
40
|
+
else:
|
|
41
|
+
self.headers = deepcopy(headers)
|
|
42
|
+
|
|
43
|
+
def setHeaders(self, headers: dict) -> None:
|
|
44
|
+
"""
|
|
45
|
+
重置请求头
|
|
46
|
+
"""
|
|
47
|
+
self.headers = deepcopy(headers)
|
|
48
|
+
|
|
49
|
+
def setHeadersFunc(self, func) -> None:
|
|
50
|
+
"""
|
|
51
|
+
添加动态请求头函数\n
|
|
52
|
+
每次请求会调用该函数获取请求头
|
|
53
|
+
"""
|
|
54
|
+
self.headersFunc = func
|
|
55
|
+
|
|
56
|
+
def get(
|
|
57
|
+
self,
|
|
58
|
+
url: str,
|
|
59
|
+
headers: dict = None,
|
|
60
|
+
proxies: dict = None,
|
|
61
|
+
isJson=True,
|
|
62
|
+
isXml=False,
|
|
63
|
+
isCookie=False,
|
|
64
|
+
allow_redirects=True,
|
|
65
|
+
timeout=5,
|
|
66
|
+
maxTry=3,
|
|
67
|
+
params: dict = {},
|
|
68
|
+
):
|
|
69
|
+
"""
|
|
70
|
+
GET
|
|
71
|
+
"""
|
|
72
|
+
return self.__req__(
|
|
73
|
+
method="GET",
|
|
74
|
+
url=url,
|
|
75
|
+
body=None,
|
|
76
|
+
headers=headers,
|
|
77
|
+
isJson=isJson,
|
|
78
|
+
isXml=isXml,
|
|
79
|
+
isCookie=isCookie,
|
|
80
|
+
allow_redirects=allow_redirects,
|
|
81
|
+
timeout=timeout,
|
|
82
|
+
proxies=proxies,
|
|
83
|
+
maxTry=maxTry,
|
|
84
|
+
params=params,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
def post(
|
|
88
|
+
self,
|
|
89
|
+
url: str,
|
|
90
|
+
body: str = None,
|
|
91
|
+
headers: dict = None,
|
|
92
|
+
proxies: dict = None,
|
|
93
|
+
isJson=True,
|
|
94
|
+
isXml=False,
|
|
95
|
+
isCookie=False,
|
|
96
|
+
allow_redirects=True,
|
|
97
|
+
timeout: int = 5,
|
|
98
|
+
maxTry=3,
|
|
99
|
+
params: dict = {},
|
|
100
|
+
):
|
|
101
|
+
"""
|
|
102
|
+
POST
|
|
103
|
+
"""
|
|
104
|
+
return self.__req__(
|
|
105
|
+
method="POST",
|
|
106
|
+
url=url,
|
|
107
|
+
body=body,
|
|
108
|
+
headers=headers,
|
|
109
|
+
proxies=proxies,
|
|
110
|
+
isJson=isJson,
|
|
111
|
+
isXml=isXml,
|
|
112
|
+
isCookie=isCookie,
|
|
113
|
+
allow_redirects=allow_redirects,
|
|
114
|
+
timeout=timeout,
|
|
115
|
+
maxTry=maxTry,
|
|
116
|
+
params=params,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def put(
|
|
120
|
+
self,
|
|
121
|
+
url: str,
|
|
122
|
+
body: str = None,
|
|
123
|
+
headers: dict = None,
|
|
124
|
+
proxies: dict = None,
|
|
125
|
+
isJson=True,
|
|
126
|
+
isXml=False,
|
|
127
|
+
isCookie=False,
|
|
128
|
+
allow_redirects=True,
|
|
129
|
+
timeout: int = 5,
|
|
130
|
+
maxTry=3,
|
|
131
|
+
params: dict = {},
|
|
132
|
+
):
|
|
133
|
+
"""
|
|
134
|
+
PUT
|
|
135
|
+
"""
|
|
136
|
+
return self.__req__(
|
|
137
|
+
method="PUT",
|
|
138
|
+
url=url,
|
|
139
|
+
body=body,
|
|
140
|
+
headers=headers,
|
|
141
|
+
proxies=proxies,
|
|
142
|
+
isJson=isJson,
|
|
143
|
+
isXml=isXml,
|
|
144
|
+
isCookie=isCookie,
|
|
145
|
+
allow_redirects=allow_redirects,
|
|
146
|
+
timeout=timeout,
|
|
147
|
+
maxTry=maxTry,
|
|
148
|
+
params=params,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
def delete(
|
|
152
|
+
self,
|
|
153
|
+
url: str,
|
|
154
|
+
body: str = None,
|
|
155
|
+
headers: dict = None,
|
|
156
|
+
proxies: dict = None,
|
|
157
|
+
isJson=True,
|
|
158
|
+
isXml=False,
|
|
159
|
+
isCookie=False,
|
|
160
|
+
allow_redirects=True,
|
|
161
|
+
timeout: int = 5,
|
|
162
|
+
maxTry=3,
|
|
163
|
+
):
|
|
164
|
+
"""
|
|
165
|
+
DELETE
|
|
166
|
+
"""
|
|
167
|
+
return self.__req__(
|
|
168
|
+
method="DELETE",
|
|
169
|
+
url=url,
|
|
170
|
+
body=body,
|
|
171
|
+
headers=headers,
|
|
172
|
+
proxies=proxies,
|
|
173
|
+
isJson=isJson,
|
|
174
|
+
isXml=isXml,
|
|
175
|
+
isCookie=isCookie,
|
|
176
|
+
allow_redirects=allow_redirects,
|
|
177
|
+
timeout=timeout,
|
|
178
|
+
maxTry=maxTry,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def __req__(
|
|
182
|
+
self,
|
|
183
|
+
method: str,
|
|
184
|
+
url: str,
|
|
185
|
+
body: str = None,
|
|
186
|
+
headers: dict = None,
|
|
187
|
+
isJson=True,
|
|
188
|
+
isXml=False,
|
|
189
|
+
isCookie=False,
|
|
190
|
+
allow_redirects=True,
|
|
191
|
+
proxies: dict = None,
|
|
192
|
+
timeout: int = 5,
|
|
193
|
+
maxTry=3,
|
|
194
|
+
params: dict = {},
|
|
195
|
+
):
|
|
196
|
+
finalHeaders = deepcopy(self.headers)
|
|
197
|
+
if self.headersFunc:
|
|
198
|
+
finalHeaders.update(self.headersFunc())
|
|
199
|
+
if headers:
|
|
200
|
+
finalHeaders.update(headers)
|
|
201
|
+
if not proxies: # 优先外部代理
|
|
202
|
+
proxies = self.proxies
|
|
203
|
+
|
|
204
|
+
for i in range(0, maxTry):
|
|
205
|
+
try:
|
|
206
|
+
res = self.session.request(
|
|
207
|
+
method=method,
|
|
208
|
+
url=url,
|
|
209
|
+
headers=finalHeaders,
|
|
210
|
+
data=body,
|
|
211
|
+
proxies=proxies,
|
|
212
|
+
verify=False,
|
|
213
|
+
allow_redirects=allow_redirects,
|
|
214
|
+
timeout=timeout,
|
|
215
|
+
params=params,
|
|
216
|
+
)
|
|
217
|
+
self._debug_(f"url: {res.url}")
|
|
218
|
+
self._debug_(f"code: {res.status_code}")
|
|
219
|
+
self._debug_(f"bdoy: {res.text}")
|
|
220
|
+
|
|
221
|
+
if isCookie:
|
|
222
|
+
return res.cookies.get_dict()
|
|
223
|
+
elif isXml:
|
|
224
|
+
return xmlParse(res.text)
|
|
225
|
+
elif isJson:
|
|
226
|
+
return res.json()
|
|
227
|
+
else:
|
|
228
|
+
return res.text
|
|
229
|
+
except Exception as e:
|
|
230
|
+
self._debug_(e)
|
|
231
|
+
if i != maxTry - 1:
|
|
232
|
+
self._debug_(f"netPost请求失败\t重新请求")
|
|
233
|
+
else:
|
|
234
|
+
self._debug_(f"netPost请求失败\t结束请求")
|
|
235
|
+
sleep(0.1)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class CloudRequest:
|
|
239
|
+
def __init__(self, headers: dict = {}, debug=False) -> None:
|
|
240
|
+
"""
|
|
241
|
+
@headers:基础请求头
|
|
242
|
+
@debug:是否需要输出请求信息
|
|
243
|
+
"""
|
|
244
|
+
self.cloud: dict = None
|
|
245
|
+
self.headers: dict = deepcopy(headers)
|
|
246
|
+
self.headersFunc: function = None
|
|
247
|
+
self.debug: bool = debug
|
|
248
|
+
self.net: NetRequest = None
|
|
249
|
+
self.session = requests.session()
|
|
250
|
+
self.session.trust_env = False
|
|
251
|
+
|
|
252
|
+
def _debug_(self, text: str) -> None:
|
|
253
|
+
"""
|
|
254
|
+
打印输出
|
|
255
|
+
"""
|
|
256
|
+
if self.debug:
|
|
257
|
+
print(text, flush=True)
|
|
258
|
+
|
|
259
|
+
def addHeaders(self, headers: dict) -> None:
|
|
260
|
+
"""
|
|
261
|
+
添加请求头
|
|
262
|
+
"""
|
|
263
|
+
if self.headers:
|
|
264
|
+
self.headers.update(headers)
|
|
265
|
+
else:
|
|
266
|
+
self.headers = deepcopy(headers)
|
|
267
|
+
|
|
268
|
+
def setHeaders(self, headers: dict) -> None:
|
|
269
|
+
"""
|
|
270
|
+
重置请求头
|
|
271
|
+
"""
|
|
272
|
+
self.headers = deepcopy(headers)
|
|
273
|
+
|
|
274
|
+
def setHeadersFunc(self, func) -> None:
|
|
275
|
+
"""
|
|
276
|
+
添加动态请求头函数\n
|
|
277
|
+
每次请求会调用该函数获取请求头
|
|
278
|
+
"""
|
|
279
|
+
self.headersFunc = func
|
|
280
|
+
|
|
281
|
+
def post(
|
|
282
|
+
self,
|
|
283
|
+
url: str,
|
|
284
|
+
body: str = None,
|
|
285
|
+
headers: dict = None,
|
|
286
|
+
isJson=True,
|
|
287
|
+
isXml=False,
|
|
288
|
+
isCookie=False,
|
|
289
|
+
allow_redirects=True,
|
|
290
|
+
timeout: int = 5,
|
|
291
|
+
maxTry=3,
|
|
292
|
+
params: dict = {},
|
|
293
|
+
):
|
|
294
|
+
return self.__req__(
|
|
295
|
+
method="POST",
|
|
296
|
+
url=url,
|
|
297
|
+
body=body,
|
|
298
|
+
headers=headers,
|
|
299
|
+
isJson=isJson,
|
|
300
|
+
isXml=isXml,
|
|
301
|
+
isCookie=isCookie,
|
|
302
|
+
allow_redirects=allow_redirects,
|
|
303
|
+
timeout=timeout,
|
|
304
|
+
maxTry=maxTry,
|
|
305
|
+
params=params,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def get(
|
|
309
|
+
self,
|
|
310
|
+
url: str,
|
|
311
|
+
headers: dict = None,
|
|
312
|
+
isJson=True,
|
|
313
|
+
isXml=False,
|
|
314
|
+
isCookie=False,
|
|
315
|
+
allow_redirects=True,
|
|
316
|
+
timeout=5,
|
|
317
|
+
maxTry=3,
|
|
318
|
+
params: dict = {},
|
|
319
|
+
):
|
|
320
|
+
return self.__req__(
|
|
321
|
+
method="GET",
|
|
322
|
+
url=url,
|
|
323
|
+
body=None,
|
|
324
|
+
headers=headers,
|
|
325
|
+
isJson=isJson,
|
|
326
|
+
isXml=isXml,
|
|
327
|
+
isCookie=isCookie,
|
|
328
|
+
allow_redirects=allow_redirects,
|
|
329
|
+
timeout=timeout,
|
|
330
|
+
maxTry=maxTry,
|
|
331
|
+
params=params,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
def put(
|
|
335
|
+
self,
|
|
336
|
+
url: str,
|
|
337
|
+
body: str = None,
|
|
338
|
+
headers: dict = None,
|
|
339
|
+
isJson=True,
|
|
340
|
+
isXml=False,
|
|
341
|
+
isCookie=False,
|
|
342
|
+
allow_redirects=True,
|
|
343
|
+
timeout: int = 5,
|
|
344
|
+
maxTry=3,
|
|
345
|
+
params: dict = {},
|
|
346
|
+
):
|
|
347
|
+
return self.__req__(
|
|
348
|
+
method="PUT",
|
|
349
|
+
url=url,
|
|
350
|
+
body=body,
|
|
351
|
+
headers=headers,
|
|
352
|
+
isJson=isJson,
|
|
353
|
+
isXml=isXml,
|
|
354
|
+
isCookie=isCookie,
|
|
355
|
+
allow_redirects=allow_redirects,
|
|
356
|
+
timeout=timeout,
|
|
357
|
+
maxTry=maxTry,
|
|
358
|
+
params=params,
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
def __req__(
|
|
362
|
+
self,
|
|
363
|
+
method: str,
|
|
364
|
+
url: str,
|
|
365
|
+
body: str = None,
|
|
366
|
+
headers: dict = None,
|
|
367
|
+
isJson=True,
|
|
368
|
+
isXml=False,
|
|
369
|
+
isCookie=False,
|
|
370
|
+
allow_redirects=True,
|
|
371
|
+
timeout: int = 5,
|
|
372
|
+
maxTry=3,
|
|
373
|
+
params: dict = {},
|
|
374
|
+
):
|
|
375
|
+
if self.cloud is None:
|
|
376
|
+
self._debug_("cloud未设置")
|
|
377
|
+
return
|
|
378
|
+
|
|
379
|
+
# cloud共享使用net的请求头
|
|
380
|
+
if self.net and self.net.headers:
|
|
381
|
+
finalHeaders = deepcopy(self.net.headers)
|
|
382
|
+
else:
|
|
383
|
+
finalHeaders = deepcopy(self.headers)
|
|
384
|
+
if self.headersFunc:
|
|
385
|
+
finalHeaders.update(self.headersFunc())
|
|
386
|
+
if headers:
|
|
387
|
+
finalHeaders.update(headers)
|
|
388
|
+
|
|
389
|
+
ReqBody = {
|
|
390
|
+
"method": method,
|
|
391
|
+
"url": urljoin(url, params),
|
|
392
|
+
"body": body,
|
|
393
|
+
"headers": finalHeaders,
|
|
394
|
+
"timeout": timeout,
|
|
395
|
+
}
|
|
396
|
+
ReqHeaders = {
|
|
397
|
+
"Content-Type": "application/json",
|
|
398
|
+
"token": self.cloud["token"],
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
for i in range(0, maxTry):
|
|
402
|
+
try:
|
|
403
|
+
res = self.session.post(
|
|
404
|
+
url=self.cloud["url"],
|
|
405
|
+
headers=ReqHeaders,
|
|
406
|
+
data=json.dumps(ReqBody),
|
|
407
|
+
verify=False,
|
|
408
|
+
allow_redirects=allow_redirects,
|
|
409
|
+
timeout=timeout,
|
|
410
|
+
)
|
|
411
|
+
rjson = res.json()
|
|
412
|
+
|
|
413
|
+
if isCookie:
|
|
414
|
+
return self.__parseCookie__(rjson["headers"])
|
|
415
|
+
elif isXml:
|
|
416
|
+
return xmlParse(rjson["data"])
|
|
417
|
+
elif isJson:
|
|
418
|
+
return json.loads(rjson["data"])
|
|
419
|
+
else:
|
|
420
|
+
return rjson["data"]
|
|
421
|
+
except Exception as e:
|
|
422
|
+
if i != maxTry - 1:
|
|
423
|
+
self._debug_(f"netPost请求失败\t重新请求")
|
|
424
|
+
else:
|
|
425
|
+
self._debug_(f"netPost请求失败\t结束请求")
|
|
426
|
+
sleep(0.1)
|
|
427
|
+
|
|
428
|
+
def __parseCookie__(self, headers: dict) -> dict:
|
|
429
|
+
"""
|
|
430
|
+
解析cookie字符串为字典
|
|
431
|
+
"""
|
|
432
|
+
cookieStr: str = headers.get("Set-Cookie", "")
|
|
433
|
+
if not cookieStr:
|
|
434
|
+
return {}
|
|
435
|
+
cookie_dict = {}
|
|
436
|
+
for item in cookieStr.split(";"):
|
|
437
|
+
if "=" in item:
|
|
438
|
+
key, value = item.split("=", 1)
|
|
439
|
+
cookie_dict[key.strip()] = value.strip()
|
|
440
|
+
return cookie_dict
|