voidcrawl 0.3.3__tar.gz → 0.3.5__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.
Files changed (74) hide show
  1. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/Cargo.lock +44 -44
  2. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/PKG-INFO +3 -2
  3. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/README.md +1 -0
  4. voidcrawl-0.3.5/crates/core/CORPUS.md +54 -0
  5. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/Cargo.toml +4 -1
  6. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/README.md +1 -0
  7. voidcrawl-0.3.5/crates/core/src/antibot.rs +439 -0
  8. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/error.rs +16 -0
  9. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/lib.rs +2 -0
  10. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/page.rs +567 -11
  11. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/session.rs +37 -1
  12. voidcrawl-0.3.5/crates/core/tests/antibot_accuracy.rs +221 -0
  13. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/pyo3_bindings/Cargo.toml +2 -2
  14. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/pyo3_bindings/src/lib.rs +251 -20
  15. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/pyproject.toml +2 -2
  16. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/__init__.py +20 -6
  17. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/__init__.pyi +10 -0
  18. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/_ext.pyi +132 -3
  19. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/Cargo.toml +0 -0
  20. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/LICENSE.md +0 -0
  21. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/examples/download_and_scan.rs +0 -0
  22. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/examples/download_via_action.rs +0 -0
  23. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/ax.rs +0 -0
  24. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/captcha.rs +0 -0
  25. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/pool.rs +0 -0
  26. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/profile.rs +0 -0
  27. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/scanner.rs +0 -0
  28. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/src/stealth.rs +0 -0
  29. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/ax_tree.rs +0 -0
  30. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/captcha_capture.rs +0 -0
  31. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/captcha_runtime_loaded.rs +0 -0
  32. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/download.rs +0 -0
  33. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/emulation.rs +0 -0
  34. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/integration.rs +0 -0
  35. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/profile_lock.rs +0 -0
  36. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/scanner.rs +0 -0
  37. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/crates/core/tests/stealth_ua.rs +0 -0
  38. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/_downloads.py +0 -0
  39. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/__init__.py +0 -0
  40. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/__init__.pyi +0 -0
  41. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_base.py +0 -0
  42. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_base.pyi +0 -0
  43. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_flow.py +0 -0
  44. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_flow.pyi +0 -0
  45. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_protocol.py +0 -0
  46. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/_protocol.pyi +0 -0
  47. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/__init__.py +0 -0
  48. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/__init__.pyi +0 -0
  49. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/click.py +0 -0
  50. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/click.pyi +0 -0
  51. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/dom.py +0 -0
  52. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/dom.pyi +0 -0
  53. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/hover.py +0 -0
  54. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/hover.pyi +0 -0
  55. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/input.py +0 -0
  56. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/input.pyi +0 -0
  57. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/network.py +0 -0
  58. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/network.pyi +0 -0
  59. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/scroll.py +0 -0
  60. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/scroll.pyi +0 -0
  61. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/wait.py +0 -0
  62. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/builtin/wait.pyi +0 -0
  63. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/js/click_at.js +0 -0
  64. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/js/hover.js +0 -0
  65. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/actions/js/wait_for_selector.js +0 -0
  66. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/cli.py +0 -0
  67. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/debug.py +0 -0
  68. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/debug.pyi +0 -0
  69. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/profiles.py +0 -0
  70. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/py.typed +0 -0
  71. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/scale.py +0 -0
  72. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/scale.pyi +0 -0
  73. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/schema.py +0 -0
  74. {voidcrawl-0.3.3 → voidcrawl-0.3.5}/voidcrawl/schema.pyi +0 -0
@@ -188,9 +188,9 @@ dependencies = [
188
188
 
189
189
  [[package]]
190
190
  name = "bitflags"
191
- version = "2.11.1"
191
+ version = "2.13.0"
192
192
  source = "registry+https://github.com/rust-lang/crates.io-index"
193
- checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
193
+ checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
194
194
  dependencies = [
195
195
  "serde_core",
196
196
  ]
@@ -342,9 +342,9 @@ dependencies = [
342
342
 
343
343
  [[package]]
344
344
  name = "chrono"
345
- version = "0.4.44"
345
+ version = "0.4.45"
346
346
  source = "registry+https://github.com/rust-lang/crates.io-index"
347
- checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
347
+ checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
348
348
  dependencies = [
349
349
  "iana-time-zone",
350
350
  "num-traits",
@@ -1044,9 +1044,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
1044
1044
 
1045
1045
  [[package]]
1046
1046
  name = "http"
1047
- version = "1.4.1"
1047
+ version = "1.4.2"
1048
1048
  source = "registry+https://github.com/rust-lang/crates.io-index"
1049
- checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0"
1049
+ checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
1050
1050
  dependencies = [
1051
1051
  "bytes",
1052
1052
  "itoa",
@@ -1287,9 +1287,9 @@ dependencies = [
1287
1287
 
1288
1288
  [[package]]
1289
1289
  name = "ignore"
1290
- version = "0.4.25"
1290
+ version = "0.4.26"
1291
1291
  source = "registry+https://github.com/rust-lang/crates.io-index"
1292
- checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a"
1292
+ checksum = "b915661dd01db3f05050265b2477bcc6527b3792388e2749b41623cc592be67d"
1293
1293
  dependencies = [
1294
1294
  "crossbeam-deque",
1295
1295
  "globset",
@@ -1415,13 +1415,12 @@ dependencies = [
1415
1415
 
1416
1416
  [[package]]
1417
1417
  name = "js-sys"
1418
- version = "0.3.99"
1418
+ version = "0.3.100"
1419
1419
  source = "registry+https://github.com/rust-lang/crates.io-index"
1420
- checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
1420
+ checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162"
1421
1421
  dependencies = [
1422
1422
  "cfg-if",
1423
1423
  "futures-util",
1424
- "once_cell",
1425
1424
  "wasm-bindgen",
1426
1425
  ]
1427
1426
 
@@ -1478,9 +1477,9 @@ dependencies = [
1478
1477
 
1479
1478
  [[package]]
1480
1479
  name = "log"
1481
- version = "0.4.30"
1480
+ version = "0.4.32"
1482
1481
  source = "registry+https://github.com/rust-lang/crates.io-index"
1483
- checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
1482
+ checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
1484
1483
 
1485
1484
  [[package]]
1486
1485
  name = "logos"
@@ -1950,9 +1949,9 @@ dependencies = [
1950
1949
 
1951
1950
  [[package]]
1952
1951
  name = "regex"
1953
- version = "1.12.3"
1952
+ version = "1.12.4"
1954
1953
  source = "registry+https://github.com/rust-lang/crates.io-index"
1955
- checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
1954
+ checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba"
1956
1955
  dependencies = [
1957
1956
  "aho-corasick",
1958
1957
  "memchr",
@@ -1973,9 +1972,9 @@ dependencies = [
1973
1972
 
1974
1973
  [[package]]
1975
1974
  name = "regex-syntax"
1976
- version = "0.8.10"
1975
+ version = "0.8.11"
1977
1976
  source = "registry+https://github.com/rust-lang/crates.io-index"
1978
- checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
1977
+ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
1979
1978
 
1980
1979
  [[package]]
1981
1980
  name = "reqwest"
@@ -2124,9 +2123,9 @@ dependencies = [
2124
2123
 
2125
2124
  [[package]]
2126
2125
  name = "rustls-native-certs"
2127
- version = "0.8.3"
2126
+ version = "0.8.4"
2128
2127
  source = "registry+https://github.com/rust-lang/crates.io-index"
2129
- checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63"
2128
+ checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d"
2130
2129
  dependencies = [
2131
2130
  "openssl-probe",
2132
2131
  "rustls-pki-types",
@@ -2817,9 +2816,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
2817
2816
 
2818
2817
  [[package]]
2819
2818
  name = "uuid"
2820
- version = "1.23.2"
2819
+ version = "1.23.3"
2821
2820
  source = "registry+https://github.com/rust-lang/crates.io-index"
2822
- checksum = "d258b83ceec21034727ecee8c382cfa6c3e133699b0742c64571814fb420c9f7"
2821
+ checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7"
2823
2822
  dependencies = [
2824
2823
  "getrandom 0.4.2",
2825
2824
  "js-sys",
@@ -2846,7 +2845,7 @@ checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1"
2846
2845
 
2847
2846
  [[package]]
2848
2847
  name = "void_crawl"
2849
- version = "0.3.3"
2848
+ version = "0.3.5"
2850
2849
  dependencies = [
2851
2850
  "futures",
2852
2851
  "pyo3",
@@ -2858,12 +2857,13 @@ dependencies = [
2858
2857
 
2859
2858
  [[package]]
2860
2859
  name = "void_crawl_core"
2861
- version = "0.3.3"
2860
+ version = "0.3.5"
2862
2861
  dependencies = [
2863
2862
  "chromiumoxide",
2864
2863
  "fd-lock",
2865
2864
  "futures",
2866
2865
  "infer",
2866
+ "regex",
2867
2867
  "reqwest",
2868
2868
  "rustls",
2869
2869
  "serde",
@@ -2876,7 +2876,7 @@ dependencies = [
2876
2876
 
2877
2877
  [[package]]
2878
2878
  name = "voidcrawl-mcp"
2879
- version = "0.3.3"
2879
+ version = "0.3.5"
2880
2880
  dependencies = [
2881
2881
  "anyhow",
2882
2882
  "base64",
@@ -2972,9 +2972,9 @@ dependencies = [
2972
2972
 
2973
2973
  [[package]]
2974
2974
  name = "wasm-bindgen"
2975
- version = "0.2.122"
2975
+ version = "0.2.123"
2976
2976
  source = "registry+https://github.com/rust-lang/crates.io-index"
2977
- checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
2977
+ checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563"
2978
2978
  dependencies = [
2979
2979
  "cfg-if",
2980
2980
  "once_cell",
@@ -2985,9 +2985,9 @@ dependencies = [
2985
2985
 
2986
2986
  [[package]]
2987
2987
  name = "wasm-bindgen-futures"
2988
- version = "0.4.72"
2988
+ version = "0.4.73"
2989
2989
  source = "registry+https://github.com/rust-lang/crates.io-index"
2990
- checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f"
2990
+ checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf"
2991
2991
  dependencies = [
2992
2992
  "js-sys",
2993
2993
  "wasm-bindgen",
@@ -2995,9 +2995,9 @@ dependencies = [
2995
2995
 
2996
2996
  [[package]]
2997
2997
  name = "wasm-bindgen-macro"
2998
- version = "0.2.122"
2998
+ version = "0.2.123"
2999
2999
  source = "registry+https://github.com/rust-lang/crates.io-index"
3000
- checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
3000
+ checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc"
3001
3001
  dependencies = [
3002
3002
  "quote",
3003
3003
  "wasm-bindgen-macro-support",
@@ -3005,9 +3005,9 @@ dependencies = [
3005
3005
 
3006
3006
  [[package]]
3007
3007
  name = "wasm-bindgen-macro-support"
3008
- version = "0.2.122"
3008
+ version = "0.2.123"
3009
3009
  source = "registry+https://github.com/rust-lang/crates.io-index"
3010
- checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
3010
+ checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b"
3011
3011
  dependencies = [
3012
3012
  "bumpalo",
3013
3013
  "proc-macro2",
@@ -3018,9 +3018,9 @@ dependencies = [
3018
3018
 
3019
3019
  [[package]]
3020
3020
  name = "wasm-bindgen-shared"
3021
- version = "0.2.122"
3021
+ version = "0.2.123"
3022
3022
  source = "registry+https://github.com/rust-lang/crates.io-index"
3023
- checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
3023
+ checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92"
3024
3024
  dependencies = [
3025
3025
  "unicode-ident",
3026
3026
  ]
@@ -3258,9 +3258,9 @@ dependencies = [
3258
3258
 
3259
3259
  [[package]]
3260
3260
  name = "web-sys"
3261
- version = "0.3.99"
3261
+ version = "0.3.100"
3262
3262
  source = "registry+https://github.com/rust-lang/crates.io-index"
3263
- checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436"
3263
+ checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69"
3264
3264
  dependencies = [
3265
3265
  "js-sys",
3266
3266
  "wasm-bindgen",
@@ -3277,9 +3277,9 @@ dependencies = [
3277
3277
 
3278
3278
  [[package]]
3279
3279
  name = "which"
3280
- version = "8.0.2"
3280
+ version = "8.0.3"
3281
3281
  source = "registry+https://github.com/rust-lang/crates.io-index"
3282
- checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459"
3282
+ checksum = "c789537cf2f7f55be8e6192f92e464174ee55f91af622777f7f1ceb0dbccd03e"
3283
3283
  dependencies = [
3284
3284
  "libc",
3285
3285
  ]
@@ -3638,9 +3638,9 @@ dependencies = [
3638
3638
 
3639
3639
  [[package]]
3640
3640
  name = "yoke"
3641
- version = "0.8.2"
3641
+ version = "0.8.3"
3642
3642
  source = "registry+https://github.com/rust-lang/crates.io-index"
3643
- checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
3643
+ checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
3644
3644
  dependencies = [
3645
3645
  "stable_deref_trait",
3646
3646
  "yoke-derive",
@@ -3661,18 +3661,18 @@ dependencies = [
3661
3661
 
3662
3662
  [[package]]
3663
3663
  name = "zerocopy"
3664
- version = "0.8.50"
3664
+ version = "0.8.52"
3665
3665
  source = "registry+https://github.com/rust-lang/crates.io-index"
3666
- checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1"
3666
+ checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f"
3667
3667
  dependencies = [
3668
3668
  "zerocopy-derive",
3669
3669
  ]
3670
3670
 
3671
3671
  [[package]]
3672
3672
  name = "zerocopy-derive"
3673
- version = "0.8.50"
3673
+ version = "0.8.52"
3674
3674
  source = "registry+https://github.com/rust-lang/crates.io-index"
3675
- checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639"
3675
+ checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930"
3676
3676
  dependencies = [
3677
3677
  "proc-macro2",
3678
3678
  "quote",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidcrawl
3
- Version: 0.3.3
3
+ Version: 0.3.5
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.3 ; extra == 'mcp'
13
+ Requires-Dist: voidcrawl-mcp==0.3.5 ; extra == 'mcp'
14
14
  Provides-Extra: debug
15
15
  Provides-Extra: mcp
16
16
  License-File: LICENSE.md
@@ -177,6 +177,7 @@ uv run pytest tests/ -v
177
177
  ## Documentation
178
178
 
179
179
  - [Full API reference](docs/api-reference.md)
180
+ - [Anti-bot / CDN detection](docs/antibot.md)
180
181
  - [Examples](examples/)
181
182
 
182
183
  ## Contact
@@ -156,6 +156,7 @@ uv run pytest tests/ -v
156
156
  ## Documentation
157
157
 
158
158
  - [Full API reference](docs/api-reference.md)
159
+ - [Anti-bot / CDN detection](docs/antibot.md)
159
160
  - [Examples](examples/)
160
161
 
161
162
  ## Contact
@@ -0,0 +1,54 @@
1
+ # Anti-bot signature corpus
2
+
3
+ The signature corpus embedded in [`src/antibot.rs`](src/antibot.rs) (the
4
+ `CORPUS_JSON` const) fingerprints which anti-bot / WAF / CDN vendor is gating an
5
+ HTTP response, and whether that vendor is *actively challenging* us (a wall) vs.
6
+ merely *present* (a CDN fronting a site that served us fine).
7
+
8
+ ## Provenance & license
9
+
10
+ The vendor list and the `signals[]` / `challenge[]` split are modeled on
11
+ **`albinstman/antibot-print`** (MIT) — <https://github.com/albinstman/antibot-print>.
12
+
13
+ - **Upstream license:** MIT (compatible with this Apache-2.0 / MIT crate).
14
+ - **Reference commit:** *record the SHA you authored against here when syncing.*
15
+ - **What we took:** the *idea* and the vendor taxonomy. The actual regex
16
+ patterns are **first-party** — hand-authored against the vendors we actually
17
+ meet, not a wholesale vendoring of the upstream JSON. This keeps the ruleset
18
+ small, readable, owned, and unit-testable, and avoids tracking upstream churn
19
+ or importing a pattern that bloats compile.
20
+
21
+ ## Governance
22
+
23
+ - The corpus is **not** auto-synced. Treat any change as a reviewable diff.
24
+ - **Bump `CORPUS_VERSION`** in `src/antibot.rs` on every edit. Verdicts are
25
+ recorded with this version so a replay-grade archive can reproduce a
26
+ classification deterministically — a verdict is captured data, never
27
+ recomputed at replay time against a newer corpus.
28
+ - Drift is caught loudly by the **offline accuracy benchmark**
29
+ (`tests/antibot_accuracy.rs`): a held-out labeled corpus scored for
30
+ precision/recall. If a vendor changes its markers and a signature rots, that
31
+ test fails rather than silently lowering field accuracy.
32
+ - The benchmark corpus is deliberately **disjoint** from the live canaries
33
+ (`fortress.theplumber.dev`, `bot.sannysoft.com`) so we measure the detector,
34
+ not one target.
35
+
36
+ ## Adding / editing a vendor
37
+
38
+ 1. Edit `CORPUS_JSON` in `src/antibot.rs`. Patterns are RE2-style (no
39
+ backreferences / lookaround) so they run under the linear-time `regex`
40
+ engine and are safe on attacker-controlled input. Matched case-insensitively
41
+ against the normalized `S:`/`H:`/`B:` form.
42
+ - `H:` patterns are anchored at the header line start (`h:server: …`).
43
+ - `B:` patterns match their marker *anywhere* in the (bounded) body.
44
+ - Put markers that only appear during an **active block** in `challenge[]`;
45
+ put mere-presence markers (CDN headers) in `signals[]`.
46
+ 2. Add a labeled fixture to `tests/antibot_accuracy.rs`.
47
+ 3. Bump `CORPUS_VERSION`.
48
+ 4. `cargo test -p void_crawl_core antibot` + `--test antibot_accuracy`.
49
+
50
+ ## Vendor coverage
51
+
52
+ WAF/CDN: Cloudflare, Akamai, Imperva/Incapsula, AWS WAF, F5 BigIP, Sucuri,
53
+ CloudFront. Bot detection: DataDome, PerimeterX/HUMAN, Kasada. Challenge
54
+ widgets: reCAPTCHA, hCaptcha (Turnstile is folded into the `cloudflare` vendor).
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "void_crawl_core"
3
- version = "0.3.3"
3
+ version = "0.3.5"
4
4
  edition.workspace = true
5
5
  license.workspace = true
6
6
  rust-version.workspace = true
@@ -22,6 +22,9 @@ futures = "0.3"
22
22
  thiserror = "2"
23
23
  serde = { version = "1", features = ["derive"] }
24
24
  serde_json = "1"
25
+ # Linear-time (RE2-style) regex engine for anti-bot vendor fingerprinting.
26
+ # No backtracking → safe to run on attacker-controlled responses every fetch.
27
+ regex = "1"
25
28
  reqwest = { version = "0.13", default-features = false, features = ["rustls-no-provider", "json"] }
26
29
  rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"] }
27
30
  tempfile = "3"
@@ -156,6 +156,7 @@ uv run pytest tests/ -v
156
156
  ## Documentation
157
157
 
158
158
  - [Full API reference](docs/api-reference.md)
159
+ - [Anti-bot / CDN detection](docs/antibot.md)
159
160
  - [Examples](examples/)
160
161
 
161
162
  ## Contact