vchrome 0.0.6__py3-none-any.whl → 0.0.8__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.
- vchrome/__init__.py +50 -32
- {vchrome-0.0.6.dist-info → vchrome-0.0.8.dist-info}/METADATA +1 -1
- vchrome-0.0.8.dist-info/RECORD +5 -0
- vchrome-0.0.6.dist-info/RECORD +0 -5
- {vchrome-0.0.6.dist-info → vchrome-0.0.8.dist-info}/WHEEL +0 -0
- {vchrome-0.0.6.dist-info → vchrome-0.0.8.dist-info}/top_level.txt +0 -0
vchrome/__init__.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
__version__ = '0.0.
|
|
1
|
+
__version__ = '0.0.8'
|
|
2
2
|
__author__ = 'v'
|
|
3
3
|
# ----------------------------------------------------------------------------------------------------
|
|
4
4
|
_allowed = {'Chrome'}
|
|
@@ -16,6 +16,7 @@ import types
|
|
|
16
16
|
import queue
|
|
17
17
|
import time
|
|
18
18
|
import inspect
|
|
19
|
+
import textwrap
|
|
19
20
|
import threading
|
|
20
21
|
from time import perf_counter
|
|
21
22
|
from math import factorial, sin, pi
|
|
@@ -25,7 +26,6 @@ import socket
|
|
|
25
26
|
import base64
|
|
26
27
|
import traceback
|
|
27
28
|
from json import JSONDecodeError
|
|
28
|
-
from functools import lru_cache
|
|
29
29
|
from threading import Thread, Event, RLock
|
|
30
30
|
from urllib import request
|
|
31
31
|
import builtins
|
|
@@ -148,9 +148,6 @@ def cdp_client(hostname, port, debug=False):
|
|
|
148
148
|
def close_all(self):
|
|
149
149
|
for i in range(self.num):
|
|
150
150
|
self._pool.put(self.KillThreadParams)
|
|
151
|
-
@lru_cache(maxsize=1024)
|
|
152
|
-
def get_cached_signature(func):
|
|
153
|
-
return inspect.signature(func)
|
|
154
151
|
def to_human_read(size_in_bytes, decimal_places= 2):
|
|
155
152
|
if size_in_bytes < 0:
|
|
156
153
|
raise ValueError("byte size cannot be negative!")
|
|
@@ -466,30 +463,36 @@ def cdp_client(hostname, port, debug=False):
|
|
|
466
463
|
class FetchFakeResponse:
|
|
467
464
|
def __init__(self, rinfo, encoding='utf8'):
|
|
468
465
|
self.rinfo = rinfo
|
|
469
|
-
self.encoding = encoding
|
|
466
|
+
self.encoding = rinfo.get('encoding') or encoding
|
|
470
467
|
self._url = rinfo.get('url')
|
|
471
|
-
self._responseCode = 200
|
|
472
|
-
self._responseHeaders = {"fake-
|
|
473
|
-
|
|
468
|
+
self._responseCode = rinfo.get('status_code') or 200
|
|
469
|
+
self._responseHeaders = rinfo.get('headers') or {"fake-header": "fake-header"}
|
|
470
|
+
if rinfo.get('text'):
|
|
471
|
+
self._body = rinfo.get('text').encode(self.encoding)
|
|
472
|
+
elif rinfo.get('content'):
|
|
473
|
+
assert isinstance(rinfo.get('content'), bytes), '.content must be type: bytes'
|
|
474
|
+
self._body = rinfo.get('content')
|
|
475
|
+
else:
|
|
476
|
+
self._body = b''
|
|
474
477
|
self.request = rinfo.get('request')
|
|
475
478
|
@property
|
|
476
479
|
def url(self): return self._url
|
|
477
480
|
@property
|
|
478
481
|
def status_code(self): return self._responseCode
|
|
479
482
|
@status_code.setter
|
|
480
|
-
def status_code(self, value): assert isinstance(value, int), 'must be type: int'; self._responseCode = value
|
|
483
|
+
def status_code(self, value): assert isinstance(value, int), '.status_code must be type: int'; self._responseCode = value
|
|
481
484
|
@property
|
|
482
485
|
def headers(self): return self._responseHeaders
|
|
483
486
|
@headers.setter
|
|
484
|
-
def headers(self, value): assert isinstance(value, dict), 'must be type: dict'; self._responseHeaders = value
|
|
487
|
+
def headers(self, value): assert isinstance(value, dict), '.headers must be type: dict'; self._responseHeaders = value
|
|
485
488
|
@property
|
|
486
489
|
def content(self): return self._body
|
|
487
490
|
@content.setter
|
|
488
|
-
def content(self, value): assert isinstance(value, bytes), 'must be type: bytes'; self._body = value
|
|
491
|
+
def content(self, value): assert isinstance(value, bytes), '.content must be type: bytes'; self._body = value
|
|
489
492
|
@property
|
|
490
493
|
def text(self): return self._body.decode(self.encoding)
|
|
491
494
|
@text.setter
|
|
492
|
-
def text(self, value): assert isinstance(value, str), 'must be type: str'; self._body = value.encode(self.encoding)
|
|
495
|
+
def text(self, value): assert isinstance(value, str), '.text must be type: str'; self._body = value.encode(self.encoding)
|
|
493
496
|
def json(self):
|
|
494
497
|
c = self.text
|
|
495
498
|
return json.loads(c[c.find('{'):c.rfind('}')+1])
|
|
@@ -509,24 +512,36 @@ def cdp_client(hostname, port, debug=False):
|
|
|
509
512
|
self._postData = rinfo.get('postData')
|
|
510
513
|
self._postData_copy = self._postData
|
|
511
514
|
self._fake = None
|
|
515
|
+
self._alert = textwrap.dedent('''
|
|
516
|
+
The fake_response() function is already running!
|
|
517
|
+
req object cannot be modified. maybe you're using the feature in the wrong way.
|
|
518
|
+
below is an example of a modification:
|
|
519
|
+
|
|
520
|
+
def on_request(req):
|
|
521
|
+
fk_resp = req.fake_response();
|
|
522
|
+
fk_resp.content = b'xxxxxx'
|
|
523
|
+
# If you need to modify the return content,
|
|
524
|
+
# you need to use the return value object of the fake_response() function.
|
|
525
|
+
''').strip()
|
|
526
|
+
def _A(self): assert self._fake == None, self._alert
|
|
512
527
|
@property
|
|
513
528
|
def url(self): return self._url
|
|
514
529
|
@property
|
|
515
530
|
def method(self): return self._method
|
|
516
531
|
@method.setter
|
|
517
|
-
def method(self, value): assert isinstance(value, str), 'must be type: str'; self._method = value
|
|
532
|
+
def method(self, value): self._A(); assert isinstance(value, str), 'must be type: str'; self._method = value
|
|
518
533
|
@property
|
|
519
534
|
def headers(self): return self._headers
|
|
520
535
|
@headers.setter
|
|
521
|
-
def headers(self, value): assert isinstance(value, dict), 'must be type: dict'; self._headers = value
|
|
536
|
+
def headers(self, value): self._A(); assert isinstance(value, dict), 'must be type: dict'; self._headers = value
|
|
522
537
|
@property
|
|
523
538
|
def content(self): return self._postData
|
|
524
539
|
@content.setter
|
|
525
|
-
def content(self, value): assert isinstance(value, bytes), 'must be type: bytes'; self._postData = value
|
|
540
|
+
def content(self, value): self._A(); assert isinstance(value, bytes), 'must be type: bytes'; self._postData = value
|
|
526
541
|
@property
|
|
527
542
|
def text(self): return self._postData.decode(self.encoding)
|
|
528
543
|
@text.setter
|
|
529
|
-
def text(self, value): assert isinstance(value, str), 'must be type: str'; self._postData = value.encode(self.encoding)
|
|
544
|
+
def text(self, value): self._A(); assert isinstance(value, str), 'must be type: str'; self._postData = value.encode(self.encoding)
|
|
530
545
|
def json(self):
|
|
531
546
|
c = self.text
|
|
532
547
|
return json.loads(c[c.find('{'):c.rfind('}')+1])
|
|
@@ -541,8 +556,11 @@ def cdp_client(hostname, port, debug=False):
|
|
|
541
556
|
)
|
|
542
557
|
def get(self, k):
|
|
543
558
|
return getattr(self, '_'+k, None)
|
|
544
|
-
def fake_response(self):
|
|
545
|
-
|
|
559
|
+
def fake_response(self, data=None):
|
|
560
|
+
data = data or dict()
|
|
561
|
+
data['request'] = self
|
|
562
|
+
data['url'] = self._url
|
|
563
|
+
self._fake = SniffFetch.FetchFakeResponse(data)
|
|
546
564
|
return self._fake
|
|
547
565
|
class FetchResponse:
|
|
548
566
|
def __init__(self, rinfo, encoding='utf8'):
|
|
@@ -1237,8 +1255,8 @@ def cdp_client(hostname, port, debug=False):
|
|
|
1237
1255
|
if tp == 'xpath': r.extend(self.xpath(xf))
|
|
1238
1256
|
if tp == 'css': r.extend(self.css(xf))
|
|
1239
1257
|
if one and r: return r
|
|
1240
|
-
|
|
1241
|
-
for sr in self.f.element._sr_root(
|
|
1258
|
+
backendNodeId = self.f.cdp('DOM.describeNode', {'objectId': self.objectId})['node']['backendNodeId']
|
|
1259
|
+
for sr in self.f.element._sr_root(backendNodeId):
|
|
1242
1260
|
if tp == 'xpath': r.extend(sr.xpath(xf))
|
|
1243
1261
|
if tp == 'css': r.extend(sr.css(xf))
|
|
1244
1262
|
if one and r: return r
|
|
@@ -1397,11 +1415,11 @@ def cdp_client(hostname, port, debug=False):
|
|
|
1397
1415
|
time.sleep(0.1)
|
|
1398
1416
|
if perf_counter() - start > 2:
|
|
1399
1417
|
break
|
|
1400
|
-
def _get_flattened_node(self,
|
|
1401
|
-
if
|
|
1418
|
+
def _get_flattened_node(self, backendNodeId=None):
|
|
1419
|
+
if backendNodeId == None:
|
|
1402
1420
|
rnode = self._get_doc_tree()['root']
|
|
1403
1421
|
else:
|
|
1404
|
-
rnode = self.f.cdp('DOM.describeNode', {'
|
|
1422
|
+
rnode = self.f.cdp('DOM.describeNode', {'backendNodeId':backendNodeId, 'depth':-1, 'pierce':True})['node']
|
|
1405
1423
|
mnodes = {"nodes": self._trav_node_tree(rnode)}
|
|
1406
1424
|
return mnodes
|
|
1407
1425
|
def _filter_shadow_root(self, mnodes):
|
|
@@ -1422,8 +1440,8 @@ def cdp_client(hostname, port, debug=False):
|
|
|
1422
1440
|
e = Element(self.f, m['object'])
|
|
1423
1441
|
r.append(e)
|
|
1424
1442
|
return r
|
|
1425
|
-
def _sr_root(self,
|
|
1426
|
-
mnodes = self._get_flattened_node(
|
|
1443
|
+
def _sr_root(self, backendNodeId=None):
|
|
1444
|
+
mnodes = self._get_flattened_node(backendNodeId)
|
|
1427
1445
|
return self._filter_shadow_root(mnodes)
|
|
1428
1446
|
def _make_shadow_root_xpath(self, s):
|
|
1429
1447
|
v = re.findall('^([^/]*)(/+)([^/]*)$', s)
|
|
@@ -1803,21 +1821,21 @@ def cdp_client(hostname, port, debug=False):
|
|
|
1803
1821
|
if limit_time != None:
|
|
1804
1822
|
if perf_counter() - start > limit_time:
|
|
1805
1823
|
self.qret.pop(rid, None)
|
|
1806
|
-
return {'
|
|
1824
|
+
return {'verror': 'over time'}
|
|
1807
1825
|
if sessionId:
|
|
1808
1826
|
_tid = sessionId
|
|
1809
1827
|
_rid = self.root.detached_cache_sessionId.get(_tid, None)
|
|
1810
1828
|
if _rid:
|
|
1811
1829
|
self._cache_del.append([_rid, _tid, self.root.detached_cache_sessionId])
|
|
1812
1830
|
self.qret.pop(rid, None)
|
|
1813
|
-
return {'
|
|
1831
|
+
return {'verror': 'detached sessionId'}
|
|
1814
1832
|
else:
|
|
1815
1833
|
_tid = getattr(self.f, 'frameId', None)
|
|
1816
1834
|
_rid = self.root.detached_cache_targetId.get(_tid, None)
|
|
1817
1835
|
if _rid:
|
|
1818
1836
|
self._cache_del.append([_rid, _tid, self.root.detached_cache_targetId])
|
|
1819
1837
|
self.qret.pop(rid, None)
|
|
1820
|
-
return {'
|
|
1838
|
+
return {'verror': 'detached targetId'}
|
|
1821
1839
|
self.check_del_cache()
|
|
1822
1840
|
ret = self.qret[rid].get(timeout=.15)
|
|
1823
1841
|
self.qret.pop(rid, None)
|
|
@@ -2004,7 +2022,7 @@ def cdp_client(hostname, port, debug=False):
|
|
|
2004
2022
|
self.cdp('Network.setCookies', {"cookies": v.data})
|
|
2005
2023
|
else:
|
|
2006
2024
|
# cookies must be (str/list)
|
|
2007
|
-
# str: document.cookie = '
|
|
2025
|
+
# str: document.cookie = 'test=123'
|
|
2008
2026
|
# list:
|
|
2009
2027
|
# [{'domain': '.baidu.com',
|
|
2010
2028
|
# 'expires': 1790665876.734538,
|
|
@@ -2429,7 +2447,7 @@ def find_free_port(start_port=9233, end_port=60000):
|
|
|
2429
2447
|
cpu_n = cpu_count()
|
|
2430
2448
|
raw = f"{system}-{release}-{version}-{arch}-{python_version}-{cpu_n}-{getenv('USERNAME','')}-{getenv('USER','')}"
|
|
2431
2449
|
except:
|
|
2432
|
-
raw = "
|
|
2450
|
+
raw = "default sign."
|
|
2433
2451
|
return hashlib.sha256(raw.encode('utf-8')).hexdigest()
|
|
2434
2452
|
def rand(self):
|
|
2435
2453
|
self.state = (1664525 * self.state + 1013904223) % (2**32)
|
|
@@ -2647,7 +2665,7 @@ class Chrome:
|
|
|
2647
2665
|
e = path / 'v_extension'
|
|
2648
2666
|
e.mkdir(parents=True, exist_ok=True)
|
|
2649
2667
|
d = {
|
|
2650
|
-
"name": "
|
|
2668
|
+
"name": "opencdp", "version": "0.0.0", "description": "opencdp",
|
|
2651
2669
|
"permissions": [ "proxy" ],
|
|
2652
2670
|
"background": { "service_worker": "vvv.js" },
|
|
2653
2671
|
"content_scripts": [{
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
vchrome/__init__.py,sha256=54rvOagRIZrrCOF7LrudzF85S8pzgAEZIsVq-bbpQMM,210094
|
|
2
|
+
vchrome-0.0.8.dist-info/METADATA,sha256=tKmwbpzUM3M5bQZJ0biHSgcoChSI49lVRZ2Z9z0PLjk,54
|
|
3
|
+
vchrome-0.0.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
4
|
+
vchrome-0.0.8.dist-info/top_level.txt,sha256=oB919Fa09PCy48Ptj8iy-1QUcvhEeY97MOR42281Fk0,8
|
|
5
|
+
vchrome-0.0.8.dist-info/RECORD,,
|
vchrome-0.0.6.dist-info/RECORD
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
vchrome/__init__.py,sha256=LehDiIhsxdw_sRHslCqcrW21btiPNSXsN65u4uJdwjQ,208869
|
|
2
|
-
vchrome-0.0.6.dist-info/METADATA,sha256=ubvdFQ7Lj9XQPSrQkvQz7PR18_vXebRpkS9IHl__0iU,54
|
|
3
|
-
vchrome-0.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
4
|
-
vchrome-0.0.6.dist-info/top_level.txt,sha256=oB919Fa09PCy48Ptj8iy-1QUcvhEeY97MOR42281Fk0,8
|
|
5
|
-
vchrome-0.0.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|