{"_id":"puppeteer-afp","_rev":"11-906845108e01daa50628e9321069d420","name":"puppeteer-afp","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.1":{"name":"puppeteer-afp","version":"1.0.1","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.0.1","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"9ca07e95c032b69f7e5afc50a82ea692b9613743","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.0.1.tgz","fileCount":9,"integrity":"sha512-BLG5DKlBbi9w5GGlk/MfEzfmR+knRIxkUKLJMdK0Z7hGe8aac0aF+qwjNOUVKx/09unKJJO6I+FLLbRiP1dW9g==","signatures":[{"sig":"MEUCIQDuWZbsDclVJ6lCVWBjcAdcEFOOAAMplekEqWD+0RRg0wIgbVqvo7lneBBX+t+w7fZ9U+TDA3rJyn6pZIz2chzw4mE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfP+RaCRA9TVsSAnZWagAAHz0QAI8ZHxcCbLEn2RNcARq4\nCG/dWxTEn6VByZHEx+nqkuKCCtGcPVBz+CCe3/rbkuQxp50Rjy9kUkbgZ1/D\nVo3bYQbcGIAfVhM8nz1d2BUKFX/ZWk5StHj5v0l0wqGOgaUfkDK2ZVhW8CLN\nnzDgvt4fFwVH0eRkGrcfrhmMpR2OUgdRvJ5ucHuoxpOrGTi867Kcfmd6jD1r\nVaRXwROqG01nJnzzzcv5pOgP5hgfO7DtRgRiwfnl8hCCPpDYYzKST7m/gg1s\nytWAe2zSBdmcgMp+v6NV3LyZlXdHBYUXu1EVGhONTq1R8VSKcctLSfjGxax1\ntoA3NqoxzGdLQd4XCak6aob5D4Oxi4Vyvjm0sktAADsctnB4nRagMCIvmAsR\nRrPr7ln+FmmYNB+tPA8KcfnZmHYxnzzT/z042uV/Dld4jLV//WETpt1HTtDy\n0rhHL/84HAjQo4sYog1t32Q6COUhl+xX0Dmy87+0v4cYqW60/No7/+wZTBOs\nxuar43wDXiXqvC2NK1hyaEQemBp8xwnq+52XDJ6BEHAmnFRCUK3/VGBZk05R\ni5FwMAg/B9sgx3isDi+54AjK6TzWHQpzqinZMRH867rzp7Frtp/xP7BTay70\ngVjtnYLnREuECro1NLhdMnolZoorE3cZ1uzZMWUsy8mOswKFe9l8szxBCZ6X\nsWHv\r\n=KyLt\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"6e9af89a756c8241526264ea31d817f8b5b789da","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"6.14.7","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"14.8.0","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.0.1_1598022745778_0.4662455005752104","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"puppeteer-afp","version":"1.0.3","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.0.3","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"c765e6f8d70cd2893c6d763dab5a026471a8ecca","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.0.3.tgz","fileCount":9,"integrity":"sha512-Nt/16pLXA7+6mRwPhMgZZdkg0UtNLXxfDFsC9HbXfLJ53L6Rx0VspWH2SF/o5ZG8hhsmghxokHh3PK1VSTTm3A==","signatures":[{"sig":"MEUCIQDpUTA0nJkbjLkO8Id0rLYV9oF9nNkfGmulWY+vfxcfzQIgG/OmlnAiBGgxiwXqqAYBqN/obQarYb5Q1r56q/yQ454=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13519,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjUT3LACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoCJRAAmxNGeQZX40PEgzepS7u8cq9keOGAT4H7JMC6BQqyUaWRenj5\r\nJ6KOWT41Lf7Ktw54W09rVqddiIHOI6WEolHJWxcIu3qChVuwYgZbb6VDTPXS\r\nRvERt+qQdENmr6ShYQZLcoKShOcdndZttLTuU6dxaUHnLZSC5Sy+UCeZDIgf\r\nLs0YhjA/KNpzy7e0KVRz9zFZogXP6v3Yo/mtyAuzP6yzXkmQDgLD5ID5WM3h\r\nslnHYux5TNE7oPBXgTjme5xnm4uuw7wa/G9DIZLW0wdHx37JUSzMSo9tkqac\r\n1Z5rELCOLMaTTYNkicxWSB12NOR2lLu9Ua9CzDm6bs8Rct7FIZSSfUgJbg4F\r\n5yycU2ck09f/hJr9+2z1k8PUUrVTBAsKzGW7JmNwGjVQXuQdm/OdXOdn1TTs\r\nJxRbbEvykGvoJiQ6htKApsWQFw5eYmhMbEs9mTd3XPyO9DOTOPK3WKiUPFtE\r\nhz9a//O4yUIs2A239zcbSGPnGmM4jpThmox6dH8LPd8IlGBkjtv/joPbV1tt\r\nWe3mVsRmAtjGJJvTbB2ezJxcg6lDN+EuUL2MaVBwsri/0TGUHRpmUNYBXf9F\r\ng7rAVigMGTPFIFbtzH+dDaWoL9SvZZMwx8goauebHx948PRFyep7HH1tYhNO\r\nO/l3Xvc9MctUmE805NxX4GVMEjd7xKGkpn4=\r\n=hIWs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"7c40844eb4f6d21bbd4b631c196ebc3692e608bd","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.16.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.0.0","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.0.3_1666268619535_0.9482111448289063","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"puppeteer-afp","version":"1.0.5","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.0.5","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"7207d2e0ae3b2e959d54e05d1ca1a7baf61bcc3e","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.0.5.tgz","fileCount":11,"integrity":"sha512-UvUoA+iCDFy4niq8gVcbgMAd4ev7UgJ1Z7Hgt0CLuGYivzyoyKt8Pp8F5tdHXCNCpPuYlBoN3BYGj1h7U1ayug==","signatures":[{"sig":"MEUCIQCXrzkwlqD5AAeO2C4b5XIXWldbCqjpTeMtYpU5r7ouygIgCPYnhhTUSw5PYHKZiBDP8YqT/HHzNPK4jXLEYbEV1Ec=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16267},"main":"index.js","gitHead":"d570303f53698b320692591bc5b39c59950187dd","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.0.5_1706018311184_0.06146178163940741","host":"s3://npm-registry-packages"}},"1.0.9":{"name":"puppeteer-afp","version":"1.0.9","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.0.9","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"b30ce20f81183576aef7f5ed639904fcb00b6a20","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.0.9.tgz","fileCount":11,"integrity":"sha512-zhSr/rBpcnJ4JJles69OZb9KYLkE5hl7Zfo/3Qvz316utUMKFXKPMf/FiTutbjdWBbcdQ6m/K/mG3tkQ6vIhRA==","signatures":[{"sig":"MEQCIHbr1xrPSZT3shDlF3s/WaKps1cR5/gPNTohIQTnQphkAiB1Uo+QtXp1PzH6nYnLFH+FeGayuklBIVX8a2HTkP3+Sw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28072},"main":"index.js","gitHead":"1b23b6127885e34e56a1530ff9887bbb9255c062","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.0.9_1711578753670_0.12150609979868165","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"puppeteer-afp","version":"1.1.1","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.1.1","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"de33d003fbe89ff7b0e42a278e14921e35a0cbf9","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.1.1.tgz","fileCount":11,"integrity":"sha512-l5HSCQLmqJnsDCvazl2bLN2czfTEG4h7+wjly0QiqHrJW/FMDmDm8HEJIwuxni4RsetfBGT04D9cPQNcfkYllw==","signatures":[{"sig":"MEUCIQCcz3LrFbTeF+mIi20FLoaGiEPsV8KiRXSvk6rCRLkjkQIgQSwoki8lzsg5pPu+t7BRM+35rTybyqLw5lpSVrXh3GQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28024},"main":"index.js","gitHead":"00f408819dd01401e470479d0d79ebf7a2ff2227","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.1.1_1711968579565_0.8526028940101507","host":"s3://npm-registry-packages"}},"1.1.3":{"name":"puppeteer-afp","version":"1.1.3","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.1.3","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"faea92d529761bd3fc3f04b44654a0b91d2f5121","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.1.3.tgz","fileCount":11,"integrity":"sha512-c5nJNQPod2piuLFIOi4BLIWZbw1EOYeE2Zm1VDNiurqFacjCK5xOhxBMuiA6sQqVrLHoiMgrl9gkdytDynqTUQ==","signatures":[{"sig":"MEQCIElNCgfYmwaMkEzCq9LWMHwwiPNNN122GqMCQv5jumYgAiAf+J5U9HTJkMTRBbnNG1zlRi6mZ81r01Ih0m4omTMrxg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28739},"main":"index.js","gitHead":"5c5b288c5a49d7ff5377c8d55f684c947da45ca1","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.1.3_1712180054438_0.02273811354408739","host":"s3://npm-registry-packages"}},"1.1.4":{"name":"puppeteer-afp","version":"1.1.4","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.1.4","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"5ebeac59b3ee484ffb001f4f4bc9d6e667182c5f","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.1.4.tgz","fileCount":11,"integrity":"sha512-2o2zP0w1O1fz75p3mL9ALT2MUDNm7q9e3s7Ye2W/kbItT0GEU2nVlYjql51Ithjn5BaAp6MotTuUC2K5CmhV2w==","signatures":[{"sig":"MEQCIHbHIvBOGIbhVohYHUnz7cXkIutyngdyc47o8AU838iXAiB7olktbpPGgVqp4u13hn/0XhUSTG8YvT+QEpcrStquTQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28901},"main":"index.js","gitHead":"5dadbde6dc51bf18fe4aadce983bc3f26db8ba2f","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.1.4_1713454034576_0.3456832818174467","host":"s3://npm-registry-packages"}},"1.1.6":{"name":"puppeteer-afp","version":"1.1.6","keywords":["npm","puppeteer","security","nodejs","stealth","detection-evasion","anti-fingerprint","scraping","crawler","chrome","headless","scraping","browser automation"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@1.1.6","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"d51d2da1307d94225c509655bcea6c6d426c316b","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-1.1.6.tgz","fileCount":11,"integrity":"sha512-D8x5Y1fbMI3HB5zoO2WRUB03XvgBiF9mfJmIgji5KrO97qH8eWRmUBn+nxRcCDZfPheVFR8SNY4gl3m0zQX7Zw==","signatures":[{"sig":"MEQCICRtuh7g6uGaIjIqYETU+xYghdUWLxGIRe0kmCNDvPmXAiBNMmkAttAeSo1T1M/uuO4M2gNdIIvKsovWiXlfJb3RWw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":28901},"main":"index.js","gitHead":"ad935f4dd28ad667ec719f7e7b53823391285d89","scripts":{"lint":"eslint src --fix","test":"mocha --reporter spec test/**/*.spec.js","preversion":"npm run lint","prepublishOnly":"npm version patch && git push --tags && git push"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"8.15.0","description":"Stop website fingerprinting techniques","directories":{},"_nodeVersion":"16.17.1","_hasShrinkwrap":false,"devDependencies":{"nyc":"^14.0.0","chai":"^4.2.0","mocha":"^6.1.4","eslint":"^5.16.0","coveralls":"^3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_1.1.6_1713454088553_0.7192319933637021","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"puppeteer-afp","version":"3.0.0","keywords":["puppeteer","stealth","anti-fingerprint","fingerprint","anti-detection","bot-detection","scraping","crawler","chrome","headless","privacy","canvas","webgl","webrtc","proxy","fingerprint-vault","typescript"],"author":{"url":"https://twitter.com/aleksicpaja","name":"Pavle Aleksic","email":"pavlealeksic@live.com"},"license":"MIT","_id":"puppeteer-afp@3.0.0","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"dist":{"shasum":"e8054f8a83966cb00fd82ca5041813362f1222f0","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-3.0.0.tgz","fileCount":127,"integrity":"sha512-DRgMIP08VB/eZ3DuCV18wEo9vY5GuNf4kfYfQb9K07AFL58pCpnTazXkfzPEZt0vadRCAFCarlqSwHC0QnLCpA==","signatures":[{"sig":"MEYCIQDOehuSmjKbNuyUDb5eVgc9Bz/HhFS+WHdojF+/Eoi2wAIhAM3jFkh7OVHH86kNCw5xXYrxSpyb2QPr87xzkWpJHg5C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201666},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"1e2327206a71c36197df2783885b2e7e7d5b303a","scripts":{"lint":"eslint src --ext .ts --fix","test":"jest","build":"tsc","clean":"rm -rf dist coverage","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","verify":"npm run build && node scripts/verify.js","prebuild":"npm run clean","typecheck":"tsc --noEmit","lint:check":"eslint src --ext .ts","test:watch":"jest --watch","build:watch":"tsc --watch","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"repository":{"url":"git+https://github.com/pavlealeksic/puppeteer-afp.git","type":"git"},"_npmVersion":"10.8.2","description":"Coherent, persistable anti-fingerprinting for Puppeteer. One seed → one consistent browser identity, with proxy/timezone/geo coherence and a fingerprint vault.","directories":{},"_nodeVersion":"20.19.5","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.33.0","ts-jest":"^29.2.5","prettier":"^3.6.2","puppeteer":"^24.16.0","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.6","@typescript-eslint/parser":"^8.39.0","@typescript-eslint/eslint-plugin":"^8.39.0"},"peerDependencies":{"puppeteer":">=10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/puppeteer-afp_3.0.0_1781284342840_0.28799582508195853","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"puppeteer-afp","version":"3.0.1","description":"Coherent, persistable anti-fingerprinting for Puppeteer. One seed → one consistent browser identity, with proxy/timezone/geo coherence and a fingerprint vault.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","build:watch":"tsc --watch","clean":"rm -rf dist coverage","lint":"eslint src --ext .ts --fix","lint:check":"eslint src --ext .ts","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","verify":"npm run build && node scripts/verify.js","typecheck":"tsc --noEmit","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","prebuild":"npm run clean","prepublishOnly":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/pavlealeksic/puppeteer-afp.git"},"keywords":["puppeteer","stealth","anti-fingerprint","fingerprint","anti-detection","bot-detection","scraping","crawler","chrome","headless","privacy","canvas","webgl","webrtc","proxy","fingerprint-vault","typescript"],"author":{"name":"Pavle Aleksic","email":"pavlealeksic@live.com","url":"https://twitter.com/aleksicpaja"},"license":"MIT","bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","engines":{"node":">=18.0.0"},"dependencies":{},"devDependencies":{"@types/jest":"^29.5.14","@types/node":"^24.10.1","@typescript-eslint/eslint-plugin":"^8.46.0","@typescript-eslint/parser":"^8.46.0","eslint":"^9.39.0","jest":"^29.7.0","prettier":"^3.8.4","puppeteer":"^24.43.1","ts-jest":"^29.4.11","typescript":"^5.9.3"},"peerDependencies":{"puppeteer":">=10.0.0"},"_id":"puppeteer-afp@3.0.1","gitHead":"44fbc1e4910d7d695b3f8c48ac575654141dfedc","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-hKwuiU26pOx1UK3t2e/byRanTuRx/6Kz3tVmk6WbdsNheHW1434yMey0Wj7f0jMIHAZAtkP26h/aD3YEHYmvNQ==","shasum":"7762b1b5fa32ce95a4d06807abdab70931643353","tarball":"https://registry.npmjs.org/puppeteer-afp/-/puppeteer-afp-3.0.1.tgz","fileCount":127,"unpackedSize":201667,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDnZwZ3UCLujNSuVk1k7jQ9dIY38IP5ZwOmP1QGiZkIagIhAM8/vREeAngzloL3p5XqZUu28PaQ6hQzyzuJ1ZJ1SdDp"}]},"_npmUser":{"name":"paleksic","email":"pavlealeksic@live.com"},"directories":{},"maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/puppeteer-afp_3.0.1_1781285521197_0.6750942838947611"},"_hasShrinkwrap":false}},"time":{"created":"2020-08-21T15:12:25.778Z","modified":"2026-06-12T17:32:01.463Z","1.0.1":"2020-08-21T15:12:25.897Z","1.0.3":"2022-10-20T12:23:39.731Z","1.0.5":"2024-01-23T13:58:31.353Z","1.0.9":"2024-03-27T22:32:33.813Z","1.1.1":"2024-04-01T10:49:39.719Z","1.1.3":"2024-04-03T21:34:14.606Z","1.1.4":"2024-04-18T15:27:14.732Z","1.1.6":"2024-04-18T15:28:08.777Z","3.0.0":"2026-06-12T17:12:23.023Z","3.0.1":"2026-06-12T17:32:01.343Z"},"bugs":{"url":"https://github.com/pavlealeksic/puppeteer-afp/issues"},"author":{"name":"Pavle Aleksic","email":"pavlealeksic@live.com","url":"https://twitter.com/aleksicpaja"},"license":"MIT","homepage":"https://github.com/pavlealeksic/puppeteer-afp#readme","keywords":["puppeteer","stealth","anti-fingerprint","fingerprint","anti-detection","bot-detection","scraping","crawler","chrome","headless","privacy","canvas","webgl","webrtc","proxy","fingerprint-vault","typescript"],"repository":{"type":"git","url":"git+https://github.com/pavlealeksic/puppeteer-afp.git"},"description":"Coherent, persistable anti-fingerprinting for Puppeteer. One seed → one consistent browser identity, with proxy/timezone/geo coherence and a fingerprint vault.","maintainers":[{"name":"paleksic","email":"pavlealeksic@live.com"}],"readme":"# puppeteer-afp 🛡️\n\n> Coherent, persistable anti-fingerprinting for Puppeteer.\n\n**One seed → one internally-coherent browser identity.** Persist the seed (or the\nwhole fingerprint) and you reproduce the *exact same* browser across sessions.\nThe coherence engine derives timezone, locale, WebRTC IP and geolocation from a\nproxy's egress IP so nothing ever contradicts — the cross-checks that detectors\nlike CreepJS rely on simply line up.\n\n```bash\nnpm install puppeteer-afp\n```\n\n> Requires Node ≥ 18 and `puppeteer` (peer dependency) ≥ 10. Zero runtime\n> dependencies.\n\n---\n\n## Why v3 is different\n\n| | v3 (this) | typical stealth plugins |\n| --- | --- | --- |\n| **Coherence** | Every value derives from one seed; timezone/locale/IP/GPU never disagree | Independent patches that can contradict |\n| **Persistence** | Built-in **fingerprint vault** — reload an identity verbatim next session | None / DIY |\n| **Proxy awareness** | Auto-derives geo/timezone/WebRTC-IP from the proxy egress IP | None |\n| **Stealth runtime** | Single `Function.prototype.toString` trap; properties patched on their real prototype; `Proxy`-preserved `name`/`length` | Often leak via `toString`, own-properties, or `Object.keys` overrides |\n| **Footprint** | No `window.*` markers — toolkit lives in closure scope | Frequently leaves global hooks |\n\n## Quick start\n\n```ts\nimport puppeteer from 'puppeteer';\nimport { protectPage } from 'puppeteer-afp';\n\nconst browser = await puppeteer.launch();\nconst page = await browser.newPage();\n\nawait protectPage(page, { profile: 'desktop-chrome-win' });\n\nawait page.goto('https://abrahamjuliot.github.io/creepjs/');\n```\n\n`protectPage` applies both **CDP-level emulation** (user-agent + Client Hints at\nthe network layer, timezone, geolocation, viewport) **and** the in-page JS patch,\nso the spoof is consistent from the HTTP headers all the way to `navigator`.\n\n## Persistent identity (the vault)\n\n```ts\nimport { protectPage, FingerprintVault, generateFingerprint } from 'puppeteer-afp';\n\nconst vault = new FingerprintVault(); // ~/.puppeteer-afp by default\n\n// Same identity every run for this account:\nconst fingerprint = vault.loadOrCreate('account-42', () =>\n  generateFingerprint({ seed: 'account-42', profile: 'desktop-chrome-mac' }),\n);\n\nawait protectPage(page, { fingerprint });\n```\n\n## Proxy + geo coherence\n\n```ts\n// Timezone, locale, languages, geolocation and the WebRTC public IP are all\n// resolved from the proxy's egress IP — automatically.\nawait protectPage(page, { proxy: 'http://user:pass@host:8080' });\n```\n\nPrefer to set it explicitly / offline? Use a country:\n\n```ts\nimport { geoFromCountry } from 'puppeteer-afp';\nawait protectPage(page, { geo: geoFromCountry('DE') }); // Europe/Berlin, de-DE …\n```\n\n## Whole-browser protection\n\n```ts\nimport { protectedBrowser } from 'puppeteer-afp';\n\nconst pb = await protectedBrowser(browser, { profile: 'mobile-ios-iphone' });\nconst page = await pb.newProtectedPage();   // shares the identity\n// Pop-ups / window.open targets are auto-protected too.\n```\n\n## Profiles\n\n`desktop-chrome-win` · `desktop-chrome-mac` · `desktop-edge-win` ·\n`desktop-firefox-win` · `desktop-safari-mac` · `mobile-android-chrome` ·\n`mobile-ios-iphone`\n\n```ts\nimport { listProfiles } from 'puppeteer-afp';\nlistProfiles();\n```\n\nOr constrain generation without a named profile:\n\n```ts\nawait protectPage(page, { device: 'mobile', os: 'android' });\n```\n\n## Protected surfaces\n\nnavigator (UA + Client Hints) · webdriver/automation cloak · canvas · WebGL\n(vendor/renderer + readPixels) · audio · fonts · **WebRTC IP** · screen ·\nhardware (cores/memory/touch) · timezone & `Intl` · languages · battery ·\nplugins/mimeTypes · network connection · media devices · permissions ·\ngetClientRects · speech voices · touch · **media codecs** · **Web Workers**.\n\nToggle any of them:\n\n```ts\nawait protectPage(page, { features: { audio: false, webrtc: false } });\n```\n\n### Expert protections\n\n**WebRTC IP masking.** The real leak is the asynchronously-gathered ICE\ncandidates (a STUN `srflx` candidate exposes your true public IP, bypassing the\nproxy). This library intercepts every path — candidate events, `createOffer`\n/`createAnswer` SDP, `localDescription`, and `getStats()`:\n\n```ts\n// 'fake' (default): rewrite public IPs to the proxy egress, drop leaky\n//   candidates when no egress is known, keep private mDNS host candidates.\n// 'block': discover no IPs at all.  'passthrough': leave WebRTC untouched.\nawait protectPage(page, { proxy: 'http://user:pass@host:8080', webrtcPolicy: 'fake' });\n```\n\n**Web Worker realm.** Detectors spawn a Worker to read an un-patched\n`navigator` (e.g. the real `hardwareConcurrency`). The patch is propagated into\n`Worker`/`SharedWorker` scope, so workers report the spoofed identity too —\nincluding OffscreenCanvas/WebGL noise.\n\n**Media-codec coherence.** `canPlayType` / `MediaSource.isTypeSupported` are\nadjusted per claimed browser (e.g. Safari reports no WebM but supports HEVC),\nremoving a codec-based engine tell.\n\n## API\n\n| Export | Purpose |\n| --- | --- |\n| `protectPage(page, options)` | Protect a single page → `ProtectedPage` |\n| `protectedBrowser(browser, options)` | Protect a whole browser → `ProtectedBrowser` |\n| `generateFingerprint(options)` | Build a `Fingerprint` from a seed/options |\n| `FingerprintVault` | Persist / reload fingerprints to disk |\n| `buildInjectionScript(fp, features?)` | Get the raw injection script (advanced) |\n| `geoFromCountry` / `resolveGeoFromIp` / `geoForProxy` | Coherence helpers |\n| `Afp` | Lower-level orchestrator (`Afp.create`, `applyToPage`, `rotateFingerprint`) |\n\n`AfpOptions`: `seed`, `profile`, `device`, `browser`, `os`, `geo`, `proxy`,\n`fingerprint`, `features`, `rotationInterval`, `logLevel`.\n\nA `ProtectedPage` exposes `.fingerprint` (read-only) and\n`.rotateFingerprint()` (re-randomises canvas/audio/WebGL noise without changing\nthe stable identity).\n\n## How it stays coherent\n\n1. A seed feeds a deterministic PRNG.\n2. A device profile + the PRNG produce every value — and they're cross-derived\n   (languages lead with the locale, screen `avail*` fits the device, WebGL\n   matches the OS, etc.).\n3. The result is canonicalised to JSON, so a vault reload is byte-identical.\n4. At apply time the same values are pushed through both CDP and an in-page\n   patch, keeping the network and JS layers in agreement.\n\n## Development\n\n```bash\nnpm install\nnpm run build        # tsc → dist/\nnpm test             # unit tests (deterministic, browser-free)\nnode scripts/smoke.js  # live headless browser verification\n```\n\n## Limitations\n\nThe browser engine is **always Chromium** (that's what Puppeteer drives). So:\n\n- **Chromium profiles** (`desktop-chrome-*`, `desktop-edge-win`,\n  `mobile-android-chrome`) are engine-accurate and the most robust targets.\n- **Firefox / Safari / iOS profiles** spoof at the UA + JS-API level — the\n  library strips Chromium-only surfaces (`userAgentData`, `deviceMemory`,\n  `navigator.connection`, `getBattery`) for coherence — but a few engine tells\n  can't be hidden from injected JS. Most notably, Chromium installs\n  `window.chrome` as a **non-configurable** property before any page script\n  runs, so it cannot be removed. Engine-level detectors can therefore still tell\n  these are Chromium. Use them when the detector checks UA/locale/screen/canvas\n  surfaces; prefer Chromium profiles against deep engine fingerprinting.\n\nThis is an inherent constraint of every Puppeteer/Chromium-based stealth tool,\nnot specific to this library.\n\n## Disclaimer\n\nFor authorised testing, privacy research, and automation of sites you own or\nhave permission to access. Respect each site's Terms of Service and applicable\nlaw.\n\n## License\n\nMIT © Pavle Aleksic\n","readmeFilename":"README.md"}