voidcrawl 0.3.5__tar.gz → 0.3.6__tar.gz
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.
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/Cargo.lock +49 -62
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/Cargo.toml +6 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/PKG-INFO +3 -2
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/README.md +1 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/Cargo.toml +1 -1
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/README.md +1 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/examples/download_via_action.rs +2 -2
- voidcrawl-0.3.6/crates/core/src/input.rs +205 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/lib.rs +1 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/page.rs +322 -11
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/session.rs +35 -1
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/ax_tree.rs +3 -3
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/pyo3_bindings/Cargo.toml +4 -4
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/pyo3_bindings/src/lib.rs +263 -5
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/pyproject.toml +2 -2
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/__init__.py +42 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/__init__.pyi +4 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/_ext.pyi +132 -2
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/profiles.py +3 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/scale.py +4 -1
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/LICENSE.md +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/CORPUS.md +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/examples/download_and_scan.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/antibot.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/ax.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/captcha.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/error.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/pool.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/profile.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/scanner.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/src/stealth.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/antibot_accuracy.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/captcha_capture.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/captcha_runtime_loaded.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/download.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/emulation.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/integration.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/profile_lock.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/scanner.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/crates/core/tests/stealth_ua.rs +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/_downloads.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/__init__.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/__init__.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_base.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_base.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_flow.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_flow.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_protocol.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/_protocol.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/__init__.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/__init__.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/click.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/click.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/dom.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/dom.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/hover.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/hover.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/input.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/input.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/network.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/network.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/scroll.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/scroll.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/wait.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/builtin/wait.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/click_at.js +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/hover.js +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/actions/js/wait_for_selector.js +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/cli.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/debug.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/debug.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/py.typed +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/scale.pyi +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/schema.py +0 -0
- {voidcrawl-0.3.5 → voidcrawl-0.3.6}/voidcrawl/schema.pyi +0 -0
|
@@ -251,9 +251,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
|
|
251
251
|
|
|
252
252
|
[[package]]
|
|
253
253
|
name = "cc"
|
|
254
|
-
version = "1.2.
|
|
254
|
+
version = "1.2.64"
|
|
255
255
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
256
|
-
checksum = "
|
|
256
|
+
checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f"
|
|
257
257
|
dependencies = [
|
|
258
258
|
"find-msvc-tools",
|
|
259
259
|
"shlex",
|
|
@@ -279,8 +279,6 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
|
279
279
|
[[package]]
|
|
280
280
|
name = "chromiumoxide"
|
|
281
281
|
version = "0.9.1"
|
|
282
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
283
|
-
checksum = "26ed067eb6c1f660bdb87c05efb964421d2ca262bae0296cdfe38cf0cd949a3e"
|
|
284
282
|
dependencies = [
|
|
285
283
|
"async-tungstenite",
|
|
286
284
|
"base64",
|
|
@@ -636,9 +634,9 @@ dependencies = [
|
|
|
636
634
|
|
|
637
635
|
[[package]]
|
|
638
636
|
name = "daachorse"
|
|
639
|
-
version = "3.0.
|
|
637
|
+
version = "3.0.2"
|
|
640
638
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
641
|
-
checksum = "
|
|
639
|
+
checksum = "99251f238b74cd219a86fe6ea9328308ebb223fcbb5b8eb5aa400b847a41dded"
|
|
642
640
|
|
|
643
641
|
[[package]]
|
|
644
642
|
name = "darling"
|
|
@@ -1415,9 +1413,9 @@ dependencies = [
|
|
|
1415
1413
|
|
|
1416
1414
|
[[package]]
|
|
1417
1415
|
name = "js-sys"
|
|
1418
|
-
version = "0.3.
|
|
1416
|
+
version = "0.3.102"
|
|
1419
1417
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1420
|
-
checksum = "
|
|
1418
|
+
checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"
|
|
1421
1419
|
dependencies = [
|
|
1422
1420
|
"cfg-if",
|
|
1423
1421
|
"futures-util",
|
|
@@ -1432,9 +1430,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|
|
1432
1430
|
|
|
1433
1431
|
[[package]]
|
|
1434
1432
|
name = "leb128"
|
|
1435
|
-
version = "0.2.
|
|
1433
|
+
version = "0.2.7"
|
|
1436
1434
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1437
|
-
checksum = "
|
|
1435
|
+
checksum = "c83bff1d572d6b9aeef67ddfc8448e4a3737909cb28e81f97c791b9018703e52"
|
|
1438
1436
|
|
|
1439
1437
|
[[package]]
|
|
1440
1438
|
name = "leb128fmt"
|
|
@@ -1535,9 +1533,9 @@ dependencies = [
|
|
|
1535
1533
|
|
|
1536
1534
|
[[package]]
|
|
1537
1535
|
name = "memchr"
|
|
1538
|
-
version = "2.8.
|
|
1536
|
+
version = "2.8.2"
|
|
1539
1537
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1540
|
-
checksum = "
|
|
1538
|
+
checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
|
|
1541
1539
|
|
|
1542
1540
|
[[package]]
|
|
1543
1541
|
name = "memfd"
|
|
@@ -1768,9 +1766,9 @@ dependencies = [
|
|
|
1768
1766
|
|
|
1769
1767
|
[[package]]
|
|
1770
1768
|
name = "pyo3"
|
|
1771
|
-
version = "0.
|
|
1769
|
+
version = "0.29.0"
|
|
1772
1770
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1773
|
-
checksum = "
|
|
1771
|
+
checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
|
|
1774
1772
|
dependencies = [
|
|
1775
1773
|
"libc",
|
|
1776
1774
|
"once_cell",
|
|
@@ -1782,9 +1780,9 @@ dependencies = [
|
|
|
1782
1780
|
|
|
1783
1781
|
[[package]]
|
|
1784
1782
|
name = "pyo3-async-runtimes"
|
|
1785
|
-
version = "0.
|
|
1783
|
+
version = "0.29.0"
|
|
1786
1784
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1787
|
-
checksum = "
|
|
1785
|
+
checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046"
|
|
1788
1786
|
dependencies = [
|
|
1789
1787
|
"futures-channel",
|
|
1790
1788
|
"futures-util",
|
|
@@ -1796,19 +1794,18 @@ dependencies = [
|
|
|
1796
1794
|
|
|
1797
1795
|
[[package]]
|
|
1798
1796
|
name = "pyo3-build-config"
|
|
1799
|
-
version = "0.
|
|
1797
|
+
version = "0.29.0"
|
|
1800
1798
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1801
|
-
checksum = "
|
|
1799
|
+
checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
|
|
1802
1800
|
dependencies = [
|
|
1803
|
-
"python3-dll-a",
|
|
1804
1801
|
"target-lexicon",
|
|
1805
1802
|
]
|
|
1806
1803
|
|
|
1807
1804
|
[[package]]
|
|
1808
1805
|
name = "pyo3-ffi"
|
|
1809
|
-
version = "0.
|
|
1806
|
+
version = "0.29.0"
|
|
1810
1807
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1811
|
-
checksum = "
|
|
1808
|
+
checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
|
|
1812
1809
|
dependencies = [
|
|
1813
1810
|
"libc",
|
|
1814
1811
|
"pyo3-build-config",
|
|
@@ -1816,9 +1813,9 @@ dependencies = [
|
|
|
1816
1813
|
|
|
1817
1814
|
[[package]]
|
|
1818
1815
|
name = "pyo3-macros"
|
|
1819
|
-
version = "0.
|
|
1816
|
+
version = "0.29.0"
|
|
1820
1817
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1821
|
-
checksum = "
|
|
1818
|
+
checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
|
|
1822
1819
|
dependencies = [
|
|
1823
1820
|
"proc-macro2",
|
|
1824
1821
|
"pyo3-macros-backend",
|
|
@@ -1828,26 +1825,16 @@ dependencies = [
|
|
|
1828
1825
|
|
|
1829
1826
|
[[package]]
|
|
1830
1827
|
name = "pyo3-macros-backend"
|
|
1831
|
-
version = "0.
|
|
1828
|
+
version = "0.29.0"
|
|
1832
1829
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1833
|
-
checksum = "
|
|
1830
|
+
checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
|
|
1834
1831
|
dependencies = [
|
|
1835
1832
|
"heck",
|
|
1836
1833
|
"proc-macro2",
|
|
1837
|
-
"pyo3-build-config",
|
|
1838
1834
|
"quote",
|
|
1839
1835
|
"syn",
|
|
1840
1836
|
]
|
|
1841
1837
|
|
|
1842
|
-
[[package]]
|
|
1843
|
-
name = "python3-dll-a"
|
|
1844
|
-
version = "0.2.15"
|
|
1845
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1846
|
-
checksum = "d80ba7540edb18890d444c5aa8e1f1f99b1bdf26fb26ae383135325f4a36042b"
|
|
1847
|
-
dependencies = [
|
|
1848
|
-
"cc",
|
|
1849
|
-
]
|
|
1850
|
-
|
|
1851
1838
|
[[package]]
|
|
1852
1839
|
name = "quote"
|
|
1853
1840
|
version = "1.0.45"
|
|
@@ -2391,9 +2378,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
|
|
2391
2378
|
|
|
2392
2379
|
[[package]]
|
|
2393
2380
|
name = "smallvec"
|
|
2394
|
-
version = "1.15.
|
|
2381
|
+
version = "1.15.2"
|
|
2395
2382
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2396
|
-
checksum = "
|
|
2383
|
+
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
|
2397
2384
|
dependencies = [
|
|
2398
2385
|
"serde",
|
|
2399
2386
|
]
|
|
@@ -2440,9 +2427,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
|
|
2440
2427
|
|
|
2441
2428
|
[[package]]
|
|
2442
2429
|
name = "syn"
|
|
2443
|
-
version = "2.0.
|
|
2430
|
+
version = "2.0.118"
|
|
2444
2431
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2445
|
-
checksum = "
|
|
2432
|
+
checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422"
|
|
2446
2433
|
dependencies = [
|
|
2447
2434
|
"proc-macro2",
|
|
2448
2435
|
"quote",
|
|
@@ -2845,7 +2832,7 @@ checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
|
|
|
2845
2832
|
|
|
2846
2833
|
[[package]]
|
|
2847
2834
|
name = "void_crawl"
|
|
2848
|
-
version = "0.3.
|
|
2835
|
+
version = "0.3.6"
|
|
2849
2836
|
dependencies = [
|
|
2850
2837
|
"futures",
|
|
2851
2838
|
"pyo3",
|
|
@@ -2857,7 +2844,7 @@ dependencies = [
|
|
|
2857
2844
|
|
|
2858
2845
|
[[package]]
|
|
2859
2846
|
name = "void_crawl_core"
|
|
2860
|
-
version = "0.3.
|
|
2847
|
+
version = "0.3.6"
|
|
2861
2848
|
dependencies = [
|
|
2862
2849
|
"chromiumoxide",
|
|
2863
2850
|
"fd-lock",
|
|
@@ -2876,7 +2863,7 @@ dependencies = [
|
|
|
2876
2863
|
|
|
2877
2864
|
[[package]]
|
|
2878
2865
|
name = "voidcrawl-mcp"
|
|
2879
|
-
version = "0.3.
|
|
2866
|
+
version = "0.3.6"
|
|
2880
2867
|
dependencies = [
|
|
2881
2868
|
"anyhow",
|
|
2882
2869
|
"base64",
|
|
@@ -2954,9 +2941,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|
|
2954
2941
|
|
|
2955
2942
|
[[package]]
|
|
2956
2943
|
name = "wasip2"
|
|
2957
|
-
version = "1.0.
|
|
2944
|
+
version = "1.0.4+wasi-0.2.12"
|
|
2958
2945
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2959
|
-
checksum = "
|
|
2946
|
+
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
|
2960
2947
|
dependencies = [
|
|
2961
2948
|
"wit-bindgen 0.57.1",
|
|
2962
2949
|
]
|
|
@@ -2972,9 +2959,9 @@ dependencies = [
|
|
|
2972
2959
|
|
|
2973
2960
|
[[package]]
|
|
2974
2961
|
name = "wasm-bindgen"
|
|
2975
|
-
version = "0.2.
|
|
2962
|
+
version = "0.2.125"
|
|
2976
2963
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2977
|
-
checksum = "
|
|
2964
|
+
checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a"
|
|
2978
2965
|
dependencies = [
|
|
2979
2966
|
"cfg-if",
|
|
2980
2967
|
"once_cell",
|
|
@@ -2985,9 +2972,9 @@ dependencies = [
|
|
|
2985
2972
|
|
|
2986
2973
|
[[package]]
|
|
2987
2974
|
name = "wasm-bindgen-futures"
|
|
2988
|
-
version = "0.4.
|
|
2975
|
+
version = "0.4.75"
|
|
2989
2976
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2990
|
-
checksum = "
|
|
2977
|
+
checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280"
|
|
2991
2978
|
dependencies = [
|
|
2992
2979
|
"js-sys",
|
|
2993
2980
|
"wasm-bindgen",
|
|
@@ -2995,9 +2982,9 @@ dependencies = [
|
|
|
2995
2982
|
|
|
2996
2983
|
[[package]]
|
|
2997
2984
|
name = "wasm-bindgen-macro"
|
|
2998
|
-
version = "0.2.
|
|
2985
|
+
version = "0.2.125"
|
|
2999
2986
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3000
|
-
checksum = "
|
|
2987
|
+
checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d"
|
|
3001
2988
|
dependencies = [
|
|
3002
2989
|
"quote",
|
|
3003
2990
|
"wasm-bindgen-macro-support",
|
|
@@ -3005,9 +2992,9 @@ dependencies = [
|
|
|
3005
2992
|
|
|
3006
2993
|
[[package]]
|
|
3007
2994
|
name = "wasm-bindgen-macro-support"
|
|
3008
|
-
version = "0.2.
|
|
2995
|
+
version = "0.2.125"
|
|
3009
2996
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3010
|
-
checksum = "
|
|
2997
|
+
checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd"
|
|
3011
2998
|
dependencies = [
|
|
3012
2999
|
"bumpalo",
|
|
3013
3000
|
"proc-macro2",
|
|
@@ -3018,9 +3005,9 @@ dependencies = [
|
|
|
3018
3005
|
|
|
3019
3006
|
[[package]]
|
|
3020
3007
|
name = "wasm-bindgen-shared"
|
|
3021
|
-
version = "0.2.
|
|
3008
|
+
version = "0.2.125"
|
|
3022
3009
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3023
|
-
checksum = "
|
|
3010
|
+
checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f"
|
|
3024
3011
|
dependencies = [
|
|
3025
3012
|
"unicode-ident",
|
|
3026
3013
|
]
|
|
@@ -3258,9 +3245,9 @@ dependencies = [
|
|
|
3258
3245
|
|
|
3259
3246
|
[[package]]
|
|
3260
3247
|
name = "web-sys"
|
|
3261
|
-
version = "0.3.
|
|
3248
|
+
version = "0.3.102"
|
|
3262
3249
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3263
|
-
checksum = "
|
|
3250
|
+
checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d"
|
|
3264
3251
|
dependencies = [
|
|
3265
3252
|
"js-sys",
|
|
3266
3253
|
"wasm-bindgen",
|
|
@@ -3277,9 +3264,9 @@ dependencies = [
|
|
|
3277
3264
|
|
|
3278
3265
|
[[package]]
|
|
3279
3266
|
name = "which"
|
|
3280
|
-
version = "8.0.
|
|
3267
|
+
version = "8.0.4"
|
|
3281
3268
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3282
|
-
checksum = "
|
|
3269
|
+
checksum = "48d7cd18d4acb58fb3cdfe9ea54e6cd96a4e7d4cc45c56338b236e82dad47248"
|
|
3283
3270
|
dependencies = [
|
|
3284
3271
|
"libc",
|
|
3285
3272
|
]
|
|
@@ -3608,9 +3595,9 @@ dependencies = [
|
|
|
3608
3595
|
|
|
3609
3596
|
[[package]]
|
|
3610
3597
|
name = "yara-x-macros"
|
|
3611
|
-
version = "1.
|
|
3598
|
+
version = "1.18.0"
|
|
3612
3599
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3613
|
-
checksum = "
|
|
3600
|
+
checksum = "f3ed838cfc6391f383db4b408ae65f0b113277222b6bb98a3baa29b5f34e3293"
|
|
3614
3601
|
dependencies = [
|
|
3615
3602
|
"darling",
|
|
3616
3603
|
"proc-macro2",
|
|
@@ -3702,9 +3689,9 @@ dependencies = [
|
|
|
3702
3689
|
|
|
3703
3690
|
[[package]]
|
|
3704
3691
|
name = "zeroize"
|
|
3705
|
-
version = "1.
|
|
3692
|
+
version = "1.9.0"
|
|
3706
3693
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
3707
|
-
checksum = "
|
|
3694
|
+
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
|
|
3708
3695
|
|
|
3709
3696
|
[[package]]
|
|
3710
3697
|
name = "zerotrie"
|
|
@@ -39,3 +39,9 @@ similar_names = "allow"
|
|
|
39
39
|
doc_lazy_continuation = "allow"
|
|
40
40
|
needless_raw_string_hashes = "allow"
|
|
41
41
|
too_many_lines = "allow"
|
|
42
|
+
|
|
43
|
+
# Vendored chromiumoxide with VoidCrawl's minimal-CDP stealth patch surface.
|
|
44
|
+
# The fork still launches or attaches to stock Chrome/Chromium; it only changes
|
|
45
|
+
# selected CDP-client behavior when VOIDCRAWL_STEALTH_NO_RUNTIME is set.
|
|
46
|
+
[patch.crates-io]
|
|
47
|
+
chromiumoxide = { path = "vendor/chromiumoxide" }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voidcrawl
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
5
5
|
Classifier: Programming Language :: Python :: 3.10
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -10,7 +10,7 @@ Classifier: Programming Language :: Python :: 3.14
|
|
|
10
10
|
Requires-Dist: click>=8.3.2
|
|
11
11
|
Requires-Dist: pydantic>=2
|
|
12
12
|
Requires-Dist: rich>=14.3.3 ; extra == 'debug'
|
|
13
|
-
Requires-Dist: voidcrawl-mcp==0.3.
|
|
13
|
+
Requires-Dist: voidcrawl-mcp==0.3.6 ; extra == 'mcp'
|
|
14
14
|
Provides-Extra: debug
|
|
15
15
|
Provides-Extra: mcp
|
|
16
16
|
License-File: LICENSE.md
|
|
@@ -178,6 +178,7 @@ uv run pytest tests/ -v
|
|
|
178
178
|
|
|
179
179
|
- [Full API reference](docs/api-reference.md)
|
|
180
180
|
- [Anti-bot / CDN detection](docs/antibot.md)
|
|
181
|
+
- [Cross-origin & closed-shadow frames](docs/cross-origin-frames.md)
|
|
181
182
|
- [Examples](examples/)
|
|
182
183
|
|
|
183
184
|
## Contact
|
|
@@ -43,10 +43,10 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|
|
43
43
|
let capture = page.arm_download(quarantine.path(), max_bytes).await?;
|
|
44
44
|
|
|
45
45
|
println!(" clicking the \"Download\" button …");
|
|
46
|
-
page.click_by_role("button", "Download", 0).await?;
|
|
46
|
+
page.click_by_role("button", "Download", 0, false).await?;
|
|
47
47
|
// Drive may interpose a "Download anyway" virus-scan interstitial for files
|
|
48
48
|
// it can't scan — clicking it is just another action in the same flow.
|
|
49
|
-
let _ = page.click_by_role("button", "Download anyway", 0).await;
|
|
49
|
+
let _ = page.click_by_role("button", "Download anyway", 0, false).await;
|
|
50
50
|
|
|
51
51
|
println!(" waiting for the download to land …");
|
|
52
52
|
let outcome = capture.wait(&page, Duration::from_secs(90)).await?;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
//! Humanized pointer paths for CDP mouse input (CAS-147).
|
|
2
|
+
//!
|
|
3
|
+
//! Pure, dependency-free generation of a realistic cursor trajectory between
|
|
4
|
+
//! two points, emitted as a sequence of `Input.dispatchMouseEvent` `MouseMoved`
|
|
5
|
+
//! steps before the press. The path has **non-linear (arc) curvature**, a
|
|
6
|
+
//! **minimum-jerk** velocity profile (slow start/stop), small **tremor**, and
|
|
7
|
+
//! an optional **dwell** on the target — the traits a managed challenge looks
|
|
8
|
+
//! for in real pointer input. No page-world JS is injected; only CDP events.
|
|
9
|
+
//!
|
|
10
|
+
//! Generation is deterministic under a seeded [`Rng`] so it can be unit-tested
|
|
11
|
+
//! exactly; the live path seeds from wall-clock entropy at the call site.
|
|
12
|
+
|
|
13
|
+
#![allow(clippy::cast_possible_truncation, clippy::cast_precision_loss, clippy::cast_sign_loss)]
|
|
14
|
+
|
|
15
|
+
/// One step along a humanized path: an absolute target plus the delay to wait
|
|
16
|
+
/// *before* dispatching it (ms).
|
|
17
|
+
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
18
|
+
pub struct PathStep {
|
|
19
|
+
pub x: f64,
|
|
20
|
+
pub y: f64,
|
|
21
|
+
pub delay_ms: u64,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Shape/timing knobs for [`humanized_path`].
|
|
25
|
+
#[derive(Debug, Clone, Copy)]
|
|
26
|
+
pub struct HumanizeOptions {
|
|
27
|
+
/// Max perpendicular bow of the arc, in px (actual is randomized within ±).
|
|
28
|
+
pub curve: f64,
|
|
29
|
+
/// Per-step tremor amplitude, in px (damped toward the target).
|
|
30
|
+
pub tremor: f64,
|
|
31
|
+
/// Pause on the target before the press, in ms (a final dwell step).
|
|
32
|
+
pub dwell_ms: u64,
|
|
33
|
+
/// Total movement duration floor, in ms.
|
|
34
|
+
pub min_duration_ms: f64,
|
|
35
|
+
/// Total movement duration ceiling, in ms — keeps agent workflows bounded.
|
|
36
|
+
pub max_duration_ms: f64,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl Default for HumanizeOptions {
|
|
40
|
+
fn default() -> Self {
|
|
41
|
+
Self {
|
|
42
|
+
curve: 22.0,
|
|
43
|
+
tremor: 1.1,
|
|
44
|
+
dwell_ms: 55,
|
|
45
|
+
min_duration_ms: 120.0,
|
|
46
|
+
max_duration_ms: 900.0,
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// SplitMix64 — a tiny deterministic PRNG. Avoids a `rand` dependency and makes
|
|
52
|
+
/// path generation reproducible from a seed (for tests).
|
|
53
|
+
#[derive(Debug, Clone)]
|
|
54
|
+
pub struct Rng(u64);
|
|
55
|
+
|
|
56
|
+
impl Rng {
|
|
57
|
+
#[must_use]
|
|
58
|
+
pub fn seed(seed: u64) -> Self {
|
|
59
|
+
Self(seed)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
fn next_u64(&mut self) -> u64 {
|
|
63
|
+
self.0 = self.0.wrapping_add(0x9E37_79B9_7F4A_7C15);
|
|
64
|
+
let mut z = self.0;
|
|
65
|
+
z = (z ^ (z >> 30)).wrapping_mul(0xBF58_476D_1CE4_E5B9);
|
|
66
|
+
z = (z ^ (z >> 27)).wrapping_mul(0x94D0_49BB_1331_11EB);
|
|
67
|
+
z ^ (z >> 31)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// Uniform in `[0, 1)`.
|
|
71
|
+
fn unit(&mut self) -> f64 {
|
|
72
|
+
// 53-bit mantissa for an even distribution.
|
|
73
|
+
(self.next_u64() >> 11) as f64 / (1u64 << 53) as f64
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Uniform in `[lo, hi)`.
|
|
77
|
+
fn range(&mut self, lo: f64, hi: f64) -> f64 {
|
|
78
|
+
lo + (hi - lo) * self.unit()
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Minimum-jerk easing `6t^5 - 15t^4 + 10t^3` (smootherstep): zero velocity and
|
|
83
|
+
/// acceleration at both ends, like a real hand starting and stopping.
|
|
84
|
+
fn min_jerk(t: f64) -> f64 {
|
|
85
|
+
t * t * t * (t * (t * 6.0 - 15.0) + 10.0)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// Generate a humanized cursor path from `start` to `end`.
|
|
89
|
+
///
|
|
90
|
+
/// Returns at least a couple of `MouseMoved` steps (more for longer travel),
|
|
91
|
+
/// the **last of which lands exactly on `end`**, optionally followed by a dwell
|
|
92
|
+
/// step (same coords, `dwell_ms`). Total of all `delay_ms` is bounded by
|
|
93
|
+
/// `opts.max_duration_ms` (+ the dwell).
|
|
94
|
+
#[must_use]
|
|
95
|
+
pub fn humanized_path(
|
|
96
|
+
start: (f64, f64),
|
|
97
|
+
end: (f64, f64),
|
|
98
|
+
opts: &HumanizeOptions,
|
|
99
|
+
rng: &mut Rng,
|
|
100
|
+
) -> Vec<PathStep> {
|
|
101
|
+
let (x0, y0) = start;
|
|
102
|
+
let (x1, y1) = end;
|
|
103
|
+
let (dx, dy) = (x1 - x0, y1 - y0);
|
|
104
|
+
let dist = dx.hypot(dy);
|
|
105
|
+
|
|
106
|
+
// Step count and duration both scale with distance, then clamp.
|
|
107
|
+
let steps = ((dist / 9.0).round() as usize).clamp(6, 40);
|
|
108
|
+
let duration =
|
|
109
|
+
(opts.min_duration_ms + dist * 1.6).clamp(opts.min_duration_ms, opts.max_duration_ms);
|
|
110
|
+
|
|
111
|
+
// Perpendicular unit vector for the arc bow (zero for a zero-length move).
|
|
112
|
+
let (nx, ny) = if dist > 1e-6 { (-dy / dist, dx / dist) } else { (0.0, 0.0) };
|
|
113
|
+
let bow = rng.range(-opts.curve, opts.curve);
|
|
114
|
+
|
|
115
|
+
let mut out = Vec::with_capacity(steps + 1);
|
|
116
|
+
let mut prev_e = 0.0_f64;
|
|
117
|
+
for i in 1..=steps {
|
|
118
|
+
let t = i as f64 / steps as f64;
|
|
119
|
+
let e = min_jerk(t);
|
|
120
|
+
// Arc weight peaks at the midpoint, vanishes at both ends.
|
|
121
|
+
let arc = bow * (1.0 - (2.0 * e - 1.0).powi(2));
|
|
122
|
+
// Tremor: damped toward the target for a clean final landing.
|
|
123
|
+
let damp = 1.0 - 0.65 * e;
|
|
124
|
+
let jx = rng.range(-opts.tremor, opts.tremor) * damp;
|
|
125
|
+
let jy = rng.range(-opts.tremor, opts.tremor) * damp;
|
|
126
|
+
// Per-step delay follows the same min-jerk profile (fast in the middle).
|
|
127
|
+
let delay = ((e - prev_e) * duration).max(1.0).round() as u64;
|
|
128
|
+
prev_e = e;
|
|
129
|
+
out.push(PathStep {
|
|
130
|
+
x: x0 + dx * e + nx * arc + jx,
|
|
131
|
+
y: y0 + dy * e + ny * arc + jy,
|
|
132
|
+
delay_ms: delay,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Land exactly on target (no residual tremor on the final position).
|
|
136
|
+
if let Some(last) = out.last_mut() {
|
|
137
|
+
last.x = x1;
|
|
138
|
+
last.y = y1;
|
|
139
|
+
}
|
|
140
|
+
// Optional dwell on the target before the press.
|
|
141
|
+
if opts.dwell_ms > 0 {
|
|
142
|
+
out.push(PathStep { x: x1, y: y1, delay_ms: opts.dwell_ms });
|
|
143
|
+
}
|
|
144
|
+
out
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
#[cfg(test)]
|
|
148
|
+
mod tests {
|
|
149
|
+
use super::*;
|
|
150
|
+
|
|
151
|
+
const A: (f64, f64) = (0.0, 0.0);
|
|
152
|
+
const B: (f64, f64) = (300.0, 200.0);
|
|
153
|
+
|
|
154
|
+
#[test]
|
|
155
|
+
fn seeded_generation_is_deterministic() {
|
|
156
|
+
let opts = HumanizeOptions::default();
|
|
157
|
+
let p1 = humanized_path(A, B, &opts, &mut Rng::seed(42));
|
|
158
|
+
let p2 = humanized_path(A, B, &opts, &mut Rng::seed(42));
|
|
159
|
+
assert_eq!(p1, p2);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#[test]
|
|
163
|
+
fn different_seeds_differ() {
|
|
164
|
+
let opts = HumanizeOptions::default();
|
|
165
|
+
let p1 = humanized_path(A, B, &opts, &mut Rng::seed(1));
|
|
166
|
+
let p2 = humanized_path(A, B, &opts, &mut Rng::seed(2));
|
|
167
|
+
assert_ne!(p1, p2);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#[test]
|
|
171
|
+
fn emits_multiple_moves_and_lands_exactly_on_target() {
|
|
172
|
+
let opts = HumanizeOptions::default();
|
|
173
|
+
let path = humanized_path(A, B, &opts, &mut Rng::seed(7));
|
|
174
|
+
// Several moves before the press (dwell is the last step here).
|
|
175
|
+
assert!(path.len() >= 6, "got {} steps", path.len());
|
|
176
|
+
// The move that places the cursor on target is exact.
|
|
177
|
+
let move_steps = &path[..path.len() - 1];
|
|
178
|
+
assert!(!move_steps.is_empty(), "humanized path should include movement steps");
|
|
179
|
+
let landing = move_steps[move_steps.len() - 1];
|
|
180
|
+
assert!((landing.x - B.0).abs() < 1e-9 && (landing.y - B.1).abs() < 1e-9);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
#[test]
|
|
184
|
+
fn duration_is_bounded() {
|
|
185
|
+
let opts = HumanizeOptions::default();
|
|
186
|
+
// A very long travel still stays within the ceiling (+ dwell).
|
|
187
|
+
let path = humanized_path((0.0, 0.0), (5000.0, 5000.0), &opts, &mut Rng::seed(3));
|
|
188
|
+
let total: u64 = path.iter().map(|s| s.delay_ms).sum();
|
|
189
|
+
let ceiling = opts.max_duration_ms as u64 + opts.dwell_ms + path.len() as u64;
|
|
190
|
+
assert!(total <= ceiling, "total {total} > ceiling {ceiling}");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
#[test]
|
|
194
|
+
fn path_is_curved_not_straight() {
|
|
195
|
+
// A no-tremor, fixed-bow path should bow off the straight line at the mid.
|
|
196
|
+
let opts = HumanizeOptions { tremor: 0.0, dwell_ms: 0, ..Default::default() };
|
|
197
|
+
let path = humanized_path(A, B, &opts, &mut Rng::seed(11));
|
|
198
|
+
let mid = path[path.len() / 2];
|
|
199
|
+
// Distance of the midpoint from the straight A→B line.
|
|
200
|
+
let (dx, dy) = (B.0 - A.0, B.1 - A.1);
|
|
201
|
+
let len = dx.hypot(dy);
|
|
202
|
+
let dev = ((mid.x - A.0) * dy - (mid.y - A.1) * dx).abs() / len;
|
|
203
|
+
assert!(dev > 1.0, "midpoint deviation {dev} too small — path is ~straight");
|
|
204
|
+
}
|
|
205
|
+
}
|