MeUtils 2025.6.18.16.41.23__py3-none-any.whl → 2025.6.20.18.7.13__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.
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/METADATA +261 -261
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/RECORD +29 -27
- examples/_openaisdk/openai_doubao.py +7 -7
- examples/_openaisdk/openai_modelscope.py +1 -0
- examples/_openaisdk/openai_ppinfra.py +7 -2
- meutils/apis/hailuoai/videos.py +9 -1
- meutils/apis/oneapi/channel.py +57 -6
- meutils/apis/{veo → ppio}/__init__.py +1 -1
- meutils/apis/ppio/videos.py +142 -0
- meutils/apis/proxy/kdlapi.py +18 -14
- meutils/apis/transparent_transmission/__init__.py +10 -0
- meutils/apis/transparent_transmission/tasks.py +28 -0
- meutils/apis/utils.py +4 -4
- meutils/apis/videos/veo.py +68 -0
- meutils/apis/volcengine_apis/videos.py +5 -2
- meutils/config_utils/lark_utils/common.py +19 -3
- meutils/data/VERSION +1 -1
- meutils/llm/check_utils.py +2 -1
- meutils/llm/models_mapping.py +76 -0
- meutils/schemas/hailuo_types.py +13 -4
- meutils/schemas/oneapi/_types.py +19 -7
- meutils/schemas/oneapi/common.py +13 -6
- meutils/serving/fastapi/dependencies/auth.py +2 -1
- meutils/str_utils/__init__.py +21 -0
- meutils/str_utils/regular_expression.py +8 -1
- examples/pyinstxtractor.py +0 -340
- meutils/apis/kuaidi.py +0 -32
- meutils/apis/veo/videos.py +0 -48
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/LICENSE +0 -0
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/WHEEL +0 -0
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/entry_points.txt +0 -0
- {MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/top_level.txt +0 -0
examples/pyinstxtractor.py
DELETED
@@ -1,340 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
PyInstaller Extractor v1.9 (Supports pyinstaller 3.3, 3.2, 3.1, 3.0, 2.1, 2.0)
|
3
|
-
Author : Extreme Coders
|
4
|
-
E-mail : extremecoders(at)hotmail(dot)com
|
5
|
-
Web : https://0xec.blogspot.com
|
6
|
-
Date : 29-November-2017
|
7
|
-
Url : https://sourceforge.net/projects/pyinstallerextractor/
|
8
|
-
|
9
|
-
For any suggestions, leave a comment on
|
10
|
-
https://forum.tuts4you.com/topic/34455-pyinstaller-extractor/
|
11
|
-
|
12
|
-
This script extracts a pyinstaller generated executable file.
|
13
|
-
Pyinstaller installation is not needed. The script has it all.
|
14
|
-
|
15
|
-
For best results, it is recommended to run this script in the
|
16
|
-
same version of python as was used to create the executable.
|
17
|
-
This is just to prevent unmarshalling errors(if any) while
|
18
|
-
extracting the PYZ archive.
|
19
|
-
|
20
|
-
Usage : Just copy this script to the directory where your exe resides
|
21
|
-
and run the script with the exe file name as a parameter
|
22
|
-
|
23
|
-
C:\path\to\exe\>python pyinstxtractor.py <filename>
|
24
|
-
$ /path/to/exe/python pyinstxtractor.py <filename>
|
25
|
-
|
26
|
-
Licensed under GNU General Public License (GPL) v3.
|
27
|
-
You are free to modify this source.
|
28
|
-
|
29
|
-
CHANGELOG
|
30
|
-
================================================
|
31
|
-
|
32
|
-
Version 1.1 (Jan 28, 2014)
|
33
|
-
-------------------------------------------------
|
34
|
-
- First Release
|
35
|
-
- Supports only pyinstaller 2.0
|
36
|
-
|
37
|
-
Version 1.2 (Sept 12, 2015)
|
38
|
-
-------------------------------------------------
|
39
|
-
- Added support for pyinstaller 2.1 and 3.0 dev
|
40
|
-
- Cleaned up code
|
41
|
-
- Script is now more verbose
|
42
|
-
- Executable extracted within a dedicated sub-directory
|
43
|
-
|
44
|
-
(Support for pyinstaller 3.0 dev is experimental)
|
45
|
-
|
46
|
-
Version 1.3 (Dec 12, 2015)
|
47
|
-
-------------------------------------------------
|
48
|
-
- Added support for pyinstaller 3.0 final
|
49
|
-
- Script is compatible with both python 2.x & 3.x (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)
|
50
|
-
|
51
|
-
Version 1.4 (Jan 19, 2016)
|
52
|
-
-------------------------------------------------
|
53
|
-
- Fixed a bug when writing pyc files >= version 3.3 (Thanks to Daniello Alto: https://github.com/Djamana)
|
54
|
-
|
55
|
-
Version 1.5 (March 1, 2016)
|
56
|
-
-------------------------------------------------
|
57
|
-
- Added support for pyinstaller 3.1 (Thanks to Berwyn Hoyt for reporting)
|
58
|
-
|
59
|
-
Version 1.6 (Sept 5, 2016)
|
60
|
-
-------------------------------------------------
|
61
|
-
- Added support for pyinstaller 3.2
|
62
|
-
- Extractor will use a random name while extracting unnamed files.
|
63
|
-
- For encrypted pyz archives it will dump the contents as is. Previously, the tool would fail.
|
64
|
-
|
65
|
-
Version 1.7 (March 13, 2017)
|
66
|
-
-------------------------------------------------
|
67
|
-
- Made the script compatible with python 2.6 (Thanks to Ross for reporting)
|
68
|
-
|
69
|
-
Version 1.8 (April 28, 2017)
|
70
|
-
-------------------------------------------------
|
71
|
-
- Support for sub-directories in .pyz files (Thanks to Moritz Kroll @ Avira Operations GmbH & Co. KG)
|
72
|
-
|
73
|
-
Version 1.9 (November 29, 2017)
|
74
|
-
-------------------------------------------------
|
75
|
-
- Added support for pyinstaller 3.3
|
76
|
-
- Display the scripts which are run at entry (Thanks to Michael Gillespie @ malwarehunterteam for the feature request)
|
77
|
-
|
78
|
-
"""
|
79
|
-
|
80
|
-
from __future__ import print_function
|
81
|
-
import os
|
82
|
-
import struct
|
83
|
-
import marshal
|
84
|
-
import zlib
|
85
|
-
import sys
|
86
|
-
import imp
|
87
|
-
import types
|
88
|
-
from uuid import uuid4 as uniquename
|
89
|
-
|
90
|
-
|
91
|
-
class CTOCEntry:
|
92
|
-
def __init__(self, position, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name):
|
93
|
-
self.position = position
|
94
|
-
self.cmprsdDataSize = cmprsdDataSize
|
95
|
-
self.uncmprsdDataSize = uncmprsdDataSize
|
96
|
-
self.cmprsFlag = cmprsFlag
|
97
|
-
self.typeCmprsData = typeCmprsData
|
98
|
-
self.name = name
|
99
|
-
|
100
|
-
|
101
|
-
class PyInstArchive:
|
102
|
-
PYINST20_COOKIE_SIZE = 24 # For pyinstaller 2.0
|
103
|
-
PYINST21_COOKIE_SIZE = 24 + 64 # For pyinstaller 2.1+
|
104
|
-
MAGIC = b'MEI\014\013\012\013\016' # Magic number which identifies pyinstaller
|
105
|
-
|
106
|
-
def __init__(self, path):
|
107
|
-
self.filePath = path
|
108
|
-
|
109
|
-
|
110
|
-
def open(self):
|
111
|
-
try:
|
112
|
-
self.fPtr = open(self.filePath, 'rb')
|
113
|
-
self.fileSize = os.stat(self.filePath).st_size
|
114
|
-
except:
|
115
|
-
print('[*] Error: Could not open {0}'.format(self.filePath))
|
116
|
-
return False
|
117
|
-
return True
|
118
|
-
|
119
|
-
|
120
|
-
def close(self):
|
121
|
-
try:
|
122
|
-
self.fPtr.close()
|
123
|
-
except:
|
124
|
-
pass
|
125
|
-
|
126
|
-
|
127
|
-
def checkFile(self):
|
128
|
-
print('[*] Processing {0}'.format(self.filePath))
|
129
|
-
# Check if it is a 2.0 archive
|
130
|
-
self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)
|
131
|
-
magicFromFile = self.fPtr.read(len(self.MAGIC))
|
132
|
-
|
133
|
-
if magicFromFile == self.MAGIC:
|
134
|
-
self.pyinstVer = 20 # pyinstaller 2.0
|
135
|
-
print('[*] Pyinstaller version: 2.0')
|
136
|
-
return True
|
137
|
-
|
138
|
-
# Check for pyinstaller 2.1+ before bailing out
|
139
|
-
self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)
|
140
|
-
magicFromFile = self.fPtr.read(len(self.MAGIC))
|
141
|
-
|
142
|
-
if magicFromFile == self.MAGIC:
|
143
|
-
print('[*] Pyinstaller version: 2.1+')
|
144
|
-
self.pyinstVer = 21 # pyinstaller 2.1+
|
145
|
-
return True
|
146
|
-
|
147
|
-
print('[*] Error : Unsupported pyinstaller version or not a pyinstaller archive')
|
148
|
-
return False
|
149
|
-
|
150
|
-
|
151
|
-
def getCArchiveInfo(self):
|
152
|
-
try:
|
153
|
-
if self.pyinstVer == 20:
|
154
|
-
self.fPtr.seek(self.fileSize - self.PYINST20_COOKIE_SIZE, os.SEEK_SET)
|
155
|
-
|
156
|
-
# Read CArchive cookie
|
157
|
-
(magic, lengthofPackage, toc, tocLen, self.pyver) = \
|
158
|
-
struct.unpack('!8siiii', self.fPtr.read(self.PYINST20_COOKIE_SIZE))
|
159
|
-
|
160
|
-
elif self.pyinstVer == 21:
|
161
|
-
self.fPtr.seek(self.fileSize - self.PYINST21_COOKIE_SIZE, os.SEEK_SET)
|
162
|
-
|
163
|
-
# Read CArchive cookie
|
164
|
-
(magic, lengthofPackage, toc, tocLen, self.pyver, pylibname) = \
|
165
|
-
struct.unpack('!8siiii64s', self.fPtr.read(self.PYINST21_COOKIE_SIZE))
|
166
|
-
|
167
|
-
except:
|
168
|
-
print('[*] Error : The file is not a pyinstaller archive')
|
169
|
-
return False
|
170
|
-
|
171
|
-
print('[*] Python version: {0}'.format(self.pyver))
|
172
|
-
|
173
|
-
# Overlay is the data appended at the end of the PE
|
174
|
-
self.overlaySize = lengthofPackage
|
175
|
-
self.overlayPos = self.fileSize - self.overlaySize
|
176
|
-
self.tableOfContentsPos = self.overlayPos + toc
|
177
|
-
self.tableOfContentsSize = tocLen
|
178
|
-
|
179
|
-
print('[*] Length of package: {0} bytes'.format(self.overlaySize))
|
180
|
-
return True
|
181
|
-
|
182
|
-
|
183
|
-
def parseTOC(self):
|
184
|
-
# Go to the table of contents
|
185
|
-
self.fPtr.seek(self.tableOfContentsPos, os.SEEK_SET)
|
186
|
-
|
187
|
-
self.tocList = []
|
188
|
-
parsedLen = 0
|
189
|
-
|
190
|
-
# Parse table of contents
|
191
|
-
while parsedLen < self.tableOfContentsSize:
|
192
|
-
(entrySize, ) = struct.unpack('!i', self.fPtr.read(4))
|
193
|
-
nameLen = struct.calcsize('!iiiiBc')
|
194
|
-
|
195
|
-
(entryPos, cmprsdDataSize, uncmprsdDataSize, cmprsFlag, typeCmprsData, name) = \
|
196
|
-
struct.unpack( \
|
197
|
-
'!iiiBc{0}s'.format(entrySize - nameLen), \
|
198
|
-
self.fPtr.read(entrySize - 4))
|
199
|
-
|
200
|
-
name = name.decode('utf-8').rstrip('\0')
|
201
|
-
if len(name) == 0:
|
202
|
-
name = str(uniquename())
|
203
|
-
print('[!] Warning: Found an unamed file in CArchive. Using random name {0}'.format(name))
|
204
|
-
|
205
|
-
self.tocList.append( \
|
206
|
-
CTOCEntry( \
|
207
|
-
self.overlayPos + entryPos, \
|
208
|
-
cmprsdDataSize, \
|
209
|
-
uncmprsdDataSize, \
|
210
|
-
cmprsFlag, \
|
211
|
-
typeCmprsData, \
|
212
|
-
name \
|
213
|
-
))
|
214
|
-
|
215
|
-
parsedLen += entrySize
|
216
|
-
print('[*] Found {0} files in CArchive'.format(len(self.tocList)))
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
def extractFiles(self):
|
221
|
-
print('[*] Beginning extraction...please standby')
|
222
|
-
extractionDir = os.path.join(os.getcwd(), os.path.basename(self.filePath) + '_extracted')
|
223
|
-
|
224
|
-
if not os.path.exists(extractionDir):
|
225
|
-
os.mkdir(extractionDir)
|
226
|
-
|
227
|
-
os.chdir(extractionDir)
|
228
|
-
|
229
|
-
for entry in self.tocList:
|
230
|
-
basePath = os.path.dirname(entry.name)
|
231
|
-
if basePath != '':
|
232
|
-
# Check if path exists, create if not
|
233
|
-
if not os.path.exists(basePath):
|
234
|
-
os.makedirs(basePath)
|
235
|
-
|
236
|
-
self.fPtr.seek(entry.position, os.SEEK_SET)
|
237
|
-
data = self.fPtr.read(entry.cmprsdDataSize)
|
238
|
-
|
239
|
-
if entry.cmprsFlag == 1:
|
240
|
-
data = zlib.decompress(data)
|
241
|
-
# Malware may tamper with the uncompressed size
|
242
|
-
# Comment out the assertion in such a case
|
243
|
-
assert len(data) == entry.uncmprsdDataSize # Sanity Check
|
244
|
-
|
245
|
-
with open(entry.name, 'wb') as f:
|
246
|
-
f.write(data)
|
247
|
-
|
248
|
-
if entry.typeCmprsData == b's':
|
249
|
-
print('[+] Possible entry point: {0}'.format(entry.name))
|
250
|
-
|
251
|
-
elif entry.typeCmprsData == b'z' or entry.typeCmprsData == b'Z':
|
252
|
-
self._extractPyz(entry.name)
|
253
|
-
|
254
|
-
|
255
|
-
def _extractPyz(self, name):
|
256
|
-
dirName = name + '_extracted'
|
257
|
-
# Create a directory for the contents of the pyz
|
258
|
-
if not os.path.exists(dirName):
|
259
|
-
os.mkdir(dirName)
|
260
|
-
|
261
|
-
with open(name, 'rb') as f:
|
262
|
-
pyzMagic = f.read(4)
|
263
|
-
assert pyzMagic == b'PYZ\0' # Sanity Check
|
264
|
-
|
265
|
-
pycHeader = f.read(4) # Python magic value
|
266
|
-
|
267
|
-
if imp.get_magic() != pycHeader:
|
268
|
-
print('[!] Warning: The script is running in a different python version than the one used to build the executable')
|
269
|
-
print(' Run this script in Python{0} to prevent extraction errors(if any) during unmarshalling'.format(self.pyver))
|
270
|
-
|
271
|
-
(tocPosition, ) = struct.unpack('!i', f.read(4))
|
272
|
-
f.seek(tocPosition, os.SEEK_SET)
|
273
|
-
|
274
|
-
try:
|
275
|
-
toc = marshal.load(f)
|
276
|
-
except:
|
277
|
-
print('[!] Unmarshalling FAILED. Cannot extract {0}. Extracting remaining files.'.format(name))
|
278
|
-
return
|
279
|
-
|
280
|
-
print('[*] Found {0} files in PYZ archive'.format(len(toc)))
|
281
|
-
|
282
|
-
# From pyinstaller 3.1+ toc is a list of tuples
|
283
|
-
if type(toc) == list:
|
284
|
-
toc = dict(toc)
|
285
|
-
|
286
|
-
for key in toc.keys():
|
287
|
-
(ispkg, pos, length) = toc[key]
|
288
|
-
f.seek(pos, os.SEEK_SET)
|
289
|
-
|
290
|
-
fileName = key
|
291
|
-
try:
|
292
|
-
# for Python > 3.3 some keys are bytes object some are str object
|
293
|
-
fileName = key.decode('utf-8')
|
294
|
-
except:
|
295
|
-
pass
|
296
|
-
|
297
|
-
# Make sure destination directory exists, ensuring we keep inside dirName
|
298
|
-
destName = os.path.join(dirName, fileName.replace("..", "__"))
|
299
|
-
destDirName = os.path.dirname(destName)
|
300
|
-
if not os.path.exists(destDirName):
|
301
|
-
os.makedirs(destDirName)
|
302
|
-
|
303
|
-
try:
|
304
|
-
data = f.read(length)
|
305
|
-
data = zlib.decompress(data)
|
306
|
-
except:
|
307
|
-
print('[!] Error: Failed to decompress {0}, probably encrypted. Extracting as is.'.format(fileName))
|
308
|
-
open(destName + '.pyc.encrypted', 'wb').write(data)
|
309
|
-
continue
|
310
|
-
|
311
|
-
with open(destName + '.pyc', 'wb') as pycFile:
|
312
|
-
pycFile.write(pycHeader) # Write pyc magic
|
313
|
-
pycFile.write(b'\0' * 4) # Write timestamp
|
314
|
-
if self.pyver >= 33:
|
315
|
-
pycFile.write(b'\0' * 4) # Size parameter added in Python 3.3
|
316
|
-
pycFile.write(data)
|
317
|
-
|
318
|
-
|
319
|
-
def main():
|
320
|
-
if len(sys.argv) < 2:
|
321
|
-
print('[*] Usage: pyinstxtractor.py <filename>')
|
322
|
-
|
323
|
-
else:
|
324
|
-
arch = PyInstArchive(sys.argv[1])
|
325
|
-
if arch.open():
|
326
|
-
if arch.checkFile():
|
327
|
-
if arch.getCArchiveInfo():
|
328
|
-
arch.parseTOC()
|
329
|
-
arch.extractFiles()
|
330
|
-
arch.close()
|
331
|
-
print('[*] Successfully extracted pyinstaller archive: {0}'.format(sys.argv[1]))
|
332
|
-
print('')
|
333
|
-
print('You can now use a python decompiler on the pyc files within the extracted directory')
|
334
|
-
return
|
335
|
-
|
336
|
-
arch.close()
|
337
|
-
|
338
|
-
|
339
|
-
if __name__ == '__main__':
|
340
|
-
main()
|
meutils/apis/kuaidi.py
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# #!/usr/bin/env python
|
2
|
-
# # -*- coding: utf-8 -*-
|
3
|
-
# # @Project : AI. @by PyCharm
|
4
|
-
# # @File : kuaidi
|
5
|
-
# # @Time : 2024/4/24 16:58
|
6
|
-
# # @Author : betterme
|
7
|
-
# # @WeChat : meutils
|
8
|
-
# # @Software : PyCharm
|
9
|
-
# # @Description :
|
10
|
-
#
|
11
|
-
|
12
|
-
from meutils.pipe import *
|
13
|
-
from meutils.decorators.retry import retrying
|
14
|
-
from meutils.api.ali_apis import express_query
|
15
|
-
|
16
|
-
|
17
|
-
@retrying
|
18
|
-
def query(express_no):
|
19
|
-
appcode = '0ccd86184de94ca19c37cbb215b1f372'
|
20
|
-
return express_query(express_no, appcode=appcode).get('result')
|
21
|
-
|
22
|
-
|
23
|
-
path = './快递登记系统.xlsx'
|
24
|
-
sheet_name = '快递信息'
|
25
|
-
df = pd.read_excel(path, sheet_name=sheet_name)
|
26
|
-
express_numbers = df['单号'] + ':' + df['收件人电话'].astype(str).str.strip().str[-4:]
|
27
|
-
df_ = pd.DataFrame(express_numbers.tolist() | xThreadPoolExecutor(query))
|
28
|
-
# df = pd.concat([df, df_[["updateTime", "takeTime"]]], axis=1)
|
29
|
-
df = pd.concat([df, df_], axis=1)
|
30
|
-
|
31
|
-
with pd.ExcelWriter('单号信息.xlsm') as writer:
|
32
|
-
df.to_excel(writer, sheet_name)
|
meutils/apis/veo/videos.py
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# -*- coding: utf-8 -*-
|
3
|
-
# @Project : AI. @by PyCharm
|
4
|
-
# @File : videos
|
5
|
-
# @Time : 2025/6/18 16:34
|
6
|
-
# @Author : betterme
|
7
|
-
# @WeChat : meutils
|
8
|
-
# @Software : PyCharm
|
9
|
-
# @Description :
|
10
|
-
|
11
|
-
from meutils.pipe import *
|
12
|
-
from meutils.llm.clients import AsyncOpenAI
|
13
|
-
|
14
|
-
base_url = "https://api.gptgod.online"
|
15
|
-
|
16
|
-
|
17
|
-
# {
|
18
|
-
# "prompt": "牛飞上天了",
|
19
|
-
# "model": "veo2-fast",
|
20
|
-
# "enhance_prompt": true
|
21
|
-
# }
|
22
|
-
async def create_task(
|
23
|
-
request: dict,
|
24
|
-
api_key: Optional[str] = None
|
25
|
-
|
26
|
-
):
|
27
|
-
payload = request
|
28
|
-
client = AsyncOpenAI(base_url=base_url, api_key=api_key)
|
29
|
-
response = client.post(
|
30
|
-
"/v1/video/create",
|
31
|
-
body=payload,
|
32
|
-
cast_to=dict,
|
33
|
-
)
|
34
|
-
return response
|
35
|
-
|
36
|
-
|
37
|
-
if __name__ == '__main__':
|
38
|
-
payload = {
|
39
|
-
"prompt": "牛飞上天了",
|
40
|
-
"model": "veo2-fast",
|
41
|
-
"images": [
|
42
|
-
"https://filesystem.site/cdn/20250612/VfgB5ubjInVt8sG6rzMppxnu7gEfde.png",
|
43
|
-
"https://filesystem.site/cdn/20250612/998IGmUiM2koBGZM3UnZeImbPBNIUL.png"
|
44
|
-
],
|
45
|
-
"enhance_prompt": True
|
46
|
-
}
|
47
|
-
|
48
|
-
arun(create_task(payload))
|
File without changes
|
File without changes
|
{MeUtils-2025.6.18.16.41.23.dist-info → MeUtils-2025.6.20.18.7.13.dist-info}/entry_points.txt
RENAMED
File without changes
|
File without changes
|