{"id":22494952,"url":"https://github.com/pavlealeksic/playwright-afp","last_synced_at":"2025-07-27T18:04:09.388Z","repository":{"id":231393601,"uuid":"781701265","full_name":"pavlealeksic/playwright-afp","owner":"pavlealeksic","description":"Stop website fingerprinting techniques playwright edition","archived":false,"fork":false,"pushed_at":"2024-04-18T15:30:40.000Z","size":7,"stargazers_count":15,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-21T08:29:01.900Z","etag":null,"topics":["playwright","playwright-extra","playwright-javascript","playwright-undetected","playwright-undetected-browser","undetected"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pavlealeksic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-03T21:54:24.000Z","updated_at":"2025-06-24T02:30:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"b6eed280-5c8e-4e2f-a3f6-13493c1f1263","html_url":"https://github.com/pavlealeksic/playwright-afp","commit_stats":null,"previous_names":["pavlealeksic/playwright-afp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pavlealeksic/playwright-afp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavlealeksic%2Fplaywright-afp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavlealeksic%2Fplaywright-afp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavlealeksic%2Fplaywright-afp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavlealeksic%2Fplaywright-afp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pavlealeksic","download_url":"https://codeload.github.com/pavlealeksic/playwright-afp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pavlealeksic%2Fplaywright-afp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267399991,"owners_count":24081176,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["playwright","playwright-extra","playwright-javascript","playwright-undetected","playwright-undetected-browser","undetected"],"created_at":"2024-12-06T19:18:42.348Z","updated_at":"2025-07-27T18:04:09.368Z","avatar_url":"https://github.com/pavlealeksic.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# playwright-afp\nStop websites fingerprinting your puppeteer browser instances.\n\nThis covers:\nCanvas Fingerprinting, WebGL Fingerprinting, AudioContext Fingerprinting, Font Fingerprinting\n\n## Installation\n\n```bash\nyarn add playwright-afp\n# - or -\nnpm install playwright-afp\n```\n## Usage\n\n```js\nconst { chromium } = require('playwright');\nconst protectIt = require('playwright-afp');\n\nconst browser = await chromium.launch();\nconst browserContext = await browser.newContext();\n// For these options, all are optional, and you dont have to use them, \n// these are used just if you want to reuse a fingerprint\nconst options = {\n        canvasRgba: [0, 0, 0, 0], //all these numbers can be from -5 to 5\n        webglData: {\n            3379: 32768, //16384, 32768\n            3386: {\n                0: 32768, // 8192, 16384, 32768\n                1: 32768, // 8192, 16384, 32768\n            },\n            3410: 2, // 2, 4, 8, 16\n            3411: 2, // 2, 4, 8, 16\n            3412: 16, // 2, 4, 8, 16\n            3413: 2, // 2, 4, 8, 16\n            7938: \"WebGL 1.0 (OpenGL Chromium)\", // \"WebGL 1.0\", \"WebGL 1.0 (OpenGL)\", \"WebGL 1.0 (OpenGL Chromium)\"\n            33901: {\n                0: 1,\n                1: 1, // 1, 1024, 2048, 4096, 8192\n            },\n            33902: {\n                0: 1,\n                1: 4096, // 1, 1024, 2048, 4096, 8192\n            },\n            34024: 32768, //16384, 32768\n            34047: 8, // 2, 4, 8, 16\n            34076: 16384, //16384, 32768\n            34921: 16, // 2, 4, 8, 16\n            34930: 16, // 2, 4, 8, 16\n            35660: 2, // 2, 4, 8, 16\n            35661: 32, // 16, 32, 64, 128, 256\n            35724: \"WebGL GLSL ES\", // \"WebGL\", \"WebGL GLSL\", \"WebGL GLSL ES\", \"WebGL GLSL ES (OpenGL Chromium)\"\n            36347: 4096, // 4096, 8192\n            36349: 8192, // 1024, 2048, 4096, 8192\n            37446: \"HD Graphics\", // \"Graphics\", \"HD Graphics\", \"Intel(R) HD Graphics\"\n        },\n        fontFingerprint: {\n            noise: 1, // -1, 0, 1, 2\n            sign: +1, // -1, +1\n        },\n        audioFingerprint: {\n            getChannelDataIndexRandom: 0.7659530895341677, // all values of Math.random() can be used\n            getChannelDataResultRandom: 0.7659530895341677, // all values of Math.random() can be used\n            createAnalyserIndexRandom: 0.7659530895341677, // all values of Math.random() can be used\n            createAnalyserResultRandom: 0.7659530895341677, // all values of Math.random() can be used\n        },\n        webRTCProtect: true //this option is used to disable or enable WebRTC disabling by destroying get user media\n    };\n// run this function on any page you want to protect, so pages loaded on \n// this page after this is done will be protected\nconst page = browser.newPage()\nawait protectIt(page, options)\n// you can also protect the whole context by just running:\nawait protectIt(browserContext, options)\n\n\n```\n\nGo to https://webbrowsertools.com with your browser and check your fingerprints\n\n## Creator\n\n**Pavle Aleksic**\n\n- \u003chttps://twitter.com/aleksicpaja\u003e\n\n## License\nThis project is licensed under the terms of the MIT license.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavlealeksic%2Fplaywright-afp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpavlealeksic%2Fplaywright-afp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpavlealeksic%2Fplaywright-afp/lists"}