उत्पादएकीकरणसंसाधनदस्तावेजीकरणमूल्य निर्धारण
अभी शुरू करें

© 2026 CapSolver. All rights reserved.

हमसे संपर्क करें

Slack: lola@capsolver.com

उत्पाद

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • ब्राउज़र एक्सटेंशन
  • अधिक कैप्चा प्रकार

एकीकरण

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • साझेदार
  • सभी एकीकरण देखें

संसाधन

  • रेफरल प्रोग्राम
  • दस्तावेजीकरण
  • API संदर्भ
  • ब्लॉग
  • FAQ
  • शब्दावली
  • स्थिति

कानूनी

  • सेवा की शर्तें
  • गोपनीयता नीति
  • धनवापसी नीति
  • मेरी व्यक्तिगत जानकारी न बेचें
//CapSolver के साथ n8n में Cloudflare Challenge को कैसे हल करें
Mar10, 2026

CapSolver के साथ n8n में Cloudflare Challenge को कैसे हल करें

Rajinder Singh

Rajinder Singh

Deep Learning Researcher

Cloudflare का बॉट सुरक्षा केवल CAPTCHA विजेट तक सीमित नहीं है। Cloudflare Challenge — पूरी पेज "Verifying your browser…" स्क्रीन जो साइट तक पूरी तरह से पहुँचने से रोकती है — वेब पर सबसे आक्रामक बॉट डिफेंस में से एक है। यह असली ब्राउज़र वातावरण में पूर्ण JavaScript चैलेंज चलाता है, व्यवहारिक संकेतों की जांच करता है, और आपके TLS कनेक्शन का फिंगरप्रिंट करता है इससे पहले कि आपको अनुमति दे।

यहाँ मानक ऑटोमेशन उपकरण विफल हो जाते हैं। इसलिए नहीं कि वे चैलेंज हल नहीं कर सकते, बल्कि क्योंकि Cloudflare TLS हैंडशेक का फिंगरप्रिंट करता है — और कोई भी गैर-ब्राउज़र HTTP क्लाइंट चैलेंज सर्व होने से पहले ही ब्लॉक हो जाता है, या वैध cf_clearance कुकी के बावजूद तुरंत फिर से चैलेंज किया जाता है।

इस मार्गदर्शिका में, आप सीखेंगे कि कैसे n8n में एक Cloudflare Challenge स्क्रेपर बनाएं जो वास्तव में काम करता है — साझा करते हुए CapSolver को चैलेंज हल करने के लिए, एक स्थानीय Go TLS सर्वर जो Chrome का TLS फिंगरप्रिंट स्पूफ़ करता है, और एक n8n वर्कफ़्लो जो इसे एक साथ जोड़ता है।

आप क्या बनाएंगे:

  • एक डुअल-ट्रिगर वर्कफ़्लो (शेड्यूल + वेबहुक) जो Cloudflare बॉट मैनेजमेंट को बायपास करता है
  • एक हल्का Go सर्वर जो असली Chrome TLS फिंगरप्रिंट के साथ HTTP अनुरोध करता है
  • एक पुन: प्रयोज्य स्क्रेपर टेम्पलेट जिसे आप किसी भी CF-संरक्षित साइट की ओर इंगित कर सकते हैं
  • उपयोग केस वर्कफ़्लो स्क्रैपिंग, खाता लॉगिन, और एक स्टैंडअलोन चैलेंज सोल्वर API — सभी Cloudflare Challenge के पीछे
  • Turnstile वर्कफ़्लो — एक सोल्वर API, एक स्क्रैपिंग टेम्पलेट, और खाता लॉगिन फ्लो उन साइटों के लिए जो Cloudflare Turnstile का उपयोग करती हैं (कोई प्रॉक्सी या TLS सर्वर आवश्यक नहीं)

Cloudflare Challenge क्या है?

Cloudflare Challenge (जिसे JS challenge या Bot Management challenge भी कहा जाता है) एक पूरी पेज इंटरस्टीशियल है जिसे Cloudflare किसी संरक्षित साइट तक पहुंच से पहले आगंतुक के सामने डालता है। आपने इसे देखा होगा: एक काला या सफेद स्क्रीन जिसमें "Verifying your browser…" या "Just a moment…" लिखा होता है, और एक लोडिंग बार या Cloudflare लोगो।

Turnstile के विपरीत — जो एक छोटा विजेट होता है जो पेज के अंदर एम्बेड किया जाता है — Cloudflare Challenge पूरी साइट पे प्रभाव डालता है। आप तब तक कोई सामग्री देख नहीं सकते जब तक यह पूरा नहीं हो जाता।

Cloudflare Challenge Cloudflare Turnstile
यह कहाँ दिखाई देता है पूरी पेज इंटरस्टीशियल — साइट तक पूरी तरह से पहुँच रोकता है पेज के अंदर एम्बेडेड विजेट (जैसे, लॉगिन फॉर्म)
कैसा दिखता है "Verifying your browser…" लोडिंग स्क्रीन फॉर्म में एक छोटा चेकबॉक्स या अदृश्य विजेट
इसे कौन जोड़ता है सुरक्षा नियमों के आधार पर Cloudflare अपने आप जोड़ता है वेबसाइट मालिक इसे अपने HTML में एम्बेड करता है
हल करने का तरीका AntiCloudflareTask — प्रॉक्सी आवश्यक AntiTurnstileTaskProxyLess — प्रॉक्सी नहीं चाहिए
वापस मिलने वाली कूकी cf_clearance (डोमेन-विशिष्ट, IP बाउंड) Turnstile टोकन (कम समय के लिए, एक बार प्रयोग में आता है)
क्या प्रॉक्सी आवश्यक है? हाँ — हल करते समय और फेच करते समय समान IP इस्तेमाल होना चाहिए नहीं

यदि आप फॉर्म के अंदर एम्बेडेड चेकबॉक्स या विजेट देखते हैं, तो वह Turnstile है — यह Challenge नहीं। यदि आपको संदेह हो तो CapSolver की मार्गदर्शिका चैलेंज प्रकार पहचानने पर देखें।


क्यों मानक HTTP क्लाइंट्स विफल होते हैं

यहाँ समस्या है जिसे अधिकांश गाइड छोड़ देते हैं: Cloudflare आपका TLS फिंगरप्रिंट जांचता है, सिर्फ आपकी कुकीज़ नहीं।

जब ब्राउज़र HTTPS के ज़रिए एक वेबसाइट से कनेक्ट करता है, तो यह TLS ClientHello भेजता है जिसमें उसके समर्थित साइफर सूट, एक्सटेंशन, और सेटिंग्स का विवरण होता है। Cloudflare इस फिंगरप्रिंट (जिसे JA3 या JA4 फिंगरप्रिंट कहा जाता है) को रिकॉर्ड करता है और इसे ज्ञात ब्राउज़र प्रोफाइल से तुलना करता है।

Go का net/http, Python का requests, curl, और अधिकांश HTTP लाइब्रेरीज़ के अपने अलग TLS फिंगरप्रिंट होते हैं। यदि CapSolver सफलतापूर्वक चैलेंज हल कर भी देता है और वैध cf_clearance कुकी लौटाता है, तो Cloudflare रिपीट चैलेंज या ब्लॉक कर देगा यदि अगले fetch पर कोई गैर-ब्राउज़र TLS फिंगरप्रिंट पाया गया।

समाधान: एक Go सर्वर जो httpcloak का उपयोग करता है — एक लाइब्रेरी जो असली Chrome TLS स्टैक स्पूफ़ करती है, जिसमें शामिल हैं:

  • JA3 / JA4 फिंगरप्रिंट
  • HTTP/2 SETTINGS फ्रेम्स
  • ALPN नेगोशिएशन
  • हेडर ऑर्डरिंग और मान

यह fetch को नेटवर्क स्तर पर बिल्कुल Chrome ब्राउज़र अनुरोध की तरह दिखाता है।


पूर्वापेक्षाएँ

आवश्यकता नोट्स
n8n सेल्फ-होस्टेड आवश्यक — TLS सर्वर n8n के साथ उसी मशीन पर चलना चाहिए। n8n क्लाउड इस उपयोग के लिए उपयुक्त नहीं है।
CapSolver खाता यहाँ साइन अप करें और अपनी API कुंजी प्राप्त करें
Go 1.21+ n8n सर्वर पर इंस्टॉल होना चाहिए। जांचें go version से।
रेज़िडेंशियल या मोबाइल प्रॉक्सी डेटासेंटर प्रॉक्सी अधिकांश Cloudflare-संरक्षित साइटों पर विफल होंगे। नीचे देखें Proxy Requirements।

n8n में CapSolver सेट करना

CapSolver n8n में एक आधिकारिक एकीकरण के रूप में उपलब्ध है — कोई कम्युनिटी नोड इंस्टालेशन आवश्यक नहीं।

चरण 1: प्रमाणपत्र पृष्ठ खोलें

अपने n8n इंस्टेंस पर जाएं और Settings → Credentials खोलें।

n8n प्रमाणपत्र पृष्ठ जो CapSolver खाता दिखाता है

चरण 2: CapSolver प्रमाणपत्र बनाएं

  1. ऊपर दाहिने कोने में Create credential क्लिक करें
  2. खोजें "CapSolver" और चुनें CapSolver API
  3. CapSolver डैशबोर्ड से अपनी API कुंजी दर्ज करें
  4. Allowed HTTP Request Domains को All पर छोड़ दें
  5. Save क्लिक करें

आपको हरे रंग में एक "Connection tested successfully" बैनर दिखाई देगा।

CapSolver प्रमाणपत्र कॉन्फ़िगरेशन सफल कनेक्शन परीक्षण के साथ

महत्वपूर्ण: आपके वर्कफ़्लो में प्रत्येक CapSolver नोड इस प्रमाणपत्र को संदर्भित करेगा। आपको इसे केवल एक बार बनाना है — आपके सभी सोल्वर वर्कफ़्लो एक ही प्रमाणपत्र साझा करेंगे।


चरण 1 — TLS सर्वर बनाएं

यह Go सर्वर n8n से fetch अनुरोध प्राप्त करता है और httpcloak के Chrome TLS प्रोफ़ाइल का उपयोग करके उन्हें निष्पादित करता है। यह एक छोटा, स्व-संपूर्ण बाइनरी है जिसे आप n8n के साथ चलते हैं।

स्रोत फ़ाइल बनाएं

एक निर्देशिका बनाएं और इसे main.go के रूप में सहेजें:

bash Copy
mkdir -p ~/tls-server && cd ~/tls-server
go Copy
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"strings"
	"time"

	"github.com/sardanioss/httpcloak/client"
)

type FetchRequest struct {
	URL     string            `json:"url"`
	Method  string            `json:"method"`
	Headers map[string]string `json:"headers"`
	Proxy   string            `json:"proxy"`
	Body    string            `json:"body"`
}

type FetchResponse struct {
	Status  int                 `json:"status"`
	Body    string              `json:"body"`
	Headers map[string][]string `json:"headers"`
}

type ErrorResponse struct {
	Error string `json:"error"`
}

func writeError(w http.ResponseWriter, status int, msg string) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(status)
	json.NewEncoder(w).Encode(ErrorResponse{Error: msg})
}

func fetchHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		writeError(w, http.StatusMethodNotAllowed, "only POST allowed")
		return
	}

	var req FetchRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		writeError(w, http.StatusBadRequest, "invalid JSON: "+err.Error())
		return
	}

	if req.URL == "" {
		writeError(w, http.StatusBadRequest, "url is required")
		return
	}
	if req.Method == "" {
		req.Method = "GET"
	}

	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
	defer cancel()

	c := client.NewClient("chrome-145", client.WithTimeout(60*time.Second))
	defer c.Close()

	if req.Proxy != "" {
		c.SetProxy(req.Proxy)
	}

	// Extract user-agent separately so httpcloak uses it instead of its preset value.
	headers := make(map[string][]string, len(req.Headers))
	var userAgent string
	for k, v := range req.Headers {
		lower := strings.ToLower(k)
		if lower == "user-agent" {
			userAgent = v
		} else {
			headers[k] = []string{v}
		}
	}

	var bodyReader io.Reader
	if req.Body != "" {
		bodyReader = strings.NewReader(req.Body)
	}

	hcReq := &client.Request{
		Method:    strings.ToUpper(req.Method),
		URL:       req.URL,
		Headers:   headers,
		Body:      bodyReader,
		UserAgent: userAgent,
		FetchMode: client.FetchModeNavigate,
	}

	resp, err := c.Do(ctx, hcReq)
	if err != nil {
		writeError(w, http.StatusBadGateway, "fetch failed: "+err.Error())
		return
	}

	body, err := resp.Text()
	if err != nil {
		writeError(w, http.StatusInternalServerError, "read body failed: "+err.Error())
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(FetchResponse{
		Status:  resp.StatusCode,
		Body:    body,
		Headers: resp.Headers,
	})
}

func main() {
	const port = "7878"

	mux := http.NewServeMux()
	mux.HandleFunc("/fetch", fetchHandler)
	mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		fmt.Fprint(w, `{"status":"ok"}`)
	})

	log.Printf("TLS server (httpcloak chrome-145) listening on :%s", port)
	log.Fatal(http.ListenAndServe(":"+port, mux))
}

इनिशियलाइज़ और बिल्ड करें

bash Copy
go mod init tls-server
go get github.com/sardanioss/httpcloak/client
go build -o main main.go

सर्वर चलाएं

bash Copy
./main

जांचें कि यह चल रहा है (नई टर्मिनल में)

bash Copy
curl http://localhost:7878/health

अपेक्षित: {"status":"ok"}

नोट: TLS सर्वर सेम मशीन पर आपका n8n इंस्टेंस होना चाहिए। n8n वर्कफ़्लो इसे http://localhost:7878/fetch पर कॉल करेगा। यदि आप n8n क्लाउड उपयोग कर रहे हैं, तो आपको खुद होस्टेड सेटअप की आवश्यकता होगी — यही कारण है कि Cloudflare Challenge स्क्रैपिंग के लिए self-hosted n8n जोर देकर सुझाया जाता है।


चरण 2 — n8n को localhost कॉल की अनुमति दें

डिफ़ॉल्ट रूप से, n8n HTTP Request नोड्स को localhost पतों को कॉल करने से रोकता है (SSRF सुरक्षा)। आपको इस प्रतिबंध को अक्षम करना होगा।

N8N_BLOCK_ACCESS_TO_LOCALHOST=false पर्यावरण चर जोड़ें और अपने n8n इंस्टेंस को पुनः आरंभ करें। यह इस बात पर निर्भर करता है कि आप n8n कैसे चलाते हैं:

यदि आप सीधे n8n चलाते हैं:

bash Copy
export N8N_BLOCK_ACCESS_TO_LOCALHOST=false
n8n start

यदि आप Docker का उपयोग करते हैं:

अपने docker run कमांड में -e N8N_BLOCK_ACCESS_TO_LOCALHOST=false जोड़ें, या इसे docker-compose.yml की environment सेक्शन में जोड़ें।


वर्कफ़्लो: Cloudflare Challenge सोल्वर API

यह वर्कफ़्लो एक POST एंडपॉइंट बनाता है जो Cloudflare-संरक्षित URL और प्रॉक्सी स्वीकार करता है, CapSolver के ज़रिए चैलेंज हल करता है, और कच्चा cf_clearance कुकी और userAgent लौटाता है। TLS सर्वर की कोई आवश्यकता नहीं — आपकी एप्लिकेशन fetch को संभालती है।

यह कैसे काम करता है

Copy
Webhook (POST /solver-cloudflare-challenge) → Cloudflare Challenge (CapSolver)
                                             → Format Solution → Webhook को जवाब दें

4 नोड्स, केवल वेबहुक, कोई शेड्यूल पाथ नहीं, कोई TLS सर्वर निर्भरता नहीं।

  1. Webhook — websiteURL और proxy के साथ POST अनुरोध प्राप्त करता है
  2. Cloudflare Challenge — CapSolver AntiCloudflareTask के उपयोग से चैलेंज हल करता है
  3. Format Solution — cookies ऑब्जेक्ट को कूकी स्ट्रिंग में सीरियलाइज़ करता है, continueOnFail के जरिए त्रुटियों को हैंडल करता है
  4. Webhook को जवाब दें — cf_clearance, सीरियलाइज़्ड कूकी स्ट्रिंग, और userAgent लौटाता है### नोड कॉन्फ़िगरेशन

1. वेबहुक नोड

सेटिंग मान
HTTP मेथड POST
पाथ solver-cloudflare-challenge
प्रतिक्रिया दें Response Node

यह इस एंडपॉइंट का निर्माण करता है: https://your-n8n-instance.com/webhook/solver-cloudflare-challenge

2. CapSolver नोड (Cloudflare चैलेंज)

पैरामीटर मान विवरण
ऑपरेशन Cloudflare Challenge चुनता है AntiCloudflareTask
टाइप AntiCloudflareTask पूरी पृष्ठ की Cloudflare चुनौती
वेबसाइट URL ={{ $json.body.websiteURL }} Cloudflare-से संरक्षित URL
प्रॉक्सी ={{ $json.body.proxy }} host:port:user:pass फॉर्मेट में रेसिडेंशियल प्रॉक्सी
Continue On Fail true क्रैश होने के बजाय संरचित त्रुटियाँ लौटाता है

CapSolver आपके प्रॉक्सी के माध्यम से एक वास्तविक ब्राउज़र लॉन्च करता है, लक्ष्य URL लोड करता है, और Cloudflare चुनौती को हल करता है। सफल होने पर, यह एक solution ऑब्जेक्ट लौटाता है जिसमें शामिल हैं:

  • cookies — एक ऑब्जेक्ट { cf_clearance: "..." } जिसमें क्लियरेंस कुकी होती है
  • userAgent — ब्राउज़र द्वारा हल करते समय उपयोग किया गया सटीक User-Agent स्ट्रिंग

टिप्पणी: यह फ़ील्ड websiteURL है (न कि targetURL) — जो अन्य सभी Solver APIs और CapSolver नोड द्वारा उपयोग किए गए फ़ील्ड नाम से मेल खाता है।

3. समाधान स्वरूपित करें (कोड नोड)

यह नोड जरूरी है क्योंकि AntiCloudflareTask cookies को एक ऑब्जेक्ट ({ cf_clearance: "..." }) के रूप में लौटाता है, न कि reCAPTCHA या Turnstile की तरह एक साधारण टोकन स्ट्रिंग। यह कुकी को सीरियलाइज़ करता है, cf_clearance निकालता है, और अगर CapSolver विफल हुआ तो संरचित त्रुटि लौटाता है।

javascript Copy
const input = $input.first().json;

if (input.error || !input.data || !input.data.solution) {
  const errorMsg = input.error
    ? (input.error.message || JSON.stringify(input.error))
    : 'No solution returned — site may not be showing a challenge';
  return [{ json: { success: false, error: errorMsg } }];
}

const solution = input.data.solution;
const cookies = solution.cookies;
const cfClearance = (cookies && typeof cookies === 'object')
  ? (cookies.cf_clearance || '') : '';
const cookieString = (cookies && typeof cookies === 'object')
  ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')
  : (cookies || '');

return [{ json: {
  success: true,
  cf_clearance: cfClearance,
  cookies: cookieString,
  userAgent: solution.userAgent || '',
  solvedAt: new Date().toISOString()
}}];

4. वेबहुक को प्रतिक्रिया दें

सेटिंग मान
प्रतिक्रिया के साथ उत्तर दें JSON
प्रतिक्रिया बॉडी ={{ JSON.stringify($json) }}

इसे टेस्ट करें

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/solver-cloudflare-challenge \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://protected-site.com",
    "proxy": "host:port:user:pass"
  }'

सफल प्रतिक्रिया:

json Copy
{
  "success": true,
  "cf_clearance": "abc123...",
  "cookies": "cf_clearance=abc123...",
  "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/145.0.0.0 ...",
  "solvedAt": "2026-03-11T12:00:00.000Z"
}

विफल प्रतिक्रिया (कोई चुनौती नहीं मिली, खराब प्रॉक्सी, आदि):

json Copy
{
  "success": false,
  "error": "No solution returned — site may not be showing a challenge"
}

इस वर्कफ़्लो को इम्पोर्ट करें

नीचे दिया गया JSON कॉपी करें और n8n में Menu → Import from JSON के माध्यम से इम्पोर्ट करें। इम्पोर्ट करने के बाद, Cloudflare Challenge नोड में अपने CapSolver क्रेडेंशियल का चयन करें।

वर्कफ़्लो JSON विस्तृत करने के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Cloudflare Challenge \u2014 Solver API\n\n### How it works\n\n1. Receives a request via webhook to solve a Cloudflare challenge.\n2. Uses the Cloudflare Challenge node to attempt solving the challenge.\n3. Formats the solved challenge token via custom code.\n4. Responds back to the original request with the solved token.\n\n### Setup steps\n\n- [ ] Configure the Webhook node to receive requests.\n- [ ] Set up CapSolver credentials to enable solving Cloudflare challenges.\n- [ ] Ensure the Response node is properly configured to send back the solved token.\n\n### Customization\n\nYou can customize the code in the 'Format Solution' node to change the formatting of the solved token response.",
        "width": 480,
        "height": 672
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -816,
        -128
      ],
      "id": "254f3829-0e6e-4ae3-bf83-85851be9a7bc",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Receive and solve challenge\n\nTriggers on a new request and attempts to solve the Cloudflare challenge.",
        "width": 512,
        "height": 304,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -256,
        -128
      ],
      "id": "44e79738-a2f0-41ec-8ff0-514afbd6cc45",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## Format and return solution\n\nFormats the solution and responds back with the solved token.",
        "width": 496,
        "height": 304,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        352,
        -128
      ],
      "id": "fc40112d-389d-4d4e-8872-af2ae533c513",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "solver-cloudflare-challenge",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -208,
        0
      ],
      "id": "cf770001-7777-7777-7777-777777777701",
      "name": "Receive Solver Request",
      "webhookId": "cf770001-aaaa-bbbb-cccc-777777777701",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "proxy": "={{ $json.body.proxy }}",
        "userAgent": "={{ $json.body.userAgent }}",
        "html": "={{ $json.body.html }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        112,
        0
      ],
      "id": "cf770001-7777-7777-7777-777777777702",
      "name": "Cloudflare Challenge",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const input = $input.first().json;\n\nif (input.error || !input.data || !input.data.solution) {\n  const errorMsg = input.error\n    ? (input.error.message || JSON.stringify(input.error))\n    : 'No solution returned \u2014 site may not be showing a challenge';\n  return [{ json: { success: false, error: errorMsg } }];\n}\n\nconst solution = input.data.solution;\nconst cookies = solution.cookies;\nconst cfClearance = (cookies && typeof cookies === 'object') ? (cookies.cf_clearance || '') : '';\nconst cookieString = (cookies && typeof cookies === 'object')\n  ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n  : (cookies || '');\n\nreturn [{ json: {\n  success: true,\n  cf_clearance: cfClearance,\n  cookies: cookieString,\n  userAgent: solution.userAgent || '',\n  solvedAt: new Date().toISOString()\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        400,
        0
      ],
      "id": "cf770001-7777-7777-7777-777777777703",
      "name": "Format Solution"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        700,
        0
      ],
      "id": "cf770001-7777-7777-7777-777777777704",
      "name": "Return Solved Token"
    }
  ],
  "connections": {
    "Receive Solver Request": {
      "main": [
        [
          {
            "node": "Cloudflare Challenge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cloudflare Challenge": {
      "main": [
        [
          {
            "node": "Format Solution",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Solution": {
      "main": [
        [
          {
            "node": "Return Solved Token",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}

वर्कफ़्लो: Cloudflare Challenge समाधानों का उपयोग करना

उपरोक्त Solver API दिखाता है कि कैसे एक हल किया गया cf_clearance कुकी और userAgent प्राप्त करें। लेकिन आप वास्तव में उनके साथ क्या करते हैं?

reCAPTCHA या Turnstile के विपरीत जहां आप फॉर्म फ़ील्ड में टोकन सबमिट करते हैं, Cloudflare Challenge एक कुकी (cf_clearance) लौटाता है जिसे हर बाद के अनुरोध पर हेडर के रूप में भेजना ज़रूरी है। यह कुकी उस प्रॉक्सी IP और User-Agent से बंधी होती है जो चुनौती हल करते समय उपयोग किए गए थे — दोनों को बिल्कुल मेल खाना चाहिए।

यहाँ सामान्य पैटर्न है:

  1. Cloudflare Challenge हल करें → CapSolver से cf_clearance कुकी और userAgent प्राप्त करें
  2. अनुरोध तैयार करें → कुकी, मेल खाता User-Agent, और Chrome जैसी sec-ch-ua हेडर के साथ हेडर बनाएं
  3. TLS सर्वर के माध्यम से फ़ेच करें → http://localhost:7878/fetch के ज़रिये अनुरोध भेजें ताकि Chrome के TLS फ़िंगरप्रिंट से मेल खाए
  4. प्रतिक्रिया सत्यापित करें → जांचें कि साइट ने असली सामग्री (स्टेटस 200 और HTML) वापस की है या पुनः चुनौती पेज
  5. परिणाम संसाधित करें → HTML नोड, Edit Fields या कोड नोड का उपयोग करके ज़रूरी डेटा निकालें

मुख्य अवधारणा: मानक HTTP क्लाइंट यहां विफल हो जाते हैं, भले ही उनके पास वैध cf_clearance कुकी हो — Cloudflare TLS हैंडशेक का स्वयं फ़िंगरप्रिंट करता है। Go TLS सर्वर (httpcloak) नेटवर्क स्तर पर फ़ेच को ठीक Chrome जैसा दिखाता है। हर वर्कफ़्लो जो Cloudflare-से संरक्षित पृष्ठ को फ़ेच करता है, उसे TLS सर्वर के माध्यम से जाना चाहिए।### उदाहरण: Cloudflare चुनौती स्क्रेपर

n8n में शेड्यूल और वेबहुक पथ के साथ Cloudflare चुनौती वर्कफ़्लो

वर्कफ़्लो प्रवाह

शेड्यूल पथ:

Copy
हर 6 घंटे → लक्षित कॉन्फ़िग सेट करें [Schedule] → Cloudflare चुनौती हल करें
           → TLS अनुरोध तैयार करें → TLS सर्वर के माध्यम से प्राप्त करें → परिणाम निकालें

वेबहुक पथ:

Copy
वेबहुक ट्रिगर → लक्षित कॉन्फ़िग सेट करें [Webhook] → Cloudflare चुनौती हल करें
               → TLS अनुरोध तैयार करें → TLS सर्वर के माध्यम से प्राप्त करें → परिणाम निकालें → वेबहुक को प्रतिक्रिया दें

यह कैसे काम करता है

  1. लक्षित कॉन्फ़िग सेट करें — targetURL और proxy (फॉर्मैट में host:port:user:pass) को संग्रहीत करता है। शेड्यूल पथ हार्डकोडेड मानों का उपयोग करता है; वेबहुक पथ इन्हें POST बॉडी से पढ़ता है।
  2. Cloudflare चुनौती हल करें — CapSolver नोड onError: "continueRegularOutput" के साथ — तब भी जारी रहता है जब पृष्ठ वर्तमान में चुनौती नहीं दिखा रहा हो।
  3. TLS अनुरोध तैयार करें — कोड नोड जो host:port:user:pass प्रॉक्सी को http://user:pass@host:port URL फॉर्मेट में परिवर्तित करता है, solution.cookies को कूकी हेडर स्ट्रिंग में अनुक्रमित करता है, और सॉल्व से सटीक userAgent के साथ Chrome जैसे अनुरोध हेडर बनाता है।
  4. TLS सर्वर के माध्यम से प्राप्त करें — HTTP अनुरोध http://localhost:7878/fetch को उपयोग करता है contentType: "raw" (न "json" - n8n का JSON मोड बॉडी को भ्रष्ट कर देता है)।
  5. परिणाम निकालें — TLS सर्वर प्रतिक्रिया से status, body, और fetchedAt खींचता है।
  6. वेबहुक को प्रतिक्रिया दें — परिणाम को JSON के रूप में लौटाता है (सिर्फ वेबहुक पथ के लिए)।

क्यों contentType: "raw" और न कि "json"? n8n का json कंटेंट टाइप मोड बॉडी पैरामीटर को key-value जोड़े के रूप में अपेक्षित करता है। यदि आप JSON.stringify($json) को स्ट्रिंग के रूप में पास करते हैं, तो n8n पूरे स्ट्रिंग को एक गलत फॉर्मेटेड पैरामीटर के रूप में मानता है और सर्वर को {"": ""} भेजता है। raw मोड उपयोग करने पर बॉडी ठीक उसी तरह भेजी जाती है जैसे अभिव्यक्ति निष्पादित होती है।

वर्कफ़्लो JSON विस्तार करने के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Cloudflare Challenge \u2014 CapSolver + Schedule + Webhook\n\n### How it works\n\n1. Triggers schedule every 6 hours to solve Cloudflare challenges.\n2. Webhook triggers on request to solve Cloudflare challenges.\n3. Sets target and proxy configuration for requests.\n4. Solves the Cloudflare challenge using CapSolver.\n5. Sends results via TLS and processes the HTTP response.\n\n### Setup steps\n\n- Ensure CapSolver credentials are configured.\n- Confirm webhook URL is set and accessible.\n- Check schedule configuration for every 6 hours trigger.\n- Verify endpoint http://localhost:7878/fetch is available.\n\n### Customization\n\nConsider customizing the target URL or proxy settings within the set nodes.",
        "width": 480,
        "height": 688
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1008,
        -112
      ],
      "id": "3c1c3e96-631a-4cf6-bbff-85fd8b1a01e8",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Scheduled Cloudflare challenge\n\nTriggered every 6 hours to solve Cloudflare challenge.",
        "width": 1696,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -448,
        -112
      ],
      "id": "e9187404-7818-4233-af66-091c90a40476",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## Webhook Cloudflare challenge\n\nRespond to solver requests via webhook to solve Cloudflare challenge.",
        "width": 2000,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -448,
        304
      ],
      "id": "b5d5ba23-8ed2-4afb-8113-3fa8f2fba51e",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -400,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111101",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-s-001",
              "name": "targetURL",
              "value": "https://www.listaspam.com/busca.php?Telefono=671484239",
              "type": "string"
            },
            {
              "id": "cfg-s-002",
              "name": "proxy",
              "value": "YOUR_PROXY_HOST:PORT:USER:PASS",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -96,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111102",
      "name": "Set Target Config [Schedule]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        208,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111103",
      "name": "Solve Cloudflare Challenge [Schedule]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Target Config [Schedule]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'none',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.targetURL,\n  method: 'GET',\n  proxy: toProxyURL(config.proxy),\n  headers\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        512,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111104",
      "name": "Prepare TLS Request [Schedule]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        800,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111105",
      "name": "Fetch via TLS Server [Schedule]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "out-s-001",
              "name": "status",
              "value": "={{ $json.status }}",
              "type": "number"
            },
            {
              "id": "out-s-002",
              "name": "body",
              "value": "={{ $json.body }}",
              "type": "string"
            },
            {
              "id": "out-s-003",
              "name": "fetchedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1104,
        0
      ],
      "id": "cf111111-1111-1111-1111-111111111106",
      "name": "Extract Result [Schedule]"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "cloudflare-scraper",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111107",
      "name": "Receive Solver Request",
      "webhookId": "cf111111-aaaa-bbbb-cccc-111111111107",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-w-001",
              "name": "targetURL",
              "value": "={{ $json.body.targetURL }}",
              "type": "string"
            },
            {
              "id": "cfg-w-002",
              "name": "proxy",
              "value": "={{ $json.body.proxy }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -96,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111108",
      "name": "Set Target Config [Webhook]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        208,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111109",
      "name": "Solve Cloudflare Challenge [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Target Config [Webhook]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'none',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.targetURL,\n  method: 'GET',\n  proxy: toProxyURL(config.proxy),\n  headers\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        512,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111110",
      "name": "Prepare TLS Request [Webhook]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        800,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111111",
      "name": "Fetch via TLS Server [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "out-w-001",
              "name": "status",
              "value": "={{ $json.status }}",
              "type": "number"
            },
            {
              "id": "out-w-002",
              "name": "body",
              "value": "={{ $json.body }}",
              "type": "string"
            },
            {
              "id": "out-w-003",
              "name": "fetchedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1104,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111112",
      "name": "Extract Result [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1408,
        420
      ],
      "id": "cf111111-1111-1111-1111-111111111113",
      "name": "Return Solved Token"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Set Target Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Schedule]": {
      "main": [
        [
          {
            "node": "Prepare TLS Request [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Request [Schedule]": {
      "main": [
        [
          {
            "node": "Fetch via TLS Server [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch via TLS Server [Schedule]": {
      "main": [
        [
          {
            "node": "Extract Result [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Solver Request": {
      "main": [
        [
          {
            "node": "Set Target Config [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Config [Webhook]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Webhook]": {
      "main": [
        [
          {
            "node": "Prepare TLS Request [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Request [Webhook]": {
      "main": [
        [
          {
            "node": "Fetch via TLS Server [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch via TLS Server [Webhook]": {
      "main": [
        [
          {
            "node": "Extract Result [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Result [Webhook]": {
      "main": [
        [
          {
            "node": "Return Solved Token",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}

---## वर्कफ़्लो: उपयोग-मामला उदाहरण

उपर्युक्त Solver API और स्क्रैपर उदाहरण मुख्य पैटर्न दिखाते हैं: चुनौती को हल करें, समाधान का उपयोग करके TLS के माध्यम से डेटा प्राप्त करें। निम्नलिखित वर्कफ़्लो इस पैटर्न का विस्तार करते हैं उत्पादन-तैयार उपयोग-मामलों के लिए — प्रत्येक में द्वैतीय ट्रिगर (शेड्यूल + वेबहुक), स्थायी स्थिति ट्रैकिंग, और संरचित आउटपुट शामिल है। प्रत्येक के लिए समान पूर्वापेक्षाएँ आवश्यक हैं: एक स्व-होस्टेड n8n इंस्टेंस, पोर्ट 7878 पर चलने वाला TLS सर्वर, एक आवासीय प्रॉक्सी, और एक CapSolver क्रेडेंशियल।

वर्कफ़्लो उद्देश्य
Cloudflare Challenge Scraping — Price & Product Details — CapSolver + Schedule + Webhook हर 6 घंटे में एक CF-संरक्षित पेज से कीमत और उत्पाद का नाम स्क्रैप करता है, पिछले मूल्यों की तुलना करता है, परिवर्तनों पर चेतावनी देता है
Cloudflare Challenge Account Login — CapSolver + Schedule + Webhook पहले चुनौती को हल करके, फिर TLS सर्वर के माध्यम से क्रेडेंशियल्स POST करके आपके अपने CF-संरक्षित साइट खाते में लॉग इन करता है
Turnstile — Solver API एक वेबहुक एक्सपोज़ करता है जो Turnstile को हल करता है और टोकन लौटाता है — प्रॉक्सी या TLS सर्वर की आवश्यकता नहीं
Turnstile Scraping — Price & Product Monitor Turnstile को हल करता है, टोकन के साथ एक उत्पाद पेज प्राप्त करता है, कीमत और नाम निकालता है, और परिवर्तनों पर चेतावनी देता है
Turnstile Account Login पहले चुनौती को हल करके, फिर टोकन के साथ क्रेडेंशियल्स POST करके अपने Turnstile-संरक्षित साइट खाते में लॉग इन करता है — प्रॉक्सी या TLS सर्वर की आवश्यकता नहीं

यह वर्कफ़्लो हर 6 घंटे (शेड्यूल) या मांग पर (वेबहुक) एक उत्पाद पृष्ठ को स्क्रैप करता है, HTML नोड का उपयोग करके मूल्य निकालता है, और इसे पूर्व में संग्रहीत मूल्य के साथ तुलना करता है।

शेड्यूल पथ:

Copy
हर 6 घंटे → लक्ष्य कॉन्फ़िग सेट करें → CF चुनौती हल करें → TLS अनुरोध तैयार करें
           → TLS सर्वर के माध्यम से फ़ेच करें → डेटा निकालें → डेटा की तुलना करें
           → डेटा बदला? → अलर्ट बनाएं / कोई बदलाव नहीं

त्रुटि हैंडलिंग: यदि CapSolver विफल रहता है, तो वर्कफ़्लो बिना कुकीज़ के जारी रहता है (continueOnFail के माध्यम से)। TLS सर्वर से फ़ेच अभी भी सफल हो सकता है यदि पृष्ठ वर्तमान में चुनौती नहीं दिखा रहा है।

मुख्य व्यवहार:

  • dataPropertyName: "body" (ना कि "data") का उपयोग करता है क्योंकि TLS सर्वर { status, body, headers } लौटाता है
  • HTML नोड CSS सेलेक्टर (.product-price, h1) के माध्यम से मूल्य और उत्पाद नाम निकालता है
  • $workflow.staticData.lastPrice पिछला मूल्य निष्पादन के बीच बनाए रखता है
  • मूल्य तुलना दोनों गिरावट (गंभीरता: deal) और बढ़ोतरी (गंभीरता: info) का पता लगाती है
  • प्रॉक्सी फ़ॉर्मेट ऑटो-कन्वर्शन: host:port:user:pass → http://user:pass@host:port toProxyURL() हेल्पर के माध्यम से
पूर्ण वर्कफ़्लो JSON विस्तार के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## क्लाउडफ़्लेर चुनौती स्क्रैपिंग — मूल्य और उत्पाद विवरण — CapSolver + शेड्यूल + वेबहुक\n\n### यह कैसे काम करता है\n\n1. ट्रिगर्स लक्षित वेबसाइट को समय-समय पर जांचने या बाहरी वेबहुक के जवाब में सेट किए जाते हैं।\n2. लक्ष्य URL और प्रॉक्सी के लिए कॉन्फ़िगरेशन लागू किए जाते हैं।\n3. वेबसाइट सुरक्षा को नेविगेट करने के लिए क्लाउडफ़्लेर चुनौतियाँ हल की जाती हैं।\n4. लक्ष्य सर्वर से डेटा प्राप्त करने के लिए सुरक्षित अनुरोध किए जाते हैं।\n5. निकाला गया डेटा परिवर्तन की जांच के लिए तुलना किया जाता है।\n6. पहचानी गई परिवर्तनों के आधार पर अलर्ट बनाए जाते हैं और भेजे जाते हैं या डेटा लौटाया जाता है।\n\n### सेटअप चरण\n\n- [ ] 'Set Target Config' नोड्स में URL और प्रॉक्सी सेटिंग्स कॉन्फ़िगर करें।\n- [ ] क्लाउडफ़्लेर चुनौतियाँ हल करने के लिए CapSolver क्रेडेंशियल कनेक्ट करें।\n- [ ] बाहरी अनुरोध प्राप्त करने के लिए वेबहुक URL सही तरीके से कॉन्फ़िगर करें।\n\n### अनुकूलन\n\nमॉनिटरिंग आवृत्ति को समायोजित करने के लिए, 'हर 6 घंटे' नोड या वेबहुक ट्रिगर सेटिंग्स में अंतराल संशोधित करें।",
        "width": 480,
        "height": 896
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1104,
        -192
      ],
      "id": "85c55c3d-335a-47e5-8721-82fa4d633033",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## शेड्यूल्ड ट्रिगर सेटअप\n\nडेटा स्क्रैपिंग प्रक्रिया को शुरू करने के लिए हर 6 घंटे शेड्यूलिंग को इनिशियलाइज़ करता है।",
        "width": 1392,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -544,
        -112
      ],
      "id": "6ac3bd35-66ef-43ed-a8b5-5d5f6d367fba",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## अनुसूचित डेटा प्रोसेसिंग\n\nशेड्यूल द्वारा ट्रिगर होने के बाद डेटा निकासी, तुलना और अलर्ट निर्माण को संभालता है।",
        "width": 1088,
        "height": 480,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        960,
        -192
      ],
      "id": "a1c60513-ed8b-43f2-bff3-a7b19436337f",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## वेबहुक ट्रिगर सेटअप\n\nस्क्रैपिंग प्रक्रिया शुरू करने के लिए वेबहुक के माध्यम से बाहरी अनुरोधों की निगरानी करता है।",
        "width": 1392,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -544,
        384
      ],
      "id": "ee4d9a0d-3233-4b70-828b-078c9eee0086",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "## वेबहुक डेटा प्रोसेसिंग और प्रतिक्रिया\n\nवेबहुक ट्रिगर से डेटा निकालता है और तुलना करता है; परिवर्तनों के आधार पर प्रतिक्रियाएँ लौटाता है।",
        "width": 1392,
        "height": 480,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        960,
        336
      ],
      "id": "4ad55fbf-2882-4c63-9e09-37e674b00145",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -500,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333301",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-s-001",
              "name": "targetURL",
              "value": "https://YOUR_CF_PROTECTED_SITE.com/product-page",
              "type": "string"
            },
            {
              "id": "cfg-s-002",
              "name": "proxy",
              "value": "YOUR_PROXY_HOST:PORT:USER:PASS",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -200,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333302",
      "name": "Set Target Config [Schedule]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        100,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333303",
      "name": "Solve Cloudflare Challenge [Schedule]",
      "onError": "continueRegularOutput",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Target Config [Schedule]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, जैसे Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'none',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.targetURL,\n  method: 'GET',\n  proxy: toProxyURL(config.proxy),\n  headers\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        400,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333304",
      "name": "Prepare TLS Request [Schedule]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        700,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333305",
      "name": "Fetch via TLS Server [Schedule]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        1000,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333306",
      "name": "Extract Data"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1300,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333307",
      "name": "Compare Data"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-001",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        1600,
        0
      ],
      "id": "cf333333-3333-3333-3333-333333333308",
      "name": "Data Changed?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-001",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-002",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1900,
        -80
      ],
      "id": "cf333333-3333-3333-3333-333333333309",
      "name": "Build Alert"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-001",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-002",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1900,
        128
      ],
      "id": "cf333333-3333-3333-3333-333333333310",
      "name": "No Change"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "cloudflare-price-monitor",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -500,
        500
      ],
      "id": "cf333333-3333-3333-3333-333333333311",
      "name": "Receive Monitor Request",
      "webhookId": "cf333333-aaaa-bbbb-cccc-333333333311",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-w-001",
              "name": "targetURL",
              "value": "={{ $json.body.targetURL }}",
              "type": "string"
            },
            {
              "id": "cfg-w-002",
              "name": "proxy",
              "value": "={{ $json.body.proxy }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -200,
        500
      ],
      "id": "cf333333-3333-3333-3333-333333333312",
      "name": "Set Target Config [Webhook]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}"
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        100,
        500
      ],
      "id": "cf333333-3333-3333-3333-333333333313",
      "name": "Solve Cloudflare Challenge [Webhook]",
      "onError": "continueRegularOutput",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Target Config [Webhook]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, जैसे Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'none',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.targetURL,\n  method: 'GET',\n  proxy: toProxyURL(config.proxy),\n  headers\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        400,
        500
      ],
      "id": "cf333333-3333-3333-3333-333333333314",
      "name": "Prepare TLS Request [Webhook]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        700,
        500
      ],
      "id": "cf333333-3333-3333-3333-333333333315",
      "name": "Fetch via TLS Server [Webhook]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        1008,
        528
      ],
      "id": "cf333333-3333-3333-3333-333333333316",
      "name": "Extract Data [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1296,
        528
      ],
      "id": "cf333333-3333-3333-3333-333333333317",
      "name": "Compare Data [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-002",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        1600,
        528
      ],
      "id": "cf333333-3333-3333-3333-333333333318",
      "name": "Data Changed? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-004",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-005",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1904,
        448
      ],
      "id": "cf333333-3333-3333-3333-333333333319",
      "name": "Build Alert [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-004",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-005",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1904,
        656
      ],
      "id": "cf333333-3333-3333-3333-333333333320",
      "name": "No Change [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        2208,
        528
      ],
      "id": "cf333333-3333-3333-3333-333333333321",
      "name": "Return Scraped Data"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Set Target Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Schedule]": {
      "main": [
        [
          {
            "node": "Prepare TLS Request [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Request [Schedule]": {
      "main": [
        [
          {
            "node": "Fetch via TLS Server [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch via TLS Server [Schedule]": {
      "main": [
        [
          {
            "node": "Extract Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data": {
      "main": [
        [
          {
            "node": "Compare Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data": {
      "main": [
        [
          {
            "node": "Data Changed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed?": {
      "main": [
        [
          {
            "node": "Build Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Monitor Request": {
      "main": [
        [
          {
            "node": "Set Target Config [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Config [Webhook]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Webhook]": {
      "main": [
        [
          {
            "node": "Prepare TLS Request [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Request [Webhook]": {
      "main": [
        [
          {
            "node": "Fetch via TLS Server [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch via TLS Server [Webhook]": {
      "main": [
        [
          {
            "node": "Extract Data [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data [Webhook]": {
      "main": [
        [
          {
            "node": "Compare Data [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data [Webhook]": {
      "main": [
        [
          {
            "node": "Data Changed? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed? [Webhook]": {
      "main": [
        [
          {
            "node": "Build Alert [Webhook]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Alert [Webhook]": {
      "main": [
        [
          {
            "node": "Return Scraped Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "No Change [Webhook]": {
      "main": [
        [
          {
            "node": "Return Scraped Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}
### उदाहरण 2: अकाउंट लॉगिन

यह वर्कफ़्लो Cloudflare-से सुरक्षित साइट में लॉगिन को स्वचालित करता है। एक Set Login Config नोड सभी पैरामीटर को केंद्रीकृत करता है — [Schedule] अनुसूची पथ के लिए और [Webhook] ऑन-डिमांड वेबहुक पथ के लिए।

अनुसूची पथ:

Copy
हर 24 घंटे → Set Login Config → Solve CF Challenge
              → Prepare TLS Login Request → Submit Login via TLS Server
              → Login Successful? → Mark Success / Mark Failed

त्रुटि प्रबंधन: यदि CapSolver विफल होता है, तो वर्कफ़्लो बिना कुकीज़ (continueOnFail के माध्यम से) जारी रहता है। लॉगिन अनुरोध संभवतः विफल होगा, जिसे Login Successful? नोड पकड़ता है।

मुख्य व्यवहार:

  • HTTP हेडर्स के रूप में cf_clearance कुकी + userAgent का उपयोग करता है (फॉर्म बॉडी में कोई टोकन नहीं — rreCAPTCHA लॉगिन के विपरीत जो g-recaptcha-response प्रस्तुत करता है)
  • URLSearchParams के माध्यम से फॉर्म फ़ील्ड — साइट से मेल खाने के लिए Set Login Config में फ़ील्ड नाम (usernameField, passwordField) संपादित करें
  • Login Successful? जांच करता है status < 400 और प्रतिक्रिया बॉडी में successMarker
  • वेबहुक पथ JSON के रूप में परिणाम लौटाता है via Respond to Webhook
पूर्ण वर्कफ़्लो JSON दिखाने के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Cloudflare Challenge Account Login \u2014 CapSolver + Schedule + Webhook\n\n### How it works\n\n1. Schedule a login process every 24 hours and solve the Cloudflare challenge.\n2. Prepare and submit a TLS login request when initiated by schedule.\n3. Handle success or failure of the scheduled login including logging results.\n4. Receive login requests via webhook and solve the Cloudflare challenge.\n5. Prepare and submit a TLS login request when initiated by webhook.\n6. Handle success or failure of the webhook login and return results.\n\n### Setup steps\n\n- [ ] Ensure Cloudflare CapSolver API credentials are configured.\n- [ ] Set up locally running TLS server at http://localhost:7878.\n- [ ] Configure webhook URL to receive login requests.\n\n### Customization\n\nAdjust scheduled intervals to meet specific frequency needs.",
        "width": 480,
        "height": 896
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1248,
        -320
      ],
      "id": "ba1d6098-8cd2-40f1-b9ae-b945303e5d12",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Scheduled login start\n\nStarts the login process every 24 hours as a trigger point for further actions.",
        "width": 240,
        "height": 336,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -688,
        -256
      ],
      "id": "acc8f2a2-298f-4d1b-9db7-8a98fe626abb",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## Scheduled login workflow\n\nHandles the Cloudflare challenge, prepares and submits the login request, and checks if it was successful every 24 hours.",
        "width": 1328,
        "height": 480,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -416,
        -320
      ],
      "id": "1259d9f4-0b54-4693-89af-193f3ccda6a0",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## Webhook login start\n\nAccepts login requests via webhook to start the subsequent workflow.",
        "width": 240,
        "height": 320,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -688,
        272
      ],
      "id": "e95374d2-4029-469d-8e8f-a9afb66ae2ed",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "## Webhook login workflow\n\nProcesses received webhook login requests, handles Cloudflare challenge, prepares and submits the login request, checks for success, and logs results.",
        "width": 1216,
        "height": 528,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -416,
        192
      ],
      "id": "da56a87e-6675-439a-8c65-7da631a86df1",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "## Return webhook result\n\nResponds to the initial webhook request with the result of the login attempt.",
        "width": 240,
        "height": 320,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        832,
        256
      ],
      "id": "7a3f246c-ebd5-419f-a955-b01669743b31",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 24
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -640,
        -80
      ],
      "id": "cf666666-6666-6666-6666-666666666601",
      "name": "Every 24 Hours"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-001",
              "name": "targetURL",
              "value": "https://YOUR_CF_PROTECTED_SITE.com/login",
              "type": "string"
            },
            {
              "id": "login-002",
              "name": "loginActionURL",
              "value": "https://YOUR_CF_PROTECTED_SITE.com/login",
              "type": "string"
            },
            {
              "id": "login-003",
              "name": "proxy",
              "value": "YOUR_PROXY_HOST:PORT:USER:PASS",
              "type": "string"
            },
            {
              "id": "login-004",
              "name": "usernameField",
              "value": "email",
              "type": "string"
            },
            {
              "id": "login-005",
              "name": "passwordField",
              "value": "password",
              "type": "string"
            },
            {
              "id": "login-006",
              "name": "usernameValue",
              "value": "your-email@example.com",
              "type": "string"
            },
            {
              "id": "login-007",
              "name": "passwordValue",
              "value": "YOUR_ACCOUNT_PASSWORD",
              "type": "string"
            },
            {
              "id": "login-008",
              "name": "successMarker",
              "value": "account-dashboard",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -368,
        -80
      ],
      "id": "cf666666-6666-6666-6666-666666666602",
      "name": "Set Login Config [Schedule]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -144,
        -64
      ],
      "id": "cf666666-6666-6666-6666-666666666603",
      "name": "Solve Cloudflare Challenge [Schedule]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Login Config [Schedule]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst params = new URLSearchParams();\nparams.set(config.usernameField, config.usernameValue);\nparams.set(config.passwordField, config.passwordValue);\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'content-type': 'application/x-www-form-urlencoded',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'same-origin',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.loginActionURL,\n  method: 'POST',\n  proxy: toProxyURL(config.proxy),\n  headers,\n  body: params.toString()\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        48,
        -64
      ],
      "id": "cf666666-6666-6666-6666-666666666604",
      "name": "Prepare TLS Login Request [Schedule]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        240,
        -64
      ],
      "id": "cf666666-6666-6666-6666-666666666605",
      "name": "Submit Login via TLS Server [Schedule]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "login-if-001",
              "leftValue": "={{ $json.status < 400 && String($json.body || '').includes($('Set Login Config [Schedule]').item.json.successMarker) }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        432,
        -64
      ],
      "id": "cf666666-6666-6666-6666-666666666606",
      "name": "Login Successful? [Schedule]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-010",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-011",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "login-012",
              "name": "message",
              "value": "Configured account login flow succeeded (via Cloudflare Challenge bypass)",
              "type": "string"
            },
            {
              "id": "login-013",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        768,
        -208
      ],
      "id": "cf666666-6666-6666-6666-666666666607",
      "name": "Mark Login Success [Schedule]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-014",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-015",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "login-016",
              "name": "statusCode",
              "value": "={{ $json.status }}",
              "type": "number"
            },
            {
              "id": "login-017",
              "name": "message",
              "value": "Login response did not match the configured success marker",
              "type": "string"
            },
            {
              "id": "login-018",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        768,
        0
      ],
      "id": "cf666666-6666-6666-6666-666666666608",
      "name": "Mark Login Failed [Schedule]"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "cloudflare-account-login",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -640,
        432
      ],
      "id": "cf666666-aaaa-bbbb-cccc-666666666609",
      "name": "Receive Login Request",
      "webhookId": "cf666666-aaaa-bbbb-cccc-666666666609"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-019",
              "name": "targetURL",
              "value": "={{ $json.body.targetURL }}",
              "type": "string"
            },
            {
              "id": "login-020",
              "name": "loginActionURL",
              "value": "={{ $json.body.loginActionURL }}",
              "type": "string"
            },
            {
              "id": "login-021",
              "name": "proxy",
              "value": "={{ $json.body.proxy }}",
              "type": "string"
            },
            {
              "id": "login-022",
              "name": "usernameField",
              "value": "={{ $json.body.usernameField }}",
              "type": "string"
            },
            {
              "id": "login-023",
              "name": "passwordField",
              "value": "={{ $json.body.passwordField }}",
              "type": "string"
            },
            {
              "id": "login-024",
              "name": "usernameValue",
              "value": "={{ $json.body.usernameValue }}",
              "type": "string"
            },
            {
              "id": "login-025",
              "name": "passwordValue",
              "value": "={{ $json.body.passwordValue }}",
              "type": "string"
            },
            {
              "id": "login-026",
              "name": "successMarker",
              "value": "={{ $json.body.successMarker }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -368,
        480
      ],
      "id": "cf666666-6666-6666-6666-666666666610",
      "name": "Set Login Config [Webhook]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Challenge",
        "websiteURL": "={{ $json.targetURL }}",
        "proxy": "={{ $json.proxy }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -144,
        480
      ],
      "id": "cf666666-6666-6666-6666-666666666611",
      "name": "Solve Cloudflare Challenge [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const config = $('Set Login Config [Webhook]').first().json;\nconst capResult = $input.first().json;\n\nfunction toProxyURL(proxy) {\n  if (!proxy) return '';\n  if (proxy.startsWith('http')) return proxy;\n  const parts = proxy.split(':');\n  if (parts.length === 4) {\n    return `http://${parts[2]}:${parts[3]}@${parts[0]}:${parts[1]}`;\n  }\n  return proxy;\n}\n\nlet cookieStr = '';\nlet ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36';\n\nif (capResult.data && capResult.data.solution) {\n  const solution = capResult.data.solution;\n  const cookies = solution.cookies;\n  cookieStr = cookies && typeof cookies === 'object'\n    ? Object.entries(cookies).map(([k, v]) => `${k}=${v}`).join('; ')\n    : (cookies || '');\n  if (solution.userAgent) ua = solution.userAgent;\n}\n\nconst chromeMatch = ua.match(/Chrome\\/(\\d+)/);\nconst chromeVer = chromeMatch ? chromeMatch[1] : '145';\nconst secChUa = `\"Chromium\";v=\"${chromeVer}\", \"Not A(Brand\";v=\"8\", \"Google Chrome\";v=\"${chromeVer}\"`;\n\nconst params = new URLSearchParams();\nparams.set(config.usernameField, config.usernameValue);\nparams.set(config.passwordField, config.passwordValue);\n\nconst headers = {\n  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',\n  'accept-language': 'en-US,en;q=0.9',\n  'content-type': 'application/x-www-form-urlencoded',\n  'sec-ch-ua': secChUa,\n  'sec-ch-ua-mobile': '?0',\n  'sec-ch-ua-platform': '\"Windows\"',\n  'sec-fetch-dest': 'document',\n  'sec-fetch-mode': 'navigate',\n  'sec-fetch-site': 'same-origin',\n  'sec-fetch-user': '?1',\n  'upgrade-insecure-requests': '1',\n  'user-agent': ua\n};\n\nif (cookieStr) headers['cookie'] = cookieStr;\n\nreturn [{ json: {\n  url: config.loginActionURL,\n  method: 'POST',\n  proxy: toProxyURL(config.proxy),\n  headers,\n  body: params.toString()\n}}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        48,
        480
      ],
      "id": "cf666666-6666-6666-6666-666666666612",
      "name": "Prepare TLS Login Request [Webhook]"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://localhost:7878/fetch",
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ JSON.stringify($json) }}",
        "options": {
          "timeout": 60000
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        256,
        480
      ],
      "id": "cf666666-6666-6666-6666-666666666613",
      "name": "Submit Login via TLS Server [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "login-if-002",
              "leftValue": "={{ $json.status < 400 && String($json.body || '').includes($('Set Login Config [Webhook]').item.json.successMarker) }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        448,
        496
      ],
      "id": "cf666666-6666-6666-6666-666666666614",
      "name": "Login Successful? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-028",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-029",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "login-030",
              "name": "message",
              "value": "Configured account login flow succeeded (via Cloudflare Challenge bypass)",
              "type": "string"
            },
            {
              "id": "login-031",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        640,
        320
      ],
      "id": "cf666666-6666-6666-6666-666666666615",
      "name": "Mark Login Success [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-032",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-033",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "login-034",
              "name": "statusCode",
              "value": "={{ $json.status }}",
              "type": "number"
            },
            {
              "id": "login-035",
              "name": "message",
              "value": "Login response did not match the configured success marker",
              "type": "string"
            },
            {
              "id": "login-036",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        656,
        544
      ],
      "id": "cf666666-6666-6666-6666-666666666616",
      "name": "Mark Login Failed [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        880,
        416
      ],
      "id": "cf666666-6666-6666-6666-666666666617",
      "name": "Return Login Result"
    }
  ],
  "connections": {
    "Every 24 Hours": {
      "main": [
        [
          {
            "node": "Set Login Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Login Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Schedule]": {
      "main": [
        [
          {
            "node": "Prepare TLS Login Request [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Login Request [Schedule]": {
      "main": [
        [
          {
            "node": "Submit Login via TLS Server [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Login via TLS Server [Schedule]": {
      "main": [
        [
          {
            "node": "Login Successful? [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Login Successful? [Schedule]": {
      "main": [
        [
          {
            "node": "Mark Login Success [Schedule]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Login Failed [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Login Request": {
      "main": [
        [
          {
            "node": "Set Login Config [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Login Config [Webhook]": {
      "main": [
        [
          {
            "node": "Solve Cloudflare Challenge [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Cloudflare Challenge [Webhook]": {
      "main": [
        [
          {
            "node": "Prepare TLS Login Request [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare TLS Login Request [Webhook]": {
      "main": [
        [
          {
            "node": "Submit Login via TLS Server [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Login via TLS Server [Webhook]": {
      "main": [
        [
          {
            "node": "Login Successful? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Login Successful? [Webhook]": {
      "main": [
        [
          {
            "node": "Mark Login Success [Webhook]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Login Failed [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Login Success [Webhook]": {
      "main": [
        [
          {
            "node": "Return Login Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Login Failed [Webhook]": {
      "main": [
        [
          {
            "node": "Return Login Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}
### उदाहरण 3: Turnstile — Solver API

यह वर्कफ्लो एक POST एंडपॉइंट बनाता है जो Cloudflare Turnstile चुनौती को हल करता है और टोकन लौटाता है। यह ऊपर दिए गए Cloudflare Challenge Solver API के समान है — लेकिन सरल: कोई प्रॉक्सी नहीं, कोई TLS सर्वर नहीं, सिर्फ 3 नोड।

प्रवाह:

Copy
Webhook (POST /solver-turnstile) → Solve Turnstile (CapSolver) → Respond to Webhook
  1. Webhook — websiteURL और websiteKey के साथ POST अनुरोध प्राप्त करता है
  2. Solve Turnstile — CapSolver AntiTurnstileTaskProxyLess का उपयोग करके Turnstile चुनौती को हल करता है
  3. Respond to Webhook — समाधान डेटा (जिसमें token शामिल है) लौटाता है

Cloudflare Challenge से मुख्य अंतर: Turnstile एक token स्ट्रिंग लौटाता है, न कि cf_clearance कुकी। आप इस टोकन को अगले अनुरोधों पर cf-turnstile-response हेडर (या साइट के आधार पर फॉर्म क्षेत्र) के रूप में भेजते हैं। कोई प्रॉक्सी आवश्यक नहीं है।

इसे टेस्ट करें

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/solver-turnstile \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://target-site.com/page",
    "websiteKey": "0x4AAAAAAA..."
  }'

इस वर्कफ्लो को इम्पोर्ट करें

नीचे दिया गया JSON कॉपी करें और n8n में Menu → Import from JSON के माध्यम से इम्पोर्ट करें। इम्पोर्ट करने के बाद, Solve Turnstile नोड में अपने CapSolver क्रेडेंशियल का चयन करें।

वर्कफ्लो JSON विस्तार के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Turnstile \u2014 Solver API\n\n### How it works\n\n1. Receives a solver request through a webhook.\n2. Solves the Turnstile CAPTCHA using a specialized solver node.\n3. Sends the response back via a webhook response.\n\n### Setup steps\n\n- [ ] Configure webhook URL for receiving requests.\n- [ ] Set up credentials for the capSolver node.\n- [ ] Ensure response webhook URL is correctly set up.\n\n### Customization\n\nThe solver node configuration can be adjusted to handle different types of Turnstile CAPTCHAs.",
        "width": 480,
        "height": 560
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -848,
        -80
      ],
      "id": "d52f67cb-cb00-430f-bd76-b74cf4fe6184",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## Handle solver request\n\nReceives and processes a request to solve a Turnstile CAPTCHA, then sends the result back.",
        "width": 832,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -288,
        -80
      ],
      "id": "21f62617-eaa2-41ae-8fb8-c8502f21c275",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "solver-turnstile",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -240,
        32
      ],
      "id": "ts-001",
      "name": "Receive Solver Request",
      "webhookId": "a7ef0297-8455-44bd-9305-26c179f040b5",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "Cloudflare Turnstile",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        80,
        32
      ],
      "id": "ts-002",
      "name": "Solve Turnstile",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json.data) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        400,
        32
      ],
      "id": "ts-003",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Receive Solver Request": {
      "main": [
        [
          {
            "node": "Solve Turnstile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Turnstile": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}
### उदाहरण 4: टर्नस्टाइल स्क्रैपिंग — मूल्य और उत्पाद मॉनिटर

यह वर्कफ़्लो क्लाउडफ्लेयर टर्नस्टाइल को हल करता है, हल किए गए टोकन के साथ एक उत्पाद पृष्ठ प्राप्त करता है, मूल्य और उत्पाद का नाम निकालता है, और पिछली मान के मुकाबले तुलना करता है — परिवर्तनों पर अलर्ट करता है। यह ऊपर दिए गए क्लाउडफ्लेयर चैलेंज स्क्रैपिंग उदाहरण की तरह ही डुअल-ट्रिगर पैटर्न (शेड्यूल + वेबहुक) का पालन करता है।

क्लाउडफ्लेयर चैलेंज स्क्रैपिंग से मुख्य अंतर: कोई TLS सर्वर नहीं, कोई प्रॉक्सी नहीं, कोई Prepare TLS Request कोड नोड नहीं। टर्नस्टाइल टोकन सीधे n8n के इनबिल्ट HTTP Request नोड के माध्यम से cf-turnstile-response हेडर के रूप में भेजा जाता है।

शेड्यूल पथ:

Copy
हर 6 घंटे → लक्ष्य कॉन्फ़िग सेट करें → टर्नस्टाइल हल करें → उत्पाद पृष्ठ प्राप्त करें
           → डेटा निकालें → डेटा की तुलना करें → डेटा बदला? → अलर्ट बनाएँ / कोई बदलाव नहीं

वेबहुक पथ:

Copy
वेबहुक ट्रिगर → टर्नस्टाइल हल करें → उत्पाद पृष्ठ प्राप्त करें
                 → डेटा निकालें → डेटा की तुलना करें → डेटा बदला? → अलर्ट बनाएँ / कोई बदलाव नहीं
                 → वेबहुक को प्रतिक्रिया दें

मुख्य व्यवहार:

  • CapSolver ऑपरेशन Cloudflare Turnstile है (न कि Cloudflare Challenge) — नीचे AntiTurnstileTaskProxyLess का उपयोग करता है
  • टोकन को फ़ेच अनुरोध पर cf-turnstile-response हेडर के रूप में भेजा जाता है
  • प्रॉक्सी फॉर्मेट कनवर्ज़न की आवश्यकता नहीं — टर्नस्टाइल हल करने में प्रॉक्सी का उपयोग नहीं होता
  • मानक n8n HTTP Request नोड — कोई TLS सर्वर आवश्यक नहीं क्योंकि कोई cf_clearance कुकी फिंगरप्रिंट मैचिंग के लिए नहीं है
  • चैलेंज संस्करण के समान मूल्य तुलना तर्क: $workflow.staticData.lastPrice क्रॉस-एक्ज़िक्यूशन परसेवेंस के लिए
  • वेबहुक पथ में websiteURL और websiteKey सीधे POST बॉडी से पढ़े जाते हैं (कोई Set Target Config नोड आवश्यक नहीं)
वर्कफ़्लो JSON विस्तार के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## टर्नस्टाइल स्क्रैपिंग — मूल्य और उत्पाद मॉनिटर\n\n### यह कैसे काम करता है\n\n1. वर्कफ़्लो हर 6 घंटे या वेबहुक के माध्यम से ट्रिगर होता है।\n2. लक्ष्य विन्यास सेट किया जाता है जिसमें वेबसाइट URL और कुंजी शामिल हैं।\n3. टर्नस्टाइल कैप्चा हल किया जाता है ताकि उत्पाद पृष्ठ तक पहुंच सके।\n4. उत्पाद डेटा प्राप्त किया जाता है और प्रासंगिक डेटा निकाला जाता है।\n5. निकाले गए डेटा की पिछली डेटा से तुलना की जाती है ताकि परिवर्तनों की पहचान हो सके।\n6. परिवर्तनों के होने पर अलर्ट उत्पन्न किए जाते हैं, और वेबहुक अनुरोधों के लिए प्रतिक्रिया भेजी जाती है।\n\n### सेटअप चरण\n\n- [ ] आवश्यकतानुसार शेड्यूल ट्रिगर अंतराल कॉन्फ़िगर करें।\n- [ ] रियल-टाइम ट्रिगरिंग के लिए वेबहुक URL सेट करें।\n- [ ] सुनिश्चित करें कि कैप्चा सॉल्वर के क्रेडेंशियल्स मान्य हैं।\n- [ ] लक्ष्य वेबसाइट URL और उत्पाद कुंजी कॉन्फ़िगर करें।\n\n### अनुकूलन\n\nमॉनिटरिंग आवश्यकताओं के अनुसार शेड्यूल ट्रिगर का अंतराल समायोजित किया जा सकता है।",
        "width": 480,
        "height": 896
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1184,
        -240
      ],
      "id": "1824aba9-471e-4052-912e-888d939349df",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## शेड्यूल्ड स्क्रैपिंग ट्रिगर\n\nयह वर्कफ़्लो को हर 6 घंटे चालू करता है और लक्ष्य कॉन्फ़िगरेशन सेट करता है।",
        "width": 512,
        "height": 304,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -624,
        -80
      ],
      "id": "89b7d6a2-b4bf-4a7d-8667-ce3f31d2eb92",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## शेड्यूल्ड कैप्चा और फेच\n\nशेड्यूल के आधार पर कैप्चा हल करता है और उत्पाद पृष्ठ डेटा प्राप्त करता है।",
        "width": 1472,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        16,
        -64
      ],
      "id": "f39fc94b-d0ae-4141-9491-fa82702a72fc",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "## शेड्यूल डेटा मूल्यांकन\n\nनए प्राप्त डेटा की पिछली तुलना करता है और परिवर्तनों पर अलर्ट बनाता है।",
        "width": 240,
        "height": 528,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1536,
        -240
      ],
      "id": "0d31be95-f94c-40fd-99cd-7d988109d3f4",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "## वेबहुक स्क्रैपिंग ट्रिगर\n\nरीयल-टाइम अपडेट के लिए वेबहुक द्वारा स्क्रैपिंग वर्कफ़्लो को ट्रिगर करता है।",
        "width": 240,
        "height": 352,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -624,
        256
      ],
      "id": "e4a50f47-180c-484e-bf70-09a46543e01b",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "## वेबहुक कैप्चा और फेच\n\nवेबहुक ट्रिगर के लिए कैप्चा हल करता है और उत्पाद पृष्ठ डेटा प्राप्त करता है।",
        "width": 1472,
        "height": 272,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        16,
        336
      ],
      "id": "1167cf0e-d561-40fa-b366-331a20d99a31",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "content": "## वेबहुक डेटा मूल्यांकन और प्रतिक्रिया\n\nडेटा परिवर्तनों का मूल्यांकन करता है और परिणामों के साथ वेबहुक को प्रतिक्रिया देता है।",
        "width": 672,
        "height": 432,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        1536,
        320
      ],
      "id": "0dab95b9-d762-43cf-9a11-b92212a8c2a7",
      "name": "Sticky Note6"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -576,
        48
      ],
      "id": "ts-s-01",
      "name": "हर 6 घंटे"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "websiteURL",
              "value": "https://YOUR-TARGET-SITE.com/product-page",
              "type": "string"
            },
            {
              "id": "cfg-002",
              "name": "websiteKey",
              "value": "YOUR_SITE_KEY_HERE",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -256,
        48
      ],
      "id": "ts-s-02",
      "name": "लक्ष्य कॉन्फ़िग सेट करें [शेड्यूल]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Turnstile",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        64,
        48
      ],
      "id": "ts-s-03",
      "name": "टर्नस्टाइल हल करें",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver खाता"
        }
      }
    },
    {
      "parameters": {
        "url": "={{ $('Set Target Config [Schedule]').first().json.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, जैसे Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "cf-turnstile-response",
              "value": "={{ $json.data.solution.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        384,
        48
      ],
      "id": "ts-s-04",
      "name": "उत्पाद पृष्ठ प्राप्त करें"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price"
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        704,
        48
      ],
      "id": "ts-s-05",
      "name": "डेटा निकालें"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1072,
        48
      ],
      "id": "ts-s-06",
      "name": "डेटा की तुलना करें"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "if-1",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1344,
        48
      ],
      "id": "ts-s-07",
      "name": "डेटा बदला?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "alert",
              "value": "=मूल्य {{ $json.direction }} के लिए {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1584,
        -48
      ],
      "id": "ts-s-08",
      "name": "अलर्ट बनाएँ"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n1",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "n2",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1584,
        128
      ],
      "id": "ts-s-09",
      "name": "कोई बदलाव नहीं"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "price-monitor-turnstile",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -576,
        448
      ],
      "id": "ts-s-10",
      "name": "वेबहुक ट्रिगर",
      "webhookId": "6a4f76c7-fc5c-440d-96cb-75c9c3bebcdb",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "Cloudflare Turnstile",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        64,
        448
      ],
      "id": "ts-s-11",
      "name": "टर्नस्टाइल हल करें [W]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver खाता"
        }
      }
    },
    {
      "parameters": {
        "url": "={{ $('Webhook Trigger').item.json.body.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, जैसे Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "cf-turnstile-response",
              "value": "={{ $json.data.solution.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        384,
        448
      ],
      "id": "ts-s-12",
      "name": "उत्पाद पृष्ठ प्राप्त करें [W]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price"
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        704,
        448
      ],
      "id": "ts-s-13",
      "name": "डेटा निकालें [W]"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1040,
        448
      ],
      "id": "ts-s-14",
      "name": "डेटा की तुलना करें [W]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "if-2",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1344,
        448
      ],
      "id": "ts-s-15",
      "name": "डेटा बदला? [W]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a4",
              "name": "alert",
              "value": "=मूल्य {{ $json.direction }} के लिए {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a5",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1584,
        432
      ],
      "id": "ts-s-16",
      "name": "अलर्ट बनाएँ [W]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n4",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "n5",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1584,
        592
      ],
      "id": "ts-s-17",
      "name": "कोई बदलाव नहीं [W]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        2064,
        544
      ],
      "id": "ts-s-18",
      "name": "वेबहुक को प्रतिक्रिया दें"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Set Target Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Target Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Turnstile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Turnstile": {
      "main": [
        [
          {
            "node": "Fetch Product Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product Page": {
      "main": [
        [
          {
            "node": "Extract Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data": {
      "main": [
        [
          {
            "node": "Compare Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data": {
      "main": [
        [
          {
            "node": "Data Changed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed?": {
      "main": [
        [
          {
            "node": "Build Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve Turnstile [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Turnstile [W]": {
      "main": [
        [
          {
            "node": "Fetch Product Page [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product Page [W]": {
      "main": [
        [
          {
            "node": "Extract Data [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Data [W]": {
      "main": [
        [
          {
            "node": "Compare Data [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compare Data [W]": {
      "main": [
        [
          {
            "node": "Data Changed? [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Changed? [W]": {
      "main": [
        [
          {
            "node": "Build Alert [W]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Change [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Alert [W]": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "No Change [W]": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}
### उदाहरण 5: टर्नस्टाइल खाता लॉगिन

यह वर्कफ़्लो टर्नस्टाइल-प्रोटेक्टेड साइट में लॉगिन को स्वचालित करता है। यह क्लाउडफ्लेयर चैलेंज अकाउंट लॉगिन के समान डुअल-ट्रिगर पैटर्न (शेड्यूल + वेबहुक) का पालन करता है — लेकिन बिना TLS सर्वर, प्रॉक्सी, या कस्टम कोड नोड के।

क्लाउडफ्लेयर चैलेंज लॉगिन से मुख्य अंतर: कोई TLS सर्वर नहीं, कोई प्रॉक्सी नहीं, कोई Prepare TLS Login Request कोड नोड नहीं। टर्नस्टाइल टोकन को cf-turnstile-response फॉर्म फील्ड के रूप में सीधे n8n के बिल्ट-इन HTTP Request नोड के माध्यम से जमा किया जाता है। क्रेडेंशियल्स मानक form-urlencoded बॉडी पैरामीटर के रूप में भेजे जाते हैं।

शेड्यूल पथ:

Copy
हर 24 घंटे → सेट लॉगिन कॉन्फ़िग → टर्नस्टाइल सॉल्व करें → लॉगिन सबमिट करें
            → लॉगिन ठीक है? → सफलता चिह्नित करें / विफलता चिह्नित करें

वेबहुक पथ:

Copy
वेबहुक ट्रिगर → टर्नस्टाइल सॉल्व करें → लॉगिन सबमिट करें
               → लॉगिन ठीक है? → सफलता चिह्नित करें / विफलता चिह्नित करें → वेबहुक को जवाब दें

मुख्य व्यवहार:

  • CapSolver ऑपरेशन Cloudflare Turnstile है (न कि Cloudflare Challenge) — AntiTurnstileTaskProxyLess उपयोग करता है, कोई प्रॉक्सी आवश्यक नहीं
  • टोकन को POST बॉडी में cf-turnstile-response फॉर्म फील्ड के रूप में जमा किया जाता है (CF चैलेंज की तरह कुकी हेडर नहीं)
  • कोई कस्टम कोड नोड आवश्यक नहीं — HTTP Request नोड सीधे email, password, और cf-turnstile-response फील्ड के साथ form-urlencoded सबमिशन संभालता है
  • लॉगिन ठीक है? प्रतिक्रिया बॉडी में statusCode < 400 और successMarker की जांच करता है — CF चैलेंज लॉगिन की समान विधि
  • शेड्यूल पथ में सेट लॉगिन कॉन्फ़िग में हार्डकोडेड क्रेडेंशियल्स होते हैं; वेबहुक पथ POST बॉडी से usernameValue, passwordValue, usernameField, passwordField, loginActionURL, successMarker पढ़ता है
  • वेबहुक पथ डायनामिक फील्ड नामों का समर्थन करता है — प्रत्येक फॉर्म फ़ील्ड का name पैरामीटर एक एक्सप्रेशन है ($('Webhook Trigger').item.json.body.usernameField || 'email'), ताकि कॉल करने वाले अपनी साइट के फील्ड नाम निर्दिष्ट कर सकें
वर्कफ़्लो JSON विस्तारित करने के लिए क्लिक करें
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## टर्नस्टाइल खाता लॉगिन\n\n### यह कैसे काम करता है\n\n1. हर 24 घंटे में लॉगिन प्रक्रिया को शेड्यूल के माध्यम से ट्रिगर करता है।\n2. लॉगिन कॉन्फ़िग सेट करता है और टर्नस्टाइल चैलेंज को सॉल्व करता है।\n3. लॉगिन फॉर्म जमा करता है और जांचता है कि लॉगिन सफल हुआ या नहीं।\n4. शेड्यूल फ्लो में लॉगिन प्रयास को सफलता या विफलता के रूप में मार्क करता है।\n5. वैकल्पिक रूप से, वेबहुक ट्रिगर के माध्यम से लॉगिन प्रक्रिया शुरू करता है और वेबहुक-आधारित लॉगिन के लिए समान चरण निष्पादित करता है।\n\n### सेटअप चरण\n\n- [ ] शेड्यूलर सेट करके आवधिक निष्पादन निर्धारित करें।\n- [ ] बाहरी ट्रिगर के लिए वेबहुक एंडपॉइंट कॉन्फ़िगर करें।\n- [ ] लॉगिन क्रेडेंशियल्स और URL कॉन्फ़िगरेशन सेट करें।\n\n### अनुकूलन\n\nआवश्यकतानुसार शेड्यूलर में समय समायोजित करें या वेबहुक प्रतिक्रिया हैंडलिंग बदलें।",
        "width": 480,
        "height": 896
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1168,
        -160
      ],
      "id": "8ca80c21-2de5-41e7-b3e4-de184fc1d8fe",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "## शेड्यूल्ड लॉगिन फ्लो\n\nलॉगिन स्टेप्स को हर 24 घंटे ट्रिगर करता है",
        "width": 1920,
        "height": 448,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -608,
        -160
      ],
      "id": "533be07a-6fe7-4ada-a40c-7a7749ba968d",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "## वेबहुक लॉगिन फ्लो\n\nवेबहुक द्वारा ट्रिगर किए गए लॉगिन अनुरोधों को हैंडल करता है",
        "width": 2288,
        "height": 416,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -608,
        320
      ],
      "id": "c6a8e296-2bfb-4ffa-8819-aa420e936589",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 24
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -560,
        48
      ],
      "id": "ts-l-01",
      "name": "हर 24 घंटे"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "l1",
              "name": "websiteURL",
              "value": "https://YOUR-LOGIN-PAGE.com",
              "type": "string"
            },
            {
              "id": "l2",
              "name": "websiteKey",
              "value": "YOUR_SITE_KEY_HERE",
              "type": "string"
            },
            {
              "id": "l3",
              "name": "successMarker",
              "value": "account-dashboard",
              "type": "string"
            },
            {
              "id": "l4",
              "name": "userAgent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -240,
        48
      ],
      "id": "ts-l-02",
      "name": "सेट लॉगिन कॉन्फ़िग [शेड्यूल]"
    },
    {
      "parameters": {
        "operation": "Cloudflare Turnstile",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        256,
        48
      ],
      "id": "ts-l-03",
      "name": "टर्नस्टाइल सॉल्व करें [शेड्यूल]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Set Login Config [Schedule]').item.json.websiteURL }}/login",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/x-www-form-urlencoded"
            },
            {
              "name": "user-agent",
              "value": "={{ $('Set Login Config [Schedule]').item.json.userAgent }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "email",
              "value": "your-email@example.com"
            },
            {
              "name": "password",
              "value": "YOUR_ACCOUNT_PASSWORD"
            },
            {
              "name": "cf-turnstile-response",
              "value": "={{ $json.data.solution.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "neverError": true
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        576,
        48
      ],
      "id": "ts-l-04",
      "name": "लॉगिन सबमिट करें [शेड्यूल]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "lif1",
              "leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Set Login Config [Schedule]').item.json.successMarker) }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        896,
        48
      ],
      "id": "ts-l-05",
      "name": "लॉगिन ठीक है? [शेड्यूल]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "s1",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "s2",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1168,
        -48
      ],
      "id": "ts-l-06",
      "name": "सफलता चिह्नित करें"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "f1",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "f2",
              "name": "statusCode",
              "value": "={{ $json.statusCode }}",
              "type": "number"
            },
            {
              "id": "f3",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1168,
        128
      ],
      "id": "ts-l-07",
      "name": "विफलता चिह्नित करें"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "account-login-turnstile",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -560,
        544
      ],
      "id": "ts-l-08",
      "name": "वेबहुक ट्रिगर",
      "webhookId": "9c7a53a4-d3ee-495b-9381-3a9425bb1b36"
    },
    {
      "parameters": {
        "operation": "Cloudflare Turnstile",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        256,
        544
      ],
      "id": "ts-l-09",
      "name": "टर्नस्टाइल सॉल्व करें [वेबहुक]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Webhook Trigger').item.json.body.loginActionURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/x-www-form-urlencoded"
            },
            {
              "name": "user-agent",
              "value": "={{ $('Webhook Trigger').item.json.body.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "={{ $('Webhook Trigger').item.json.body.usernameField || 'email' }}",
              "value": "={{ $('Webhook Trigger').item.json.body.usernameValue }}"
            },
            {
              "name": "={{ $('Webhook Trigger').item.json.body.passwordField || 'password' }}",
              "value": "={{ $('Webhook Trigger').item.json.body.passwordValue }}"
            },
            {
              "name": "cf-turnstile-response",
              "value": "={{ $json.data.solution.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "neverError": true
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        576,
        544
      ],
      "id": "ts-l-10",
      "name": "लॉगिन सबमिट करें [वेबहुक]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "lif2",
              "leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Webhook Trigger').item.json.body.successMarker) }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        896,
        544
      ],
      "id": "ts-l-11",
      "name": "लॉगिन ठीक है? [वेबहुक]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "ws1",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "ws2",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1168,
        432
      ],
      "id": "ts-l-12",
      "name": "सफलता चिह्नित करें [डब्ल्यू]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "wf1",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "wf2",
              "name": "statusCode",
              "value": "={{ $json.statusCode }}",
              "type": "number"
            },
            {
              "id": "wf3",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1168,
        576
      ],
      "id": "ts-l-13",
      "name": "विफलता चिह्नित करें [डब्ल्यू]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1536,
        544
      ],
      "id": "ts-l-14",
      "name": "वेबहुक को जवाब दें"
    }
  ],
  "connections": {
    "Every 24 Hours": {
      "main": [
        [
          {
            "node": "Set Login Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Login Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Turnstile [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Turnstile [Schedule]": {
      "main": [
        [
          {
            "node": "Submit Login [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Login [Schedule]": {
      "main": [
        [
          {
            "node": "Login OK? [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Login OK? [Schedule]": {
      "main": [
        [
          {
            "node": "Mark Success",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Solve Turnstile [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Turnstile [Webhook]": {
      "main": [
        [
          {
            "node": "Submit Login [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Login [Webhook]": {
      "main": [
        [
          {
            "node": "Login OK? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Login OK? [Webhook]": {
      "main": [
        [
          {
            "node": "Mark Success [W]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Mark Failed [W]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Success [W]": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mark Failed [W]": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}
## निष्कर्ष

आपने n8n में एक संपूर्ण Cloudflare Challenge बायपास पाइपलाइन बनाई है — न तो कोई ब्राउज़र ऑटोमेशन, न Puppeteer, न Playwright। सिर्फ तीन घटक एक साथ काम कर रहे हैं: CapSolver चुनौती को हल करने के लिए, एक Go TLS सर्वर जो Chrome के नेटवर्क फ़िंगरप्रिंट को जालसाजी करता है, और एक n8n वर्कफ़्लो जो सब कुछ समन्वयित करता है।

मुख्य अंतर्दृष्टि यह है कि चुनौती हल करना समस्या का केवल आधा हिस्सा है। इसके बाद की fetch में TLS फ़िंगरप्रिंट्स का मेल न होने पर cf_clearance बेकार है — Cloudflare केवल कुकी को नहीं, बल्कि हैंडशेक की जांच करता है। httpcloak TLS सर्वर उस स्तर को संभालता है, जिससे fetch नेटवर्क स्तर पर एक वास्तविक Chrome ब्राउज़र से अलग न लगे।

अब यह रेपो आपको Cloudflare-संरक्षित साइटों के लिए वास्तविक प्रारंभिक टेम्पलेट देता है:

  • Challenge Solver API — एक वेबहुक एक्सपोज़ करें जो बाहरी ऐप्स के लिए कच्चा cf_clearance + userAgent लौटाता है
  • Scraping — Cloudflare-संरक्षित पृष्ठों से कीमत और उत्पाद डेटा निकालें, परिवर्तन की पहचान के साथ
  • Account login — अपने Cloudflare के पीछे अपने खाते में लॉग इन करें
  • Turnstile Solver API — एक 3-नोड वेबहुक जो एक Turnstile टोकन लौटाता है (कोई प्रॉक्सी, कोई TLS सर्वर नहीं)
  • Turnstile Scraping — n8n के बिल्ट-इन HTTP Request नोड का उपयोग करके Turnstile-संरक्षित पृष्ठों पर मूल्य निगरानी
  • Turnstile Account Login — फॉर्म-एन्कोडेड क्रेडेंशियल और हल किए गए टोकन के साथ Turnstile-संरक्षित साइटों में लॉगिन करें

Solver API सबसे सरल प्रवेश बिंदु है — 4 नोड्स, कोई TLS सर्वर आवश्यक नहीं। Turnstile वर्कफ़्लोज़ और भी सरल हैं — कोई प्रॉक्सी या TLS सर्वर आवश्यक नहीं क्योंकि Turnstile एक टोकन देता है (जो IP-बाउंड कुकी नहीं है) और TLS को फ़िंगरप्रिंट नहीं करता। जो Cloudflare Challenge वर्कफ़्लोज़ सीधे पेज लाते हैं, उनके लिए CapSolver चुनौती हल करता है और TLS सर्वर वास्तविक अनुरोध करता है। प्लेसहोल्डर्स कॉन्फ़िगर करें, वर्कफ़्लो को तब तक निष्क्रिय रखें जब तक वे आपके लक्ष्य से मेल नहीं खाते, फिर सक्रिय करें।

टिप: ये वर्कफ़्लो Schedule + Webhook ट्रिगर्स का उपयोग करते हैं, लेकिन आप ट्रिगर नोड को किसी भी n8n ट्रिगर — मैनुअल, ऐप इवेंट, फॉर्म सबमिशन आदि से बदल सकते हैं। डेटा लाने के बाद, n8n के बिल्ट-इन नोड्स का उपयोग करके परिणाम Google Sheets, डेटाबेस, क्लाउड स्टोरेज में सहेजें, या Telegram/Slack/Email के जरिए अलर्ट भेजें।


शुरू करने के लिए तैयार हैं? CapSolver में साइन अप करें और अपने पहले रिचार्ज पर अतिरिक्त 8% बोनस के लिए बोनस कोड n8n का उपयोग करें!

CapSolver bonus code banner

अक्सर पूछे जाने वाले प्रश्न

AntiCloudflareTask क्या है, और यह AntiTurnstileTaskProxyLess से कैसे अलग है?

AntiCloudflareTask पूर्ण- पेज Cloudflare Bot Management चुनौती को हल करता है — वह "Just a moment…" स्क्रीन जो साइट तक पूरी तरह से पहुँचने से रोकती है। इसमें प्रॉक्सी की आवश्यकता होती है क्योंकि CapSolver को ब्राउज़र के माध्यम से वास्तविक संरक्षित पृष्ठ लोड करना होता है। AntiTurnstileTaskProxyLess उन Turnstile विजेट्स को हल करता है जो पृष्ठों के अंदर (लॉगिन फॉर्म, साइनअप फॉर्म) एम्बेड होते हैं और इसमें प्रॉक्सी की आवश्यकता नहीं होती। ये अलग-अलग चुनौतियाँ, अलग-अलग टास्क प्रकार हैं।

मैं सिर्फ n8n के बिल्ट-इन HTTP Request नोड का उपयोग क्यों नहीं कर सकता पृष्ठ लाने के लिए?

n8n का HTTP Request नोड Go के मानक net/http लाइब्रेरी का उपयोग करता है, जिसका एक विशिष्ट TLS फ़िंगरप्रिंट होता है जिसे Cloudflare पहचान लेता है। मान्य cf_clearance कुकी होने पर भी, Cloudflare किसी भी ऐसे अनुरोध को पुनः चुनौती देगा जिसका TLS प्रोफ़ाइल ज्ञात ब्राउज़र से मेल नहीं खाता। TLS सर्वर httpcloak का उपयोग कर वास्तविक Chrome TLS स्टैक की नकल करके इस समस्या का समाधान करता है।

मेरा डेटा सेंटर प्रॉक्सी बार-बार क्यों फेल हो रहा है?

Cloudflare का बोट स्कोरिंग IP पतों को जोखिम स्कोर देता है। डेटा सेंटर IP (AWS, GCP, VPS प्रदाता आदि से) प्रसिद्ध होते हैं और उच्च जोखिम स्कोर प्राप्त करते हैं। AntiCloudflareTask आपकी प्रॉक्सी का उपयोग करके चुनौती पृष्ठ को लोड करता है, और यदि Cloudflare IP को डेटा सेंटर के रूप में पहचानता है, तो यह या तो ऐसी कठिन चुनौती देता है जिसे CapSolver हल नहीं कर सकता, या पूरी तरह से चुनौती असफल कर देता है। रेसिडेंशियल और मोबाइल IP कम जोखिम स्कोर के होते हैं और अधिक विश्वसनीय रूप से पास हो जाते हैं।

क्या Turnstile वर्कफ़्लोज़ को TLS सर्वर या प्रॉक्सी की आवश्यकता है?

नहीं। Turnstile मूल रूप से Cloudflare Challenge से अलग है। Turnstile एक अल्पकालिक token लौटाता है जिसे आप हेडर या फॉर्म फ़ील्ड के रूप में सबमिट करते हैं — यह किसी विशिष्ट IP या TLS फ़िंगरप्रिंट से जुड़ा नहीं होता। CapSolver AntiTurnstileTaskProxyLess का उपयोग कर Turnstile को हल करता है, जिसमें प्रॉक्सी की आवश्यकता नहीं होती। और चूंकि आप एक टोकन भेज रहे हैं (IP-बाउंड कुकी नहीं), n8n का बिल्ट-इन HTTP Request नोड ठीक से काम करता है — TLS फ़िंगरप्रिंट की नकल करने की ज़रूरत नहीं।

क्या cf_clearance की वैधता समाप्त हो जाती है?

हां। समाप्ति साइट के Cloudflare कॉन्फ़िगरेशन पर निर्भर करती है — यह कुछ मिनटों से लेकर 24 घंटों तक हो सकती है। आवर्ती स्क्रैपिंग नौकरियों के लिए, अनुसूचित वर्कफ़्लो (हर 6 घंटे) नियमित रूप से चुनौती को फिर से हल करता रहता है। ऑन-डिमांड स्क्रैपिंग के लिए, वेबहुक पथ हर अनुरोध पर एक नई चुनौती हल करता है।

और देखें

n8nMar 09, 2026

CapSolver और n8n का उपयोग करके reCAPTCHA v2/v3 कैसे हल करें

CapSolver और n8n का उपयोग करके eCAPTCHA v2/v3 सॉल्वर API बनाएं। बिना कोडिंग के टोकन को ऑटोमेट करने, वेबसाइट पर सबमिट करने और सुरक्षित डेटा निकालने का तरीका सीखें।

Rajinder Singh
Rajinder Singh
Apr 22, 2026

चित्र पहेलियाँ हल करने के लिए श्रेष्ठ कृत्रिम बुद्धिमत्ता: 2026 के लिए शीर्ष उपकरण और रणनीतियाँ

खोजें कि चित्र पहेलियां हल करने के लिए सबसे अच्छा AI क्या है। जानें कैसे कैपसॉल्वर के विजन इंजन और इमेज टू टेक्स्ट एपीआईज़ उच्च शुद्धता के साथ जटिल दृश्य चुनौतियों को स्वचालित करते हैं।

विषय-सूची

Rajinder Singh
Rajinder Singh
web scrapingApr 22, 2026

रस्ट वेब स्क्रैपिंग आर्किटेक्चर लिए स्केलेबल डेटा निष्कर्षण

Rust में वेब स्क्रैपिंग के स्केलेबल आर्किटेक्चर सीखें, reqwest, scraper, असिंक्रोनस स्क्रैपिंग, हेडलेस ब्राउज़र स्क्रैपिंग, प्रॉक्सी रोटेशन, और संगत CAPTCHA का निपटारा।

Rajinder Singh
Rajinder Singh
Apr 22, 2026

खोज एपीआई विरुद्ध ज्ञान आपूर्ति शृंखला: कृत्रिम बुद्धिमत्ता डेटा इंफ्रास्ट्रक्चर गाइड

जानें कैसे सर्च एपीआई टूल्स, ज्ञान आपूर्ति शृंखला, SERP एपीआई वर्कफ़्लो और एआई डेटा पाइपलाइन्स एआई के लिए आधुनिक वेब डेटा इंफ्रास्ट्रक्चर के आकार बनाते हैं।

Rajinder Singh
Rajinder Singh
ब्लॉग
All