
puppeteer और playwright के लिए पैचों का संग्रह जो ऑटोमेशन डिटेक्शन और लीक से बचाता है। Cloudflare और DataDome CAPTCHA पेजों से बचने में सहायक। पैच/अनपैच करना आसान है, और आवश्यकता अनुसार इसे सक्षम/अक्षम किया जा सकता है।
इस रिपो में लोकप्रिय वेब ऑटोमेशन लाइब्रेरीज़ को बेहतर बनाने के लिए पैच शामिल हैं। विशेष रूप से, यह puppeteer और playwright पैकेजों को लक्षित करता है।
ऑटोमेशन लाइब्रेरीज़ या ब्राउज़र व्यवहार के कुछ पहलुओं को सेटिंग्स या कमांड-लाइन स्विच के माध्यम से समायोजित नहीं किया जा सकता है। इसलिए, हम लाइब्रेरी के सोर्स कोड को पैच करके इन समस्याओं को ठीक करते हैं। हालाँकि यह दृष्टिकोण नाजुक है और लाइब्रेरीज़ के सोर्स कोड के बदलने पर यह टूट सकता है, लक्ष्य समुदाय की मदद से इस रिपो को बनाए रखना है ताकि पैच अपडेटेड रहें।
बिना किसी संशोधन के, Puppeteer और Playwright कुछ महत्वपूर्ण लीक के साथ आते हैं जिन्हें पहचानना आसान है। इससे कोई फर्क नहीं पड़ता कि आपके प्रॉक्सी, फ़िंगरप्रिंट और व्यवहार स्क्रिप्ट कितने अच्छे हैं, यदि आपने इसे पैच नहीं किया है, तो आप किसी भी बड़ी वेबसाइट के लिए सिर्फ एक बड़ा लाल झंडा हैं।
🕵️ आप प्रमुख आधुनिक डिटेक्शन के लिए अपने ऑटोमेशन सेटअप का परीक्षण rebrowser-bot-detector (स्रोत और विवरण) से आसानी से कर सकते हैं।
| पैच से पहले 👎 | पैच के बाद 👍 |
|---|---|
![]() | ![]() |
यदि आप पैच और सभी संभावित त्रुटियों से नहीं जूझना चाहते हैं, तो आपके लिए एक ड्रॉप-इन समाधान है। इन पैकेजों ने मूल कोड के ऊपर rebrowser-patches को लागू किया है, इससे अधिक कुछ नहीं।
Puppeteer: rebrowser-puppeteer (स्रोत) और rebrowser-puppeteer-core (स्रोत)
Playwright (Node.js): rebrowser-playwright (स्रोत) और rebrowser-playwright-core (स्रोत)
Playwright (Python): rebrowser-playwright (स्रोत)
इसे उपयोग करना शुरू करने का सबसे आसान तरीका है अपनी package.json को ठीक करना ताकि नए पैकेज का उपयोग हो लेकिन पुराना नाम alias के रूप में रहे। इस तरह, आपको अपने ऑटोमेशन का कोई सोर्स कोड बदलने की आवश्यकता नहीं है। यहाँ बताया गया है कि यह कैसे करना है:
package.json खोलें और "puppeteer": "^23.3.1" तथा "puppeteer-core": "^23.3.1" को "puppeteer": "npm:rebrowser-puppeteer@^23.3.1" और "puppeteer-core": "npm:rebrowser-puppeteer-core@^23.3.1" से बदलें। ध्यान दें: 23.3.1 सिर्फ एक उदाहरण है, npm पर नवीनतम संस्करण देखें।npm install (या yarn install) चलाएँएक और तरीका है वास्तव में मूल पैकेज के बजाय नए पैकेज का उपयोग करना। आपको इन चरणों का पालन करना होगा:
package.json खोलें और puppeteer तथा puppeteer-core पैकेजों को rebrowser-puppeteer और rebrowser-puppeteer-core से बदलें। पैकेजों के संस्करण न बदलें, केवल नाम बदलें।npm install (या yarn install) चलाएँpuppeteer और puppeteer-core के किसी भी उल्लेख को खोजें और उन्हें rebrowser-puppeteer और rebrowser-puppeteer-core से बदलें🚀 बस इतना ही! rebrowser-bot-detector पेज पर जाएँ और अपने पैच किए हुए ब्राउज़र का परीक्षण करें।
हमारा लक्ष्य इन ड्रॉप-इन रिप्लेसमेंट पैकेजों को नवीनतम संस्करणों के साथ बनाए रखना और समर्थन करना है, लेकिन हम मुख्य रूप से नए संस्करणों पर ध्यान केंद्रित करते हैं, इसलिए यदि आप अभी भी शुरुआती दौर के puppeteer 13.3.7 का उपयोग कर रहे हैं, तो यह अपग्रेड करने का अच्छा समय हो सकता है। इस बात की अच्छी संभावना है कि यह वास्तव में कुछ नहीं तोड़ेगा क्योंकि API समय के साथ काफी स्थिर है।
Runtime.Enable लीक को ठीक करेंलोकप्रिय ऑटोमेशन लाइब्रेरीज़ CDP कमांड Runtime.Enable पर निर्भर करती हैं, जो Runtime. डोमेन से इवेंट प्राप्त करने की अनुमति देता है। यह पृष्ठों पर JavaScript का मूल्यांकन करने के लिए उपयोग किए जाने वाले निष्पादन संदर्भों को प्रबंधित करने के लिए महत्वपूर्ण है, जो किसी भी ऑटोमेशन प्रक्रिया के लिए एक प्रमुख विशेषता है।
हालाँकि, एक तकनीक है जो इस कमांड के उपयोग का पता लगाती है, जिससे यह प्रकट होता है कि ब्राउज़र Puppeteer या Playwright जैसे ऑटोमेशन सॉफ़्टवेयर द्वारा नियंत्रित किया जा रहा है। यह तकनीक सभी प्रमुख एंटी-बॉट सॉफ़्टवेयर जैसे Cloudflare, DataDome और अन्य द्वारा उपयोग की जाती है।
हमने इस लीक पर अपनी जांच के बारे में एक पूरा लेख तैयार किया है, जिसे आप हमारे ब्लॉग में पढ़ सकते हैं।
इस तकनीक के अधिक विवरण के लिए, DataDome की ब्लॉग पोस्ट पढ़ें: How New Headless Chrome & the CDP Signal Are Impacting Bot Detection।
संक्षेप में, यह पृष्ठ पर JavaScript की कुछ पंक्तियाँ हैं जो Runtime.Enable उपयोग होने पर स्वचालित रूप से कॉल होती हैं।
हमारा फिक्स हर फ्रेम पर स्वचालित Runtime.Enable कमांड को अक्षम कर देता है। इसके बजाय, हम फ्रेम बनने पर अज्ञात ID वाले संदर्भ मैन्युअल रूप से बनाते हैं। फिर, जब कोड निष्पादित करने की आवश्यकता होती है, तो संदर्भ ID प्राप्त करने के कई तरीके होते हैं।
🟢 लाभ: सबसे उत्तम दृष्टिकोण जो मुख्य वर्ल्ड तक पहुँच बनाए रखता है और वेब वर्कर्स तथा iframes के साथ काम करता है। आपको अपने मौजूदा कोडबेस में कोई बदलाव करने की आवश्यकता नहीं है।
🔴 नुकसान: अब तक कोई नहीं खोजा गया है।
Page.createIsolatedWorld के माध्यम से एक नया isolated संदर्भ बनाएँ और उसकी ID सहेजें।🟢 लाभ: आपका सारा कोड एक अलग isolated वर्ल्ड में निष्पादित होगा, जिससे पृष्ठ स्क्रिप्ट को MutationObserver और अन्य तकनीकों के माध्यम से आपके बदलावों का पता लगाने से रोका जा सकेगा।
🔴 नुकसान: आप मुख्य संदर्भ चर और कोड तक नहीं पहुँच पाएँगे। हालाँकि कुछ उपयोग मामलों के लिए यह आवश्यक है, isolated संदर्भ आमतौर पर अधिकांश परिदृश्यों के लिए ठीक काम करता है। साथ ही, वेब वर्कर्स नई वर्ल्ड बनाने की अनुमति नहीं देते हैं, इसलिए आप वर्कर के अंदर अपना कोड निष्पादित नहीं कर सकते। यह एक विशेष उपयोग मामला है लेकिन कुछ स्थितियों में मायने रख सकता है। इस समस्या के लिए एक समाधान है, कृपया How to Access Main Context Objects from Isolated Context in Puppeteer & Playwright पढ़ें।
Runtime.Enable कॉल करें और फिर तुरंत Runtime.Disable कॉल करें।यह Runtime.executionContextCreated इवेंट को ट्रिगर करता है, जिससे हम सही संदर्भ ID पकड़ सकते हैं।
🟢 लाभ: आपको मुख्य संदर्भ तक पूर्ण पहुँच मिलेगी।
🔴 नुकसान: इस छोटी अवधि के दौरान इस बात की थोड़ी संभावना है कि पृष्ठ ऐसा कोड कॉल करेगा जो लीक की ओर ले जाता है। जोखिम कम है, क्योंकि डिटेक्शन कोड आमतौर पर CAPTCHA पेज या लॉगिन/रजिस्ट्रेशन फॉर्म जैसी विशिष्ट गतिविधियों के दौरान कॉल होता है, आमतौर पर पेज लोड होने के तुरंत बाद। आपका व्यावसायिक तर्क आमतौर पर थोड़ी देर बाद कॉल होता है।
🎉 हमारे परीक्षणों से पता चलता है कि ये सभी दृष्टिकोण वर्तमान में Cloudflare या DataDome द्वारा अज्ञेय हैं।
नोट: आप इस पैच के लिए सेटिंग्स को एक पर्यावरण चर का उपयोग करके तुरंत बदल सकते हैं। यह आपको अपने व्यावसायिक तर्क के आधार पर पैच किए गए और बिना पैच किए गए संस्करणों के बीच आसानी से स्विच करने की अनुमति देता है।
REBROWSER_PATCHES_RUNTIME_FIX_MODE=addBinding — addBinding तकनीक (डिफ़ॉल्ट)REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated — सभी स्क्रिप्ट हमेशा isolated संदर्भ में चलाएँREBROWSER_PATCHES_RUNTIME_FIX_MODE=enableDisable — Enable/Disable तकनीक का उपयोग करेंREBROWSER_PATCHES_RUNTIME_FIX_MODE=0 — इस लीक के लिए फिक्स पूरी तरह से अक्षम करेंREBROWSER_PATCHES_DEBUG=1 — कुछ डिबगिंग संदेश सक्षम करेंयाद रखें, आप इन चरों को विभिन्न तरीकों से सेट कर सकते हैं, उदाहरण के लिए, कोड में:
process.env.REBROWSER_PATCHES_RUNTIME_FIX_MODE = "alwaysIsolated"
या कमांड लाइन में:
REBROWSER_PATCHES_RUNTIME_FIX_MODE=alwaysIsolated node app.js
डिफ़ॉल्ट रूप से, Puppeteer page.evaluate() में हर स्क्रिप्ट में //# sourceURL=pptr:... जोड़ता है। एक रिमोट वेबसाइट इस व्यवहार का पता लगा सकती है और चेतावनी बढ़ा सकती है।
यह पैच इसे //# sourceURL=app.js में बदल देता है। आप इसे पर्यावरण चर के माध्यम से भी समायोजित कर सकते हैं:
# use any generic filename
REBROWSER_PATCHES_SOURCE_URL=jquery.min.js
# use 0 to completely disable this patch
REBROWSER_PATCHES_SOURCE_URL=0
कभी-कभी, ब्राउज़र स्तर पर CDP सत्र तक पहुँचना बहुत उपयोगी हो सकता है। उदाहरण के लिए, जब आप कोई कस्टम CDP कमांड लागू करना चाहते हैं। एक विधि page._client() है जो वर्तमान पेज इंस्टेंस के लिए CDP सत्र लौटाती है, लेकिन ब्राउज़र इंस्टेंस के लिए ऐसी कोई विधि नहीं है।
यह पैच Browser क्लास में एक नई विधि _connection() जोड़ता है, ताकि आप इसे इस तरह उपयोग कर सकें:
browser._connection().on('Rebrowser.addRunEvent', (params) => { ... })
नोट: यह बाहरी वेबसाइट स्क्रिप्ट द्वारा पता लगाने योग्य नहीं है, यह केवल आपकी सुविधा के लिए है।
डिफ़ॉल्ट utility वर्ल्ड नाम '__puppeteer_utility_world__' + packageVersion है। कभी-कभी आप इसे किसी और चीज़ में बदलना चाह सकते हैं। यह पैच इसे util में बदल देता है और आपको इसे env चर के माध्यम से अनुकूलित करने की अनुमति देता है:
REBROWSER_PATCHES_UTILITY_WORLD_NAME=customUtilityWorld
# use 0 to completely disable this patch
REBROWSER_PATCHES_UTILITY_WORLD_NAME=0
यह env चर तुरंत नहीं बदला जा सकता है, आपको इसे अपनी स्क्रिप्ट चलाने से पहले सेट करना होगा क्योंकि यह मॉड्यूल के आयात होने के समय उपयोग होता है।
| पैच से पहले 👎 | पैच के बाद 👍 |
|---|---|
![]() | ![]() |
नोट: यह बाहरी वेबसाइट स्क्रिप्ट द्वारा पता लगाने योग्य नहीं है, लेकिन Google अपने मालिकाना Chrome में इस जानकारी का उपयोग कर सकता है; हम कभी नहीं जानते।
यह पैकेज एक स्थापित लाइब्रेरी के विरुद्ध चलाने के लिए डिज़ाइन किया गया है। लाइब्रेरी स्थापित करें, फिर पैचर को कॉल करें, और यह उपयोग के लिए तैयार है।
अपने प्रोजेक्ट के रूट फ़ोल्डर में, चलाएँ:
npx rebrowser-patches@latest patch --packageName puppeteer-core
आप इस कमांड से सभी परिवर्तन आसानी से वापस कर सकते हैं:
npx rebrowser-patches@latest unpatch --packageName puppeteer-core
आप किसी पैकेज को उसके फ़ोल्डर का पूर्ण पथ प्रदान करके भी पैच कर सकते हैं, उदाहरण के लिए:
npx rebrowser-patches@latest patch --packagePath /web/app/node_modules/puppeteer-core-custom
आप npx rebrowser-patches@latest --help चलाकर सभी कमांड-लाइन विकल्प देख सकते हैं, लेकिन वर्तमान में, एक लाइब्रेरी के लिए केवल एक पैच है, इसलिए आपको कुछ भी कॉन्फ़िगर करने की आवश्यकता नहीं है।
⚠️ ध्यान रखें कि अपने प्रोजेक्ट फ़ोल्डर में npm install या yarn install चलाने के बाद, यह पैच के सभी परिवर्तनों को ओवरराइड कर सकता है। पैच को बनाए रखने के लिए आपको पैचर को फिर से चलाना होगा।
यदि आपका पैकेज पहले से ही पैच किया हुआ है और आप rebrowser-patches के नवीनतम संस्करण में अपडेट करना चाहते हैं, तो सबसे आसान तरीका node_modules/puppeteer-core को हटाना, फिर npm install या yarn install --check-files चलाना, और फिर npx rebrowser-patches@latest patch चलाना है।
ये सभी संस्करण Playwright के Node.js संस्करण के चारों ओर केवल रैपर हैं। आपको अपने Playwright पैकेज के अंदर driver फ़ोल्डर ढूंढना होगा और इस पैच को --packagePath=$yourDriverFolder/$yourPlatform/package के साथ चलाना होगा।
✅ नवीनतम पूरी तरह से परीक्षित संस्करण: 24.8.1 (रिलीज़ 2025-05-06)
Playwright पैच में शामिल हैं:
Runtime.enable लीक: addBinding और alwaysIsolated मोड।REBROWSER_PATCHES_UTILITY_WORLD_NAME env चर के माध्यम से utility वर्ल्ड नाम बदलने की क्षमता।महत्वपूर्ण: page.pause() विधि सक्षम फिक्स के साथ काम नहीं करती है, इसे और अधिक जांच की आवश्यकता है। आप डिबगिंग के दौरान REBROWSER_PATCHES_RUNTIME_FIX_MODE=0 env चर का उपयोग करके फिक्स को पूरी तरह से अक्षम कर सकते हैं।
ये पैच अभी केवल Chrome के लिए काम करते हैं। यदि आप वास्तव में इसे WebKit या Firefox के साथ उपयोग करना चाहते हैं, तो कृपया एक नई issue खोलें।
✅ नवीनतम पूरी तरह से परीक्षित संस्करण: 1.52.0 (रिलीज़ 2025-04-17)
puppeteer-extra के साथ rebrowser-puppeteer का उपयोग कैसे करें?addExtra विधि का उपयोग करें, यहाँ उदाहरण है:
// before
import puppeteer from 'puppeteer-extra'
// after
import { addExtra } from 'puppeteer-extra'
import rebrowserPuppeteer from 'rebrowser-puppeteer-core'
const puppeteer = addExtra(rebrowserPuppeteer)
हम वर्तमान में वेब ऑटोमेशन पारदर्शिता में सुधार के लिए और अधिक पैच विकसित कर रहे हैं, जो जल्द ही इस रिपो में जारी किए जाएंगे। कृपया ⭐️ स्टार या watch बटन पर क्लिक करके प्रोजेक्ट का समर्थन करें।
💭 यदि आपके पास कोई विचार, सुझाव या प्रश्न हैं, तो बेझिझक ईमेल द्वारा हमारी टीम से संपर्क करें या issues अनुभाग का उपयोग करें।
⚠️ यह जानना महत्वपूर्ण है कि यह फिक्स अकेले आपके ब्राउज़र को बुलेटप्रूफ और अज्ञेय नहीं बनाएगा। आपको कई अन्य पहलुओं को संबोधित करने की आवश्यकता है जैसे प्रॉक्सी, उचित user-agent और फ़िंगरप्रिंट (canvas, WebGL), और बहुत कुछ।
हमेशा ध्यान रखें: आप JS इंजेक्शन के माध्यम से ब्राउज़र आंतरिक में जितना कम हेरफेर करेंगे, उतना बेहतर होगा। ऐसे तरीके हैं जिनसे पता लगाया जा सकता है कि console, navigator और अन्य आंतरिक ऑब्जेक्ट Proxy ऑब्जेक्ट या Object.defineProperty से प्रभावित हुए हैं। यह पेचीदा है, लेकिन यह हमेशा एक बिल्ली-और-चूहे का खेल है।
यदि आपने सब कुछ आज़मा लिया है और फिर भी समस्याओं का सामना कर रहे हैं, तो issues अनुभाग में प्रश्न पूछने का प्रयास करें या Rebrowser से क्लाउड समाधानों का उपयोग करने पर विचार करें।
यह पैकेज Rebrowser द्वारा प्रायोजित और अनुरक्षित है। हम आपको सैकड़ों अद्वितीय फ़िंगरप्रिंट के साथ क्लाउड में अपने ब्राउज़र ऑटोमेशन और वेब स्क्रैपिंग को स्केल करने की अनुमति देते हैं।
हमारे क्लाउड ब्राउज़रों की सफलता दर बहुत अच्छी है और वे अच्छी सुविधाओं के साथ आते हैं जैसे सूचनाएं यदि आपकी लाइब्रेरी निष्पादन के दौरान Runtime.Enable का उपयोग करती है या अन्य लाल झंडे हैं जिनमें सुधार किया जा सकता है। आज ही खाता बनाएं ताकि हमारे अत्याधुनिक प्लेटफ़ॉर्म का परीक्षण करने के लिए आमंत्रित किया जा सके और अपने ऑटोमेशन व्यवसाय को अगले स्तर पर ले जाएं।
जब आप Windows मशीन पर इस पैचर को चलाने का प्रयास करते हैं, तो आपको संभवतः एक त्रुटि का सामना करना पड़ेगा क्योंकि पैच कमांड नहीं मिलता है। इसे ठीक करने के लिए, आपको Git स्थापित करना होगा, जिसमें patch.exe शामिल है। इसे स्थापित करने के बाद, आपको इसे अपने PATH में जोड़ना होगा:
set PATH=%PATH%;C:\Program Files\Git\usr\bin\
आप अगले कमांड का उपयोग करके जांच सकते हैं कि patch.exe सही ढंग से स्थापित है:
patch -v
zfcsoftware/puppeteer-real-browser - ऑटोमेशन समुदाय के लिए सामान्य विचार और योगदान
Kaliiiiiiiiii-Vinyzu/patchright - Playwright लीक को ठीक करने के लिए पैच का सेट
kaliiiiiiiiii/brotector - कुछ आधुनिक परीक्षण, CDP बनाम devtools में अंतर करने के लिए एल्गोरिदम
prescience-data/harden-puppeteer - isolated वर्ल्ड में निष्पादन के अग्रदूतों में से एक
puppeteer-extra-plugin-stealth - जहाँ यह सब शुरू हुआ, सभी योगदानकर्ताओं और समुदाय को बड़ा सम्मान 🙏 berstend और साथी महान हैं