Retool Workflows में कैप्चा कैसे हल करें (REST ब्लॉक)

retool workflows captcha - How to Solve CAPTCHAs in Retool Workflows (REST Blocks)

Retool Workflows में कैप्चा हल करना तीन ब्लॉक का काम है: submit, wait, read। इन्हें JavaScript या Python code block के रूप में बनाने के बजाय REST resource query block के रूप में बनाइए, क्योंकि Retool code block को एक अलग सैंडबॉक्स्ड सर्विस में चलाता है जिसके डिफ़ॉल्ट फ़ायरवॉल नियम प्राइवेट पतों को मना कर देते हैं। resource query कस्टम कोड नहीं बल्कि कॉन्फ़िगरेशन है, इसलिए वह उस सर्विस से होकर नहीं जाती, और वह बिना उस पूरी बहस के आपके अपने नेटवर्क पर मौजूद सॉल्वर तक पहुँच जाती है।

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

  • Workflows वाला एक Retool संगठन, चाहे Retool Cloud पर हो या सेल्फ-होस्टेड। दोनों काम करते हैं, बस नेटवर्क सेटअप अलग होता है।
  • किसी Windows मशीन पर चल रहा CapSkip। अगर वही मशीन सेल्फ-होस्टेड Retool भी चलाती है तो Local mode, और बाकी हर स्थिति में Server mode।
  • जिस चैलेंज को आप हल कर रहे हैं उसका sitekey और पेज URL।
  • API key रखने के लिए कोई जगह। Retool secrets को code block से और resource कॉन्फ़िगरेशन से पढ़ा जा सकता है, इसलिए किसी ब्लॉक में कुछ भी पेस्ट करने की ज़रूरत नहीं पड़ती।

CapSkip पोर्ट 8080 पर 2captcha-कम्पैटिबल API बोलता है, इसलिए Retool को न किसी कनेक्टर की ज़रूरत है और न किसी कस्टम इंटीग्रेशन की। यह एक साधारण REST resource है जो आपकी अपनी मशीन की ओर इंगित होता है।

चरण 1: एक REST resource को सॉल्वर की ओर इंगित करें

CapSkip चला रही मशीन के बेस URL के साथ एक REST API resource बनाइए। authentication खाली छोड़ दीजिए। API key हर रिक्वेस्ट पर एक साधारण पैरामीटर की तरह जाती है, 2captcha-कम्पैटिबल प्रोटोकॉल इसी तरह काम करता है।

# Base URL for the resource. Loopback only works when Retool
# is self-hosted on the same Windows box as the solver.
http://127.0.0.1:8080

# Server mode, which is what you want everywhere else.
http://192.168.1.40:8080

इसके बाद कुछ भी हल करने वाला हर वर्कफ़्लो इसी एक resource का दोबारा इस्तेमाल करता है। पूरे काम के लिए दो query block ही काफ़ी हैं।

चरण 2: चैलेंज सबमिट करें

एक resource query block जोड़िए, उसका नाम submitCaptcha रखिए, action type को POST पर और path को submit एंडपॉइंट पर सेट कीजिए। body एक छोटा JSON ऑब्जेक्ट है।

{
  "key": "YOUR_KEY",
  "method": "userrecaptcha",
  "googlekey": "YOUR_SITEKEY",
  "pageurl": "https://example.com/page-with-recaptcha",
  "json": 1
}

रिस्पॉन्स में वही id आती है जिससे आप पोल करते हैं।

{ "status": 1, "request": "2122988149" }

वह body reCAPTCHA v2 के लिए है। CapSkip जिन दूसरे प्रकारों को सपोर्ट करता है, उनके लिए वही कॉल अलग पैरामीटर के साथ चलती है: invisible या enterprise को 1 पर सेट कर दीजिए, या version को किसी action नाम के साथ v3 पर, या method को turnstile या geetest में बदल दीजिए। पूरी पैरामीटर सूची यहाँ देखें: CapSkip API डॉक्यूमेंटेशन.

एक resource query block अपने बाद आने वाली हर चीज़ को तीन प्रॉपर्टी सौंपता है। रिस्पॉन्स body, data के रूप में आती है, विफलता का संदेश error के रूप में आता है, और बाकी सब metadata में रहता है। इसलिए अभी-अभी मिली id अगले ब्लॉक को submitCaptcha.data.request के रूप में उपलब्ध रहती है।

चरण 3: प्रतीक्षा कीजिए, फिर टोकन एक बार पढ़िए

एक Wait block जोड़िए। reCAPTCHA v2 चेकबॉक्स के लिए पंद्रह सेकंड की पहली प्रतीक्षा समझदारी भरी है। इमेज कैप्चा लगभग एक सेकंड में लौटते हैं, v3 दस से पंद्रह सेकंड में, और GeeTest लगभग पाँच सेकंड में। Wait block एक संख्या या JavaScript एक्सप्रेशन लेता है और इसे सेकंड, मिनट, घंटे या दिन में सेट किया जा सकता है, अधिकतम साठ दिन तक, और यह सिर्फ़ अपने ठीक बाद वाले ब्लॉक को रोकता है।

फिर readResult नाम का एक दूसरा resource query block जोड़िए, जो GET पर सेट हो।

# GET, with the id from step 2 in the query string.
/res.php?key=YOUR_KEY&action=get&id={{ submitCaptcha.data.request }}&json=1

दो तरह के जवाब मुमकिन हैं। तैयार नतीजे में status 1 होता है और request फ़ील्ड में टोकन। जो नतीजा अभी बन ही रहा है उसमें status 0 होता है और request फ़ील्ड में CAPCHA_NOT_READY स्ट्रिंग, जिसकी स्पेलिंग में T नहीं है, और इसका मतलब यह नहीं कि कुछ गड़बड़ हुई, बल्कि यह कि इंतज़ार करते रहिए। इस स्पेलिंग का इतिहास यहाँ पढ़ें: CAPCHA_NOT_READY response का पूरा विवरण.

इन दोनों स्थितियों को एक Branch block से संभालिए। शर्तें किसी ऊपर वाले ब्लॉक पर सादा JavaScript होती हैं, इसलिए टेस्ट इस तरह लिखा जाता है: readResult.data.status === 1। If वाला रास्ता टोकन को आगे ले जाता है। Else वाले रास्ते पर बीस सेकंड का दूसरा Wait और दूसरी बार पढ़ना रखिए।

इसे Loop block से बदलने की इच्छा को रोकिए। इसकी दो वजहें हैं, और दूसरी वजह ही असल में भारी पड़ती है। Loop block का डिफ़ॉल्ट टाइमआउट दस सेकंड है और अधिकतम सीमा दो मिनट, जो उन तीन सौ सेकंड से काफ़ी कम है जो CapSkip एक reCAPTCHA हल को देता है, इसलिए कोई लूप वैसे भी धीमे मामलों को कवर नहीं कर सकता। इससे भी अहम बात, किसी CapSkip नतीजे को एक ही बार पढ़ा जा सकता है। जो लूप पहले से पढ़ी जा चुकी id को दोबारा पढ़ता है, उसे टोकन दूसरी बार नहीं मिलता।

चरण 4: वह नेटवर्क नियम जो सब कुछ तय करता है

यह हिस्सा खास तौर पर Retool से जुड़ा है, और यही वजह है कि यह गाइड हल को resource query block से बनाती है।

Retool आपके JavaScript और Python को एक अलग code executor सर्विस में चलाता है, जो NsJail से सैंडबॉक्स की गई है। सेल्फ-होस्टेड डिप्लॉयमेंट पर वह सर्विस ऐसे iptables नियमों के साथ आती है जो link local पतों और पूरे 192.168.0.0/16 को कवर करते हैं, और Retool ने अपने दस्तावेज़ों में एक ही स्विच बताया है जो उन्हें बंद कर देता है, DISABLE_IPTABLES_SECURITY_CONFIGURATION। Retool यह भी साफ़ कहता है कि वह code executor को privileged चलाने की सलाह देता है ताकि कस्टम कोड सैंडबॉक्स में ही रहे। इसलिए 192.168.1.40 पर मौजूद सॉल्वर तक पहुँचने वाला code block असल में आपसे पूरे instance के लिए सैंडबॉक्स कमज़ोर करने को कह रहा है। resource query कस्टम कोड नहीं है और वह वहाँ चलती भी नहीं।

इससे अलग, सॉल्वर तक पहुँच बनना भी ज़रूरी है। CapSkip में इसके लिए दो कनेक्शन मोड हैं। Local, 127.0.0.1 पर बाइंड होता है और सिर्फ़ उसी डिवाइस को सेवा देता है। Server, आपके नेटवर्क पते या पब्लिक IP पर बाइंड होता है, ताकि कोई दूसरी मशीन, कंटेनर होस्ट या होस्टेड प्लेटफ़ॉर्म उसी Windows मशीन तक API के ज़रिए पहुँच सके। ये दोनों यहाँ मिलते हैं: कनेक्शन सेटिंग्स, और Server mode सिर्फ़ यह बदलता है कि सॉल्वर किस address पर सुनता है। hardware अब भी आपका ही है और हल अब भी बिना मीटर वाला है।

Retool कहाँ चलता हैकौन-सा mode, और और क्या
CapSkip वाली उसी Windows machine पर self-hostedLocal mode। बेस URL loopback पर ही रहता है
आपके नेटवर्क की किसी दूसरी मशीन पर या Docker में सेल्फ-होस्टेडसॉल्वर के LAN पते के साथ Server mode। code block नहीं, resource query block इस्तेमाल कीजिए
Retool Cloudस्टैटिक पब्लिक IP के साथ Server mode, और साथ में Retool के आउटबाउंड पतों के लिए एक इनबाउंड फ़ायरवॉल नियम

Retool Cloud आपके resources को पतों के एक तय और प्रकाशित सेट से कॉल करता है, और दस्तावेज़ कहते हैं कि cloud instances को यह सुनिश्चित करना होगा कि कॉन्फ़िगर किए गए resources उन पतों से पहुँच की अनुमति दें। डिफ़ॉल्ट क्षेत्र AWS us-west-2 है।

# Retool Cloud outbound ranges, us-west-2, the default region.
35.90.103.132/30
44.208.168.68/30

# eu-central-1
3.77.79.248/30

पोर्ट 8080 के आगे लगे फ़ायरवॉल पर उन्हीं पतों को अनुमति दीजिए और बाकी सब मना कर दीजिए। यह दिखने में जितना बड़ा लगता है, उससे कहीं छोटा रास्ता है, और Retool Cloud की पूरी कहानी बस इतनी ही है।

चरण 5: वे टाइमआउट जो तय करते हैं कि कोई धीमा हल बचेगा या नहीं

Retool अलग-अलग ब्लॉक प्रकारों के लिए अलग-अलग अधिकतम सीमाएँ प्रकाशित करता है, और वे यहाँ मायने रखती हैं क्योंकि हल अपने स्वभाव से ही धीमा होता है।

कौन-सी सीमामानयह किसी हल के लिए क्यों मायने रखती है
resource query block, एसिंक्रोनस रन10 मिनट तकआरामदायक। एक बार पढ़ने में एक सेकंड से भी काफ़ी कम लगता है
resource query block, सिंक्रोनस रन2 मिनट तकपढ़ने के लिए फिर भी ठीक है, क्योंकि इंतज़ार तो Wait block में होता है
Loop blockडिफ़ॉल्ट रूप से 10 सेकंड, ज़्यादा से ज़्यादा 2 मिनटयही वजह है कि यहाँ पोल लूप गलत तरीका है
पूरा रन, एसिंक्रोनस30 घंटे, और Wait block के साथ असीमितहल में ऐसा कुछ नहीं जो इसके आसपास भी पहुँचे
पूरा रन, सिंक्रोनसपहले webhook Response block तक 15 मिनटयही जाल है। नीचे वाला पैराग्राफ़ देखें
प्रति वर्कफ़्लो एक साथ चलने वाली बाहरी रिक्वेस्टएक बार में 50एक ही रन में हल के बैच पर असली सीमा
शेड्यूल ट्रिगर का अंतरालकम से कम एक मिनटठीक है, और इतनी बार चलाने पर कोई लागत नहीं आती

योजना सिंक्रोनस आँकड़े के हिसाब से बनाइए। जो webhook trigger कनेक्शन खुला रखता है और Response block से जवाब देता है, वह आपको पंद्रह मिनट देता है, जो उदार लगता है जब तक आपको यह याद न आ जाए कि reCAPTCHA का इंतज़ार करते हुए दो मिनट तक खुले HTTP कनेक्शन पर बैठा कॉलर अपने आप में एक खराब डिज़ाइन है। वर्कफ़्लो को एसिंक्रोनस तरीके से ट्रिगर कीजिए और उससे टोकन वहाँ भिजवाइए जहाँ उसकी ज़रूरत है, या webhook का जवाब तुरंत दे दीजिए और हल का काम उसके पीछे चलने दीजिए।

resource query block के पास अपने खुद के retry count और एक्सपोनेंशियल बैकऑफ़ सेटिंग्स भी होते हैं। इन्हें submitCaptcha के लिए चालू कीजिए और readResult के लिए बंद ही रहने दीजिए, ऊपर बताई गई एक बार ही पढ़े जाने वाली वजह से।

अगर आप कोड लिखना ही पसंद करें

किसी सेल्फ-होस्टेड instance पर, जहाँ code executor सॉल्वर तक पहुँच सकता है, पूरा फ़्लो सिमटकर एक ही Python ब्लॉक बन जाता है, क्योंकि SDK आपके लिए पोल करता है। पहले Libraries टैब में वर्कफ़्लो की requirements.txt में capskip जोड़ दीजिए।

# pip install capskip - add it in the Libraries tab instead.
from capskip import CapSkip

# host is the solver machine. Keep 127.0.0.1 only when Retool
# runs on the same Windows box as CapSkip.
solver = CapSkip(host="192.168.1.40", port=8080)

result = solver.recaptcha(
    sitekey="YOUR_SITEKEY",
    url="https://example.com/page-with-recaptcha",
)

# Python blocks serialize their output as JSON, so return
# the token rather than the client object.
{"token": result["code"]}

SDK पोलिंग 250 मिलीसेकंड से शुरू करता है और पाँच सेकंड तक बैकऑफ़ करता है, बजाय किसी तय अंतराल पर सोने के, इसलिए यह संस्करण आम तौर पर Wait आधारित फ़्लो से जल्दी लौटता है। reCAPTCHA, Turnstile और GeeTest के लिए इसकी अधिकतम सीमा तीन सौ सेकंड है, जो दस मिनट के एसिंक्रोनस code block टाइमआउट के भीतर ही है। Retool Cloud डिफ़ॉल्ट रूप से Python 3.10 चलाता है, और Node.js, PHP तथा C# के लिए वैसे ही एक कॉल वाले संस्करण यहाँ मिलेंगे: CAPTCHA solving SDK पेज.

टोकन को ठीक अगले ब्लॉक में ही सबमिट कीजिए। reCAPTCHA टोकन लगभग दो मिनट तक चलता है, इसलिए जो वर्कफ़्लो हल करता है, किसी लंबे Wait block पर रुकता है और फिर सबमिट करता है, वह ऐसे टोकन पर विफल हो जाएगा जो बनते समय पूरी तरह वैध था। यह विफलता इस गाइड में समझाई गई है: reCAPTCHA token की समय समाप्ति.

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

आप जो देखते हैंकारणफिक्स
code block किसी LAN पते तक पहुँचते हुए टाइमआउट हो जाता हैसेल्फ-होस्टेड code executor के डिफ़ॉल्ट iptables नियम 192.168.0.0/16 को कवर करते हैंकॉल को किसी REST resource query block में ले जाइए
port 8080 पर connection refusedCapSkip loopback पर बाइंड है और Retool कहीं और हैServer mode पर स्विच करें और सॉल्वर का network address इस्तेमाल करें
Retool Cloud उस resource तक बिल्कुल नहीं पहुँच पाताफ़ायरवॉल Retool के आउटबाउंड पतों को अंदर नहीं आने देताअपने क्षेत्र के लिए प्रकाशित रेंज को पोर्ट 8080 पर अनुमति दीजिए
readResult हर बार CAPCHA_NOT_READY लौटाता हैWait block, हल में लगने वाले समय से छोटा हैपहली प्रतीक्षा बढ़ाइए, या Else वाले रास्ते पर दूसरी प्रतीक्षा और दूसरी बार पढ़ना जोड़िए
उसी id को दूसरी बार पढ़ने पर खाली नतीजा आता हैकिसी CapSkip नतीजे को एक ही बार पढ़ा जा सकता हैटोकन को ब्लॉक के आउटपुट में ही रखिए, id को कभी दोबारा मत पढ़िए
रिस्पॉन्स में ERROR_WRONG_USER_KEYkey पैरामीटर एक खाली स्ट्रिंग में बदल गयाsecret का नाम जाँचिए, उसके अक्षरों का केस भी
एक वैध token को टारगेट साइट अस्वीकार कर देती हैवह solve और submit के बीच expire हो गयाअगले ब्लॉक में ही सबमिट कीजिए, दोनों के बीच कोई Wait न रखिए
हल का एक बैच बीच में ही अटक जाता हैएक वर्कफ़्लो में एक साथ 50 बाहरी रिक्वेस्ट ही चल सकती हैंLoop block को बैच में चलाइए, या काम को कई रन में बाँट दीजिए

FAQ

क्या मैं Retool Cloud से CapSkip इस्तेमाल कर सकता हूँ?

हाँ, Server mode के साथ। Retool Cloud आपके resources को अपने ही इन्फ़्रास्ट्रक्चर से कॉल करता है, इसलिए सॉल्वर को ऐसे पते पर सुनना होगा जहाँ वे पहुँच सकें: यानी किसी पब्लिक IP पर, बेहतर हो कि वह स्टैटिक हो। Retool उन आउटबाउंड रेंज को प्रकाशित करता है जिनसे वह कॉल करता है, इसलिए फ़ायरवॉल नियम पूरी दुनिया के लिए खुला नहीं, बल्कि सँकरा रहता है। सॉल्वर में कुछ भी नहीं बदलता और कुछ भी मीटर्ड नहीं होता। फ़र्क़ सिर्फ़ उस पते का है जिस पर वह सुनता है।

axios वाला JavaScript ब्लॉक ही क्यों न इस्तेमाल कर लें?

क्योंकि असल सवाल यह है कि वह कोड चलता कहाँ है। Retool code block को NsJail से सैंडबॉक्स की गई एक अलग सर्विस में चलाता है, और सेल्फ-होस्टेड डिप्लॉयमेंट पर वह सर्विस ऐसे फ़ायरवॉल नियम लगाती है जो प्राइवेट रेंज को कवर करते हैं। उन्हें बंद करना एक दस्तावेज़ीकृत स्विच है, लेकिन यह पूरे instance पर लागू होने वाला फ़ैसला है जो सिर्फ़ एक वर्कफ़्लो को आसान बनाने के लिए लिया जाता है, और Retool खुद इसके खिलाफ़ सलाह देता है। resource query block उसी सॉल्वर तक बिना ऐसी किसी बहस के पहुँच जाता है। तर्क के लिए code block इस्तेमाल कीजिए और नेटवर्क के लिए resource query block।

क्या वर्कफ़्लो को तब तक लूप करते रहना चाहिए जब तक टोकन न आ जाए?

नहीं। Loop block ज़्यादा से ज़्यादा दो मिनट तक चलता है, जो उन तीन सौ सेकंड से काफ़ी कम है जो एक reCAPTCHA हल को मिलते हैं, और यह जितने चक्कर आपने तय किए हैं उतने चलाता ही है, बीच में जल्दी रुकता नहीं। इसके ऊपर, कोई नतीजा एक ही बार पढ़ा जा सकता है, इसलिए उसी id को बार-बार पढ़ना बेकार की दौड़ है। सही लंबाई का एक Wait block और एक बार पढ़ना ही सही और सस्ता तरीका है, और उसके पीछे दूसरी प्रतीक्षा तथा दूसरी बार पढ़ने वाला एक Branch धीमे मामलों को संभाल लेता है।

n8n या Pipedream के मुकाबले यह कैसा है?

तीनों टूल में ये दोनों रिक्वेस्ट एक जैसी ही हैं। फ़र्क सिर्फ़ इस बात का है कि हर टूल उनके सामने कौन-सी रुकावट खड़ी करता है।

  • n8n में रुकावट कंटेनर नेटवर्किंग है, जिसे यहाँ विस्तार से समझाया गया है: n8n workflow गाइड.
  • Pipedream में मामला step रनटाइम का और इस बात का है कि secrets कहाँ रहते हैं, जिसे यहाँ कवर किया गया है: Pipedream गाइड.
  • Retool में यह खुद code executor का फ़ायरवॉल है, इसीलिए ऊपर दिया गया फ़्लो कभी किसी code block में HTTP कॉल नहीं रखता।

संक्षेप में

एक REST resource को सॉल्वर की ओर इंगित कीजिए, चैलेंज POST कीजिए, पंद्रह सेकंड Wait कीजिए, नतीजा GET कीजिए, और इस बात पर Branch कीजिए कि वह तैयार है या नहीं। HTTP को code block के बजाय resource query block में ही रखिए, क्योंकि code executor के डिफ़ॉल्ट फ़ायरवॉल नियम प्राइवेट पतों को कवर करते हैं और उन्हें ढीला करना पूरे instance का फ़ैसला है। जब भी Retool सॉल्वर की अपनी मशीन पर न हो, CapSkip को Server mode में कर दीजिए, और Retool Cloud पर सिर्फ़ प्रकाशित आउटबाउंड रेंज को ही पोर्ट 8080 तक आने दीजिए। किसी सिंक्रोनस webhook के भीतर हल का इंतज़ार कभी मत कीजिए।

हर मिनट चलने वाले किसी शेड्यूल्ड वर्कफ़्लो को इस पर लगाने से पहले एक बात तौलने लायक है: CapSkip एक लोकल captcha सॉल्वर है जो आपके पास पहले से मौजूद हार्डवेयर पर चलता है, इसलिए हर मिनट चलने वाला वर्कफ़्लो और दिन में दो बार चलने वाला वर्कफ़्लो, दोनों की लागत बिल्कुल बराबर है।