Activepieces में कैप्चा कैसे हल करें (HTTP Piece)

एक Activepieces कैप्चा हल तीन steps का होता है: challenge submit करें, इंतज़ार करें, token पढ़ें। इसे किसी Code step के बजाय HTTP piece पर बनाएं, क्योंकि कोई Code step npm का इस्तेमाल कर भी सकता है या नहीं, यह इस पर निर्भर करता है कि आपका instance किस sandbox mode में चलता है, और Activepieces Cloud जिस mode का इस्तेमाल करता है उसमें npm नहीं है। HTTP piece हर mode में काम करता है। एक दूसरी setting है जो code से भी ज़्यादा मायने रखती है, और वही तय करती है कि आपका flow किसी private address पर मौजूद सॉल्वर तक पहुँच भी सकता है या नहीं।
आपको क्या चाहिए
- एक Activepieces project जिसमें आप कोई flow publish कर सकें, उनके cloud पर या self-hosted।
- एक Windows machine पर चलता हुआ CapSkip। Local mode तभी ठीक है जब Activepieces उसी machine पर चले, जिसका व्यवहार में मतलब है एक self-hosted install। बाक़ी हर स्थिति में Server mode चाहिए।
- जिस साइट को आप ऑटोमेट कर रहे हैं उसका sitekey और पेज URL।
- एक project variable जिसमें सॉल्वर key रखी हो, ताकि वह flow body में न बैठी रहे।
- किसी hardened network वाले self-hosted instance पर, SSRF allow list में एक entry। Step 3 इसे कवर करता है।
HTTP piece क्यों और Code step क्यों नहीं
Code step editor में एक Add npm package dialog होता है। यह package को npm registry में खोजता है, latest version को pin करता है और उसे उस step की dependency list में लिख देता है। Activepieces Cloud पर वह list फिर फेंक दी जाती है।
Activepieces किसी Code step को इस तरह build करता है: आपका source एक TypeScript file में लिखता है, उसकी dependencies install करता है और नतीजे को bundle कर देता है। build आपकी dependencies तभी माँगता है जब उस instance का execution mode packages की इजाज़त देता हो। V8 sandboxing में, जिसे Activepieces अपने documentation में उस mode के रूप में बताता है जिस पर उनका cloud चलता है, packages की इजाज़त नहीं है, इसलिए build एक खाली dependency set रख देता है और फिर भी compile कर देता है। step साफ़-सुथरा deploy हो जाता है। import तब विफल होता है जब flow चलता है।
| Instance का execution mode | Code step में npm | इस flow के लिए इसका क्या मतलब है |
|---|---|---|
| V8 sandboxing, यानी value SANDBOX_CODE_ONLY | कोई npm packages नहीं | HTTP piece इस्तेमाल करें। यही Activepieces Cloud है |
| Combined sandboxing, यानी SANDBOX_CODE_AND_PROCESS | कोई npm packages नहीं | HTTP piece इस्तेमाल करें |
| Kernel namespaces, यानी SANDBOX_PROCESS | npm packages काम करते हैं | Node SDK काम करता है, और वह आपके लिए poll करता है |
| कोई sandboxing नहीं, UNSANDBOXED | npm packages काम करते हैं | Node SDK काम करता है, और वह आपके लिए poll करता है |
तो इसे करने के दो ईमानदार तरीक़े हैं, और आपको कौन-सा मिलेगा यह आपकी नहीं, आपके administrator की पसंद है। नीचे दिया गया HTTP piece वाला रास्ता चारों में काम करता है। इस गाइड के आख़िर में दिया गया Code step वाला रास्ता उनमें से दो में काम करता है और जब वह उपलब्ध हो तो कहीं छोटा पड़ता है।
Step 1: challenge submit करें
CapSkip port 8080 पर 2captcha-compatible API बोलता है, इसलिए HTTP piece बिना कोई connector install किए उससे बात कर लेता है। एक Send HTTP Request action जोड़ें, method को POST पर सेट करें और URL को अपने सॉल्वर के submit endpoint पर।
{
"key": "{{variables['CAPSKIP_KEY']}}",
"method": "userrecaptcha",
"googlekey": "YOUR_SITEKEY",
"pageurl": "https://example.com/page-with-recaptcha",
"json": 1
}response एक छोटा JSON object होता है जिसके request field में वह id होती है जिससे आप poll करते हैं।
{ "status": 1, "request": "2122988149" }यह reCAPTCHA v2 है। CapSkip जिन दूसरे प्रकारों को सपोर्ट करता है वे वही call हैं, बस अलग parameters के साथ: invisible या enterprise को 1 पर सेट करके जोड़ें, या version को किसी action name के साथ v3 पर सेट करें, या method को turnstile या geetest में बदल दें। पूरी parameter सूची यहाँ है CapSkip API डॉक्यूमेंटेशन.
key को paste करने के बजाय project variable syntax से reference करें। Variables at rest encrypted होते हैं और variables list में आपको कभी वापस दिखाए नहीं जाते, और किसी एक को rotate करना हर flow में खोजबीन करने के बजाय एक ही edit होता है।
Step 2: इंतज़ार करें, फिर token पढ़ें
एक Delay For action जोड़ें, फिर एक दूसरा HTTP request जो नतीजा पढ़े। किसी reCAPTCHA v2 checkbox के लिए बीस सेकंड पहली बार का समझदार इंतज़ार है। Image कैप्चा लगभग एक सेकंड में लौट आते हैं, v3 दस से पंद्रह में, GeeTest लगभग पाँच में।
# GET, with the id from step 1 in the query string. http://127.0.0.1:8080/res.php?key=YOUR_KEY&action=get&id=2122988149&json=1
दो जवाब मुमकिन हैं। तैयार नतीजा submit response जैसा एक JSON object होता है, जिसके request field में token होता है। जो नतीजा अभी तैयार नहीं है वह string CAPCHA_NOT_READY होता है, जो बिना T के लिखा जाता है, और इसका मतलब है कि इंतज़ार जारी रखें, न कि कुछ ग़लत हो गया। उस वर्तनी का इतिहास यहाँ है CAPCHA_NOT_READY response का पूरा विवरण.
Delay piece दस सेकंड के इस पार और उस पार अलग-अलग व्यवहार करता है, और यही वह बारीकी है जो यहाँ polling के इस ढाँचे को सस्ता बना देती है। दस सेकंड या उससे कम का delay worker process में ही सोता है। इससे लंबा कुछ भी एक waitpoint बनाता है, run को suspend कर देता है और घड़ी पूरी होने पर उसे फिर से चालू कर देता है। Suspended समय execution समय नहीं है, और Activepieces अपने documentation में बताता है कि Delay या Wait for Approval से रुके हुए flows run timeout में नहीं गिने जाते। इसलिए बीस सेकंड का इंतज़ार आपके दस मिनट के बजट में कुछ भी ख़र्च नहीं करता, और दूसरा इंतज़ार भी नहीं।
अगर एक बार पढ़ना काफ़ी न हो, तो loop की ओर बढ़ने के बजाय एक और Delay और एक और read जोड़ें। दो वजहें। Loop on Items सूची के हर item को चलाता है, इसलिए iterations तब भी होते हैं जब token पहले ही आ चुका हो, और उसके अंदर रखा Router आपका काम loop का चक्कर बचाने के बजाय सिर्फ़ उस branch में बचाता है। इससे भी ज़्यादा अहम बात, किसी CapSkip नतीजे को एक ही बार पढ़ा जा सकता है, इसलिए ऐसा loop जो पहले ही ले चुकी id को दोबारा पढ़ता है उसे token दो बार नहीं मिलता, दूसरी बार पढ़ने पर उसे एक error मिलती है।
Step 3: वह network setting जो किसी local सॉल्वर को ब्लॉक कर देती है
यही वह हिस्सा है जिसमें लोग फँसते हैं, और यह सामान्य orchestrator सलाह के बजाय ख़ास Activepieces की बात है। Activepieces में flow code के लिए एक SSRF guard है, जिसे AP_NETWORK_MODE नाम का एक variable नियंत्रित करता है। यह डिफ़ॉल्ट रूप से UNRESTRICTED रहता है। STRICT पर सेट होने पर engine किसी भी flow code के चलने से पहले Node की DNS lookup और socket connect को patch कर देता है, और ऐसे हर connection से इनकार कर देता है जिसका address loopback, RFC1918 private, link-local या cloud metadata हो। यह SSRFBlockedError नाम की एक error फेंकता है।
आपके अपने network पर मौजूद कोई कैप्चा सॉल्वर ठीक उसी शक्ल का होता है जिसे वह guard ब्लॉक करता है। 127.0.0.1 और 192.168.1.40 जैसा कोई LAN address, दोनों उस सूची में हैं। यह guard का अपना काम है, कोई bug नहीं, और Activepieces इसके लिए एक documented अपवाद देता है: सॉल्वर का address AP_SSRF_ALLOW_LIST में डालें, जो comma से अलग किए गए IPs और CIDR ranges लेता है और flow code तथा server के अपने outbound requests, दोनों पर एक जैसा लागू होता है। इसे बदलने के बाद server को restart करें।
# On a self-hosted Activepieces with AP_NETWORK_MODE=STRICT, # name the solver machine or its subnet so flows can reach it. AP_SSRF_ALLOW_LIST=192.168.1.40,10.0.5.0/24
guard से अलग, flow का उस machine तक पहुँच पाना भी ज़रूरी है। CapSkip के पास इसके लिए दो connection modes हैं। Local mode 127.0.0.1 से bind होता है और सिर्फ़ उसी device को सेवा देता है। Server mode आपके network address या public IP से bind होता है, ताकि कोई दूसरा box, कोई container host या कोई hosted platform उसी Windows machine तक API के ज़रिए पहुँच सके। दोनों यहाँ मौजूद हैं कनेक्शन सेटिंग्स, और Server mode सिर्फ़ यह बदलता है कि सॉल्वर किस address पर सुनता है। hardware अब भी आपका ही है और हल अब भी बिना मीटर वाला है।
| Activepieces कहाँ चलता है | कौन-सा mode, और और क्या |
|---|---|
| CapSkip वाली उसी Windows machine पर self-hosted | Local mode, host 127.0.0.1 ही रहता है। अगर network mode STRICT है तो इसे allow-list करें |
| Docker में या आपके network के किसी दूसरे box पर self-hosted | सॉल्वर के LAN address के साथ Server mode। उस address को भी allow-list करें |
| Activepieces Cloud | किसी static public IP और एक firewall rule के साथ Server mode। SSRF guard फिर भी चलता है पर रोकता नहीं, क्योंकि कोई public address उसकी blocklist में नहीं होता |
Step 4: timeouts और retries
तीन संख्याएँ तय करती हैं कि कोई धीमा हल बचता है या नहीं, और उनमें से सिर्फ़ एक ऐसी है जिसे आप flow में सेट करते हैं।
| कौन-सी सीमा | मान | यह किसी हल के लिए क्यों मायने रखती है |
|---|---|---|
| पूरे run पर, और किसी भी एक action पर, सीमाएँ एक-दूसरे से स्वतंत्र रूप से गिनी जाती हैं | दस-दस मिनट, दोनों एक ही variable AP_FLOW_TIMEOUT_SECONDS से सेट | आरामदायक, क्योंकि delay का समय flow run timeout में नहीं गिना जाता |
| Synchronous webhook का response timeout | तीस सेकंड, AP_WEBHOOK_TIMEOUT_SECONDS से सेट | यही जाल है। नीचे वाला पैराग्राफ़ देखें |
| Retry on Failure, प्रति step | चार कोशिशें, जिनमें इंतज़ार चार, आठ और सोलह सेकंड के होते हैं | उस सॉल्वर को संभालता है जो restart हो रहा हो, उसे नहीं जो बस धीमा हो |
webhook वाली संख्या ही काटती है। sync शब्द पर ख़त्म होने वाला कोई webhook URL HTTP connection खुला रखता है और flow के नतीजे के साथ जवाब देता है, और तीस सेकंड बाद हार मान लेता है। कोई reCAPTCHA v2 हल तीस सेकंड के अंदर भरोसे से पूरा नहीं होता, इसलिए जो caller flow को synchronously trigger करता है और वापस token की उम्मीद करता है उसे HTTP 408 मिलता है, जबकि flow उसके पीछे चलता रहता है। flow को asynchronously trigger करें और उससे token वहाँ post करवाएँ जहाँ आपको चाहिए, या काम को इस तरह बाँटें कि synchronous हिस्सा कभी किसी हल का इंतज़ार न करे।
Retry on Failure को submit step के लिए चालू करना फ़ायदेमंद है, read step के लिए नहीं। इसका backoff दो सेकंड के base से exponential है, इसलिए चार कोशिशों में इंतज़ार लगभग चार, आठ और सोलह सेकंड होते हैं। यह उस connection के लिए सही है जिसे refuse कर दिया गया हो। यह उस token के लिए ग़लत है जिसे आप पहले ही ले चुके हैं, ऊपर बताए गए एक बार पढ़ने वाले नियम की वजह से।
पूरा काम एक ही step में, किसी self-hosted instance पर
अगर आपका administrator कोई sandboxing नहीं चलाता या kernel namespace sandboxing चलाता है, तो ऊपर वाला flow एक ही Code step में सिमट जाता है, क्योंकि SDK आपके लिए poll करता है। npm dialog में capskip जोड़ें, फिर step लिखें। Code steps TypeScript हैं, चलने से पहले bundle होते हैं, इसलिए एक साधारण import काम कर जाता है।
// npm install capskip - add it in the step's package dialog.
import { CapSkip } from 'capskip';
export const code = async (inputs) => {
// host is the solver machine. Keep 127.0.0.1 only when
// Activepieces runs on the same Windows box as CapSkip.
const solver = new CapSkip({
host: inputs.capskipHost,
port: 8080,
apiKey: inputs.capskipKey,
});
const result = await solver.recaptcha(inputs.sitekey, inputs.pageUrl);
// Return the token, not the whole result. The next step
// submits it, and run logs keep whatever you return.
return { token: result.code };
};capskipKey को एक step input के रूप में पास करें जिसमें project variable का reference हो, ताकि key run time पर resolve हो और source में कभी दिखाई न दे। SDK किसी तय अंतराल पर सोने के बजाय 250 milliseconds से polling शुरू करता है और फिर धीमा होता जाता है, यही वजह है कि यह version आम तौर पर Delay आधारित flow से जल्दी लौटता है। reCAPTCHA, Turnstile और GeeTest के लिए इसकी अधिकतम सीमा 300 सेकंड है, जो दस मिनट के action timeout के भीतर आराम से आ जाती है।
token को ठीक अगले step में submit करें। कोई reCAPTCHA token लगभग दो मिनट तक चलता है, इसलिए ऐसा flow जो हल करता है, किसी approval step पर रुकता है और फिर submit करता है, वह उस token पर विफल होगा जो बनते समय बिल्कुल वैध था। उस विफलता को इस गाइड में कवर किया गया है reCAPTCHA token की समय समाप्ति.
आम errors और उनका मतलब
| आप जो देखते हैं | कारण | फिक्स |
|---|---|---|
| run log में SSRFBlockedError | network mode STRICT है और सॉल्वर किसी private address पर है | उस address को AP_SSRF_ALLOW_LIST में जोड़ें और server restart करें |
| जब flow चलता है तो capskip module नहीं मिलता | sandbox mode ने build time पर dependency हटा दी | step को HTTP piece calls के रूप में दोबारा बनाएं, या ऐसे mode में self-host करें जो packages की इजाज़त देता हो |
| port 8080 पर connection refused | CapSkip loopback से bound है और worker कहीं और है | Server mode पर स्विच करें और सॉल्वर का network address इस्तेमाल करें |
| read हर बार CAPCHA_NOT_READY लौटाता है | delay हल में लगने वाले समय से छोटा है | पहला Delay बढ़ाएं, या एक और delay तथा read जोड़ें |
| उसी id का दूसरा read विफल हो जाता है | किसी CapSkip नतीजे को एक ही बार पढ़ा जा सकता है | token को किसी step output में रखें, id को कभी दोबारा न पढ़ें |
| रिस्पॉन्स में ERROR_WRONG_USER_KEY | project variable एक खाली string पर resolve हुआ | variable का नाम जाँचें, उसका सही case भी |
| किसी synchronous webhook से HTTP 408 | हल तीस सेकंड के webhook timeout से आगे निकल गया | asynchronously trigger करें, या हल को synchronous रास्ते से हटा दें |
| एक वैध token को टारगेट साइट अस्वीकार कर देती है | वह solve वाले step और submit वाले step के बीच expire हो गया | अगले ही step में submit करें, बीच में कोई approval या delay न रखें |
FAQ
क्या मैं Activepieces Cloud से CapSkip इस्तेमाल कर सकता हूँ?
हाँ, Server mode के साथ। workers आपके नहीं बल्कि Activepieces के infrastructure पर होते हैं, इसलिए सॉल्वर को ऐसे address पर सुनना होगा जहाँ तक वे पहुँच सकें: एक public IP, बेहतर हो कि static, और एक firewall rule जो उनके traffic को अंदर आने दे। सॉल्वर में कुछ नहीं बदलता, सिर्फ़ यह बदलता है कि वह कहाँ सुनता है। उनके cloud पर आप जो नहीं कर सकते वह है किसी Code step में Node SDK का इस्तेमाल, क्योंकि उस mode में npm नहीं है, इसलिए flow को HTTP piece पर बनाएं।
npm package जोड़ना काम करता हुआ क्यों लगा?
क्योंकि dialog एक UI feature है और छँटाई server पर होती है। dialog package को npm registry के ख़िलाफ़ resolve करता है और उसे दर्ज कर लेता है। build time पर server पूछता है कि execution mode packages की इजाज़त देता है या नहीं, और अगर नहीं देता, तो install करने से पहले वह एक खाली dependency set रख देता है। step बिना किसी चेतावनी के compile और deploy हो जाता है। आपको run time पर पता चलता है, जब import कुछ भी resolve नहीं करता।
क्या flow को token आने तक loop करना चाहिए?
आम तौर पर नहीं। Loop on Items अपनी पूरी item सूची चलाता है, इसलिए आपने जितने iterations configure किए हैं उन सबकी क़ीमत चुकानी पड़ती है, और हर iteration एक ऐसी id को दोबारा पढ़ेगा जिसे सिर्फ़ एक बार पढ़ा जा सकता है। सही लंबाई का एक delay और एक ही read दोनों सस्ता भी है और सही भी, और एक दूसरा delay तथा read एक अच्छा fallback है। लंबे delays यहाँ असामान्य रूप से सस्ते हैं, क्योंकि दस सेकंड से लंबा delay किसी worker को घेरने के बजाय run को suspend कर देता है, और suspended समय run timeout में नहीं गिना जाता।
यह n8n, Make.com या Zapier के मुक़ाबले कैसा है?
चारों tools में requests एक जैसी हैं। फ़र्क़ इसमें है कि हर एक उनके सामने कौन-सी अड़चन रखता है।
- n8n के लिए अड़चन container networking है, और n8n workflow गाइड उसे हल करके दिखाती है।
- Make.com के लिए यह वह certificate है जिसकी उसका HTTP module माँग करता है, जिसे Make.com वॉकथ्रू पूरी तरह कवर करती है।
- Zapier के लिए यह किसी Code step पर लगी runtime सीमा है, जिसे समझाती है Zapier गाइड.
Activepieces अपनी दो अड़चनें जोड़ता है: एक sandbox mode जो तय करता है कि npm मौजूद भी है या नहीं, और एक SSRF guard जो किसी private address को सीधे मना कर सकता है।
संक्षेप में
हल को HTTP piece पर बनाएं, क्योंकि यह हर sandbox mode में काम करता है और Code step वाला रास्ता नहीं करता। submit endpoint पर submit करें, दस सेकंड से आगे का delay रखें ताकि run किसी worker को घेरने के बजाय suspend हो जाए, फिर नतीजा एक बार पढ़ें और उसे रख लें। key को किसी project variable में रखें। अगर instance self-hosted है और उसका network mode strict है, तो सॉल्वर को SSRF allow list में जोड़ें, और अगर Activepieces सॉल्वर की अपनी machine के अलावा कहीं और चलता है, तो CapSkip को Server mode पर स्विच करें। किसी synchronous webhook पर हल का इंतज़ार कभी न करें।
- reCAPTCHA v2 checkbox ख़ुद यहाँ कवर किया गया है reCAPTCHA v2 सॉल्वर पेज.
- Python, Node.js, PHP और C# में इसके बराबर के one-call versions यहाँ दिए गए हैं CAPTCHA solving SDK पेज.
इस flow को हर कुछ मिनट पर schedule करने से पहले एक बात तौलने लायक़ है: CapSkip एक असीमित कैप्चा सॉल्वर है, जो उसी हार्डवेयर पर चलता है जो पहले से आपका है, इसलिए लगातार चलने वाले flow और कभी-कभार चलने वाले flow, दोनों की लागत बिल्कुल एक जैसी है।
