n8n में HTTP Request Node से कैप्चा कैसे हल करें

n8n captcha - How to Solve CAPTCHA in n8n with the HTTP Request Node

n8n में कोई कैप्चा node नहीं है, और आपको उसकी ज़रूरत भी नहीं। दो HTTP Request nodes और एक Wait node किसी भी समर्थित कैप्चा प्रकार को हल कर देते हैं: पहला job submit करता है, दूसरा तब तक poll करता है जब तक token वापस न आ जाए। दोनों को यहाँ पॉइंट करें: 127.0.0.1:8080 और पूरा loop n8n वाली उसी मशीन पर चलता है, इसलिए आपके network से कुछ भी बाहर नहीं जाता और प्रति हल कोई metering नहीं होती। CapSkip server पर भी चलता है और network के ज़रिए वही API calls लेता है, इसी तरह आप इसे n8n Cloud से इस्तेमाल करते हैं। यह guide workflow को node दर node बनाता है, साथ में वह Docker networking जाल भी, जिसमें पहली बार में ज़्यादातर लोग फँस जाते हैं।

आपको क्या चाहिए

  • n8n, self-hosted, desktop या cloud। तीनों काम करते हैं, हालाँकि cloud के लिए CapSkip का network पर पहुँच योग्य होना ज़रूरी है। नीचे server वाला section देखें।
  • CapSkip app चल रहा हो, उसकी service शुरू हो चुकी हो। Port, key और Local या Server mode यहाँ मिलेंगे: कनेक्शन सेटिंग्स.
  • जिस site को आप automate कर रहे हैं उससे एक sitekey और एक page URL।

Key validation डिफ़ॉल्ट रूप से बंद है, इसलिए key parameter के तौर पर कोई भी non-empty string चल जाती है। कुछ न भेजने के बजाय कुछ भेजें: खाली key का जवाब होता है ERROR_WRONG_USER_KEY.

community node के बजाय HTTP Request क्यों

Community nodes को instance पर इंस्टॉल करना पड़ता है, वे API बदलावों से पीछे रह जाते हैं, और n8n Cloud पर वे प्रतिबंधित हैं। यहाँ का API 2captcha compatible है और इसमें सिर्फ़ दो endpoints हैं, इसलिए कोई community node बस छह लाइनों की configuration ही लपेटता। बिल्ट-इन HTTP Request node वही काम करता है, n8n के साथ खुद अपडेट होता रहता है, और हर instance type पर काम करता है।

एंडपॉइंटयह क्या करता हैक्या लौटाता है
/in.phpएक टास्क सबमिट करता हैएक संख्यात्मक कैप्चा ID
/res.phpपूछता है कि वह ID तैयार है या नहींtoken, या CAPCHA_NOT_READY string

चरण 1: कैप्चा submit करें

एक HTTP Request node जोड़ें और उसका नाम Submit CAPTCHA रखें। method को POST पर सेट करें और URL को http://127.0.0.1:8080/in.php। Send Body चालू करें, Form Urlencoded चुनें, और ये fields जोड़ें।

नामValue
keyकोई भी non-empty string
methoduserrecaptcha
googlekeyआपका sitekey
pageurlवह page जिस पर widget बैठा है
json1

json field हमेशा भेजें। इसके बिना response एक सादा string होता है, जैसे OK|2122988149 जिसे आपको हाथ से split करना पड़ता है। इसके साथ आपको एक ऐसा object मिलता है जिसे n8n सीधे address कर सकता है।

// Response from in.php with json=1
{"status": 1, "request": "2122988149"}

// The captcha ID is now available downstream as:
//   {{ $json.request }}

बाक़ी कैप्चा प्रकार सिर्फ़ method field और उसके साथ वाले parameters बदलते हैं। Turnstile turnstile इस्तेमाल करता है, sitekey और pageurl की जोड़ी के साथ; GeeTest geetest इस्तेमाल करता है, gt और challenge के साथ; और image कैप्चा base64 इस्तेमाल करता है, जिसमें image bytes किसी body field में जाते हैं। API reference में हर प्रकार के सभी parameters की सूची दी गई है।

चरण 2: पहले poll से पहले रुकें

Submit CAPTCHA के बाद एक Wait node जोड़ें। Resume को After Time Interval, Wait Amount को 15, और Wait Unit को seconds पर सेट करें।

पंद्रह सेकंड मनमाने नहीं हैं। reCAPTCHA v2 job इससे जल्दी शायद ही तैयार होता है, इसलिए तुरंत poll करना एक workflow execution को यूँ ही बर्बाद कर देता है, क्योंकि जवाब पक्का यही मिलेगा: CAPCHA_NOT_READY। Turnstile और GeeTest जल्दी साफ़ हो जाते हैं, इसलिए वहाँ 5 सेकंड काफ़ी हैं। image कैप्चा आम तौर पर क़रीब एक सेकंड में हो जाता है।

चरण 3: token के लिए poll करें

Poll Result नाम का दूसरा HTTP Request node जोड़ें। Method GET, URL http://127.0.0.1:8080/res.php, Send Query Parameters चालू।

नामValue
keyवही string जो आपने चरण 1 में इस्तेमाल की थी
actionget
id{{ $('Submit CAPTCHA').item.json.request }}
json1

submit node को नाम से reference करें, न कि इसके ज़रिए: $json.request। जैसे ही Wait node उनके बीच आ जाता है, incoming item Wait node का हो जाता है, और loop के दूसरे चक्कर में वह IF node का हो जाता है। source node का नाम साफ़-साफ़ बताने से ID स्थिर बनी रहती है, चाहे loop कितनी भी बार चले।

चरण 4: तैयार होने तक loop चलाएं

Poll Result के बाद एक IF node जोड़ें। शर्त एक string तुलना है: left value {{ $json.request }}, operation “is not equal to”, और right value CAPCHA_NOT_READY.

false output को वापस Wait node से जोड़ें। इससे loop बंद हो जाता है, और n8n तब तक चक्कर लगाता रहता है जब तक जवाब न आ जाए। true output token को आगे ले जाता है।

// res.php while the job is still running
{"status": 0, "request": "CAPCHA_NOT_READY"}

// res.php once it is solved
{"status": 1, "request": "03AGdBq26..."}

spelling पर ध्यान दें। API पहले T के बिना CAPCHA_NOT_READY लौटाता है, जो उसी 2captcha wire format से विरासत में मिला है जिसके साथ यह compatible है। अगर आपने इसे वैसे लिखा जैसा सही लगता है, तो IF node कभी match नहीं करेगा, और loop तब तक चलता रहेगा जब तक workflow टाइम आउट न हो जाए।

नतीजे सिर्फ़ एक ही बार पढ़े जा सकते हैं। एक ही ID दोबारा पढ़ने पर token के बजाय error मिलता है, इसलिए एक बार जाँचने और दोबारा लाने के बजाय token को सीधे अगले node में भेजें।

चरण 5: token इस्तेमाल करें

IF node की true branch अब token लेकर चलती है। इसे g-recaptcha-response form field के रूप में उस request पर भेजें जिसे करने से आपको रोका गया था, एक तीसरे HTTP Request node के ज़रिए।

// Code node, Mode: Run Once for All Items.
// Builds the form payload for the final request.
const token = $input.first().json.request;

return [
  {
    json: {
      email: "[email protected]",
      "g-recaptcha-response": token,
    },
  },
];

Tokens जारी होने के लगभग दो मिनट बाद expire हो जाते हैं, इसलिए submit तुरंत करें। अगर आपके workflow में हल करने और submit करने के बीच कोई approval step या कोई और Wait node है, तो हल करने का काम उसके बाद ले जाएं।

Docker वाला जाल: localhost आपकी machine नहीं है

यह अकेली सबसे आम गड़बड़ी है, और error message किसी काम की जगह की ओर इशारा नहीं करता। किसी container के अंदर, 127.0.0.1 का मतलब खुद वही container होता है, न कि वह host जिस पर सॉल्वर चल रहा है। n8n connection refused बताता है और workflow Submit CAPTCHA पर ही मर जाता है।

Mac और Windows के Docker Desktop पर, host की जगह host.docker.internal रख दें, दोनों URLs में। Linux पर वह नाम डिफ़ॉल्ट रूप से resolve नहीं होता, इसलिए container शुरू करते समय उसे साफ़-साफ़ जोड़ें।

# docker pull docker.n8n.io/n8nio/n8n
# Linux: map host.docker.internal to the host gateway.
docker run -it --rm \
  --add-host=host.docker.internal:host-gateway \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

# Both node URLs then become:
#   http://host.docker.internal:8080/in.php
#   http://host.docker.internal:8080/res.php

अगर n8n और सॉल्वर एक ही Docker network पर चलते हैं, तो इसके बजाय service name इस्तेमाल करें। नियम दोनों हाल में एक ही है: URL container के अंदर से resolve होना चाहिए, आपके terminal से नहीं।

इसके बजाय CapSkip को server पर चलाना

CapSkip का n8n वाली उसी मशीन पर होना ज़रूरी नहीं है। कनेक्शन सेटिंग्स में दो modes हैं, और दूसरा वाला ही इसे hosted n8n के साथ काम करने लायक़ बनाता है।

मोडकिस पर सुनता हैकब इस्तेमाल करें
लोकल127.0.0.1, केवल उसी डिवाइस परn8n और CapSkip एक ही कंप्यूटर पर चलते हैं
सर्वरआपका network या public IPn8n कहीं और चलता है: कोई दूसरी मशीन, कोई VPS, या n8n Cloud

CapSkip को Server mode में किसी VPS पर रखें और आपकी टीम की हर मशीन एक ही instance पर point करती है। तब node URLs http://YOUR_SERVER_IP:8080/in.php और http://YOUR_SERVER_IP:8080/res.php बन जाते हैं, और workflow में बाक़ी कुछ नहीं बदलता। एक static public IP रखना फ़ायदेमंद है, क्योंकि ये URLs nodes में तय कर दिए जाते हैं और बदलता हुआ address इन्हें तोड़ देता है।

यह अब भी आपका अपना hardware है और अब भी बिना metering के चलता है। Server mode सिर्फ़ यह बदलता है कि सॉल्वर कहाँ चलता है, यह नहीं कि उसका मालिक कौन है, इसलिए किसी भी सूरत में आप प्रति हल भुगतान नहीं करते।

आम errors और उनका मतलब

रिस्पॉन्सकारणफिक्स
ECONNREFUSEDसॉल्वर चल नहीं रहा, या container host को देख नहीं पा रहाlocal service शुरू करें, फिर ऊपर बताया गया Docker फ़िक्स लगाएं
ERROR_WRONG_USER_KEYkey field खाली है या मौजूद ही नहीं हैकोई भी non-empty string भेजें
ERROR_GOOGLEKEYsitekey ग़लत है, कटा हुआ है या किसी दूसरे page का हैlive page पर data-sitekey attribute दोबारा पढ़ें
ERROR_PAGEURLpageurl field में scheme नहीं है या वह कहीं और की ओर इशारा करता हैhttps समेत पूरा URL भेजें
loop कभी ख़त्म ही नहीं होताIF node किसी ग़लत spelling वाली ready string से तुलना करता हैCAPCHA_NOT_READY की spelling बिल्कुल वैसी ही रखें
ERROR_CAPTCHA_UNSOLVABLEjob टाइम आउट नहीं हुआ, बल्कि फेल हो गयानए challenge value के साथ दोबारा submit करें

API जो भी कोड लौटा सकता है, वे सब API डॉक्युमेंटेशन, जिसमें हर एक की वजह बनने वाला parameter भी दिया गया है।

FAQ

क्या यह n8n Cloud पर काम करता है?

हाँ, CapSkip को Server mode में रखकर। Cloud workers n8n के infrastructure में चलते हैं, इसलिए वे इसे नहीं देख सकते: 127.0.0.1 जो आपके desktop पर है, और Local mode केवल इसी address की अनुमति देता है। कनेक्शन सेटिंग्स को Server mode पर बदलें, CapSkip को static public IP वाले किसी VPS पर चलाएं, और nodes को उसी address पर लगाएं। अगर आप सब कुछ एक ही मशीन पर रखना चाहें, तो n8n को उसी के साथ self-host करें और Local mode में ही रहें।

polling loop कितनी executions खर्च करता है?

एक। किसी workflow के अंदर का loop चाहे जितनी बार चक्कर लगाए, वह एक ही execution रहता है, इसलिए Wait और IF की जोड़ी आपकी execution गिनती को कई गुना नहीं करती। हाँ, यह execution को खुला ज़रूर रखता है, जो तब मायने रखता है जब आप किसी छोटे instance पर कई workflows एक साथ चलाते हैं।

क्या मैं एक ही run में कई कैप्चा हल कर सकता हूँ?

हाँ। HTTP Request node हर input item के लिए एक बार चलता है, इसलिए उसे sitekey और URL की जोड़ियों की सूची देने पर वह सबको submit कर देता है और आपको हर item के लिए एक captcha ID देता है। loop के दौरान IDs को उनके source items के साथ जोड़े रखें, और अगर आप एक साथ चल रहे कामों की संख्या सीमित करना चाहते हैं तो Split In Batches node इस्तेमाल करें।

क्या मुझे प्रॉक्सी चाहिए?

आम तौर पर नहीं। submit node में proxy और proxytype fields तभी जोड़ें जब target site उन tokens को ठुकराए जो page लोड करने वाले network से अलग network पर हल हुए हों। प्रॉक्सी reCAPTCHA, Turnstile और GeeTest पर लागू होती हैं, और image कैप्चा के लिए नज़रअंदाज़ कर दी जाती हैं।

इसे किसी असली workflow में जोड़ना

ऊपर बताए गए पाँचों nodes किसी भी ऐसे workflow में फ़िट हो जाते हैं जो किसी सुरक्षित form से टकराता है: कोई lead-capture स्क्रैपर, कोई रात में चलने वाली price जाँच, कोई internal tool जो किसी पुराने portal में लॉग इन करता है। चूँकि सॉल्वर एक कैप्चा सॉल्वर है जो आपके अपने hardware पर चलता है, इसलिए आप उसे जो sitekeys और page URLs देते हैं वे कभी machine से बाहर नहीं जाते, और loop की प्रति run कोई लागत नहीं होती। अगर आप HTTP Request nodes के बजाय किसी Code node से JavaScript या Python में इसे call करना चाहें, तो आधिकारिक SDKs उन्हीं दो endpoints को लपेटते हैं, और reCAPTCHA v2 की बारीक़ियाँ अलग से कवर की गई हैं।