Back to Blog

ब्राउज़र में प्रॉक्सी क्यों काम करती है, लेकिन कोड में नहीं: समस्या का संपूर्ण विश्लेषण

प्रॉक्सी ब्राउज़र में ठीक काम करता है, लेकिन स्क्रिप्ट त्रुटियाँ दे रही है? सामान्य कारणों का विश्लेषण और Python, Node.js, तथा cURL के लिए तैयार समाधान।

📅December 11, 2025
```html

प्रॉक्सी ब्राउज़र में काम करता है, लेकिन कोड में क्यों नहीं: पूरी समस्या का विश्लेषण

एक क्लासिक स्थिति: आपने ब्राउज़र में प्रॉक्सी सेट किया, वेबसाइट खोली - सब ठीक है। उसी प्रॉक्सी के साथ स्क्रिप्ट चलाई - कनेक्शन त्रुटि, टाइमआउट या बैन। आइए समझते हैं कि ऐसा क्यों होता है और इसे कैसे ठीक करें।

ब्राउज़र अनुरोध कोड अनुरोध से कैसे भिन्न होता है

जब आप प्रॉक्सी के माध्यम से ब्राउज़र में कोई साइट खोलते हैं, तो केवल एक HTTP अनुरोध भेजने से कहीं अधिक होता है। ब्राउज़र स्वचालित रूप से:

  • शीर्षलेखों (Headers) का एक पूरा सेट भेजता है (User-Agent, Accept, Accept-Language, Accept-Encoding)
  • सही सिफर सेट के साथ TLS-हैंडशेक निष्पादित करता है
  • रीडायरेक्ट और कुकीज़ को संभालता है
  • JavaScript निष्पादित करता है और निर्भर संसाधनों को लोड करता है
  • DNS उत्तरों और प्रमाणपत्रों को कैश करता है

कोड से एक न्यूनतम अनुरोध सर्वर के लिए बिल्कुल अलग दिखता है - यह एक इंसान के बजाय एक रोबोट जैसा दिखता है। भले ही प्रॉक्सी ठीक से काम कर रहा हो, लक्षित साइट आपके स्क्रिप्ट को ब्लॉक कर सकती है।

प्रॉक्सी प्रमाणीकरण (Authentication) में समस्याएँ

सबसे आम कारण लॉगिन और पासवर्ड का गलत तरीके से पास होना है। ब्राउज़र क्रेडेंशियल दर्ज करने के लिए एक पॉप-अप दिखाता है, लेकिन कोड में इसे स्पष्ट रूप से करना होता है।

URL प्रारूप गलत होना

एक सामान्य गलती स्कीम (Scheme) को छोड़ देना या विशेष वर्णों को गलत तरीके से एस्केप करना है:

# गलत
proxy = "user:pass@proxy.example.com:8080"

# सही
proxy = "http://user:pass@proxy.example.com:8080"

# यदि पासवर्ड में विशेष वर्ण हैं (@, :, /)
from urllib.parse import quote
password = quote("p@ss:word/123", safe="")
proxy = f"http://user:{password}@proxy.example.com:8080"

IP बनाम लॉगिन/पासवर्ड द्वारा प्रमाणीकरण

कुछ प्रॉक्सी प्रदाता IP पते द्वारा व्हाइटलिस्टिंग का उपयोग करते हैं। आपका ब्राउज़र काम करता है क्योंकि आपका IP व्हाइटलिस्ट में जोड़ा गया है। लेकिन सर्वर पर चल रही स्क्रिप्ट काम नहीं करती है, क्योंकि सर्वर का IP अलग है।

जांचें कि प्रॉक्सी प्रदाता के पैनल में कौन सी प्रमाणीकरण विधि का उपयोग किया जाता है और व्हाइटलिस्ट में कौन से IP जोड़े गए हैं।

HTTP/HTTPS/SOCKS प्रोटोकॉल का बेमेल

ब्राउज़र अक्सर प्रॉक्सी के प्रकार को स्वचालित रूप से पहचान लेता है। कोड में आपको इसे स्पष्ट रूप से इंगित करना होगा, और प्रोटोकॉल में त्रुटि के परिणामस्वरूप चुपचाप अस्वीकृति हो सकती है।

प्रॉक्सी का प्रकार URL में स्कीम विशेषताएँ
HTTP प्रॉक्सी http:// CONNECT के माध्यम से HTTP और HTTPS के लिए काम करता है
HTTPS प्रॉक्सी https:// प्रॉक्सी के साथ एन्क्रिप्टेड कनेक्शन
SOCKS4 socks4:// प्रमाणीकरण के बिना, केवल IPv4
SOCKS5 socks5:// प्रमाणीकरण के साथ, UDP, IPv6
SOCKS5h socks5h:// प्रॉक्सी के माध्यम से DNS रिज़ॉल्यूशन

यह महत्वपूर्ण है: यदि आपके पास SOCKS5-प्रॉक्सी है, लेकिन आप http:// निर्दिष्ट करते हैं - तो कनेक्शन स्थापित नहीं होगा। लाइब्रेरी SOCKS-सर्वर से HTTP प्रोटोकॉल पर बात करने की कोशिश करेगी।

शीर्षलेखों (Headers) और फ़िंगरप्रिंट का अभाव

भले ही प्रॉक्सी ठीक से काम कर रहा हो, लक्षित साइट संदिग्ध शीर्षलेखों के कारण अनुरोध को ब्लॉक कर सकती है। तुलना करें:

ब्राउज़र से अनुरोध

GET /api/data HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

डिफ़ॉल्ट रूप से requests से अनुरोध

GET /api/data HTTP/1.1
Host: example.com
User-Agent: python-requests/2.28.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

अंतर स्पष्ट है। एंटी-बॉट सुरक्षा वाली साइट तुरंत पहचान लेगी कि अनुरोध ब्राउज़र से नहीं आ रहा है।

मास्किंग के लिए न्यूनतम शीर्षलेख सेट

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Cache-Control": "max-age=0"
}

SSL प्रमाणपत्र और सत्यापन

ब्राउज़र के पास रूट प्रमाणपत्रों का एक अंतर्निहित भंडार होता है और यह विभिन्न SSL कॉन्फ़िगरेशन को संभाल सकता है। कोड में समस्याएं उत्पन्न हो सकती हैं:

त्रुटि SSL: CERTIFICATE_VERIFY_FAILED

कुछ प्रॉक्सी ट्रैफ़िक निरीक्षण के लिए अपने स्वयं के प्रमाणपत्रों का उपयोग करते हैं। ब्राउज़र के पास यह प्रमाणपत्र विश्वसनीय हो सकता है, लेकिन आपके स्क्रिप्ट के पास नहीं।

# डिबगिंग के लिए अस्थायी समाधान (प्रोडक्शन के लिए नहीं!)
import requests
response = requests.get(url, proxies=proxies, verify=False)

# सही समाधान - प्रमाणपत्र का पथ निर्दिष्ट करें
response = requests.get(url, proxies=proxies, verify="/path/to/proxy-ca.crt")

महत्वपूर्ण: SSL सत्यापन को अक्षम करना (verify=False) कनेक्शन को MITM हमलों के प्रति संवेदनशील बनाता है। केवल सुरक्षित वातावरण में डिबगिंग के लिए उपयोग करें।

TLS फ़िंगरप्रिंट

उन्नत एंटी-बॉट सिस्टम TLS फ़िंगरप्रिंट का विश्लेषण करते हैं - कनेक्शन स्थापित करते समय सिफ़र का क्रम और सेट। Python requests एक मानक सेट का उपयोग करता है जो ब्राउज़र सेट से भिन्न होता है।

बाईपास करने के लिए, कस्टम TLS फ़िंगरप्रिंट वाली लाइब्रेरी का उपयोग करें:

# इंस्टॉलेशन: pip install curl-cffi
from curl_cffi import requests

response = requests.get(
    url,
    proxies={"https": proxy},
    impersonate="chrome120"  # Chrome 120 के TLS फ़िंगरप्रिंट का अनुकरण करता है
)

DNS लीक और रिज़ॉल्यूशन

एक और अस्पष्ट समस्या DNS रिज़ॉल्यूशन है। HTTP प्रॉक्सी का उपयोग करते समय, DNS अनुरोध सीधे आपके मशीन से जा सकता है, प्रॉक्सी को बायपास करते हुए।

यह काम को कैसे प्रभावित करता है

  • साइट प्रॉक्सी के बजाय वास्तविक DNS रिज़ॉल्वर देखती है
  • जियोलोकेशन गलत तरीके से निर्धारित होता है
  • कुछ साइटें IP और DNS क्षेत्र के बेमेल होने पर ब्लॉक करती हैं

SOCKS5 के लिए समाधान

DNS रिज़ॉल्यूशन प्रॉक्सी के माध्यम से किया जाए, इसके लिए socks5:// के बजाय socks5h:// स्कीम का उपयोग करें - 'h' का अर्थ है कि DNS रिज़ॉल्यूशन प्रॉक्सी पक्ष पर किया जाएगा:

# DNS स्थानीय रूप से हल होता है (लीक!)
proxy = "socks5://user:pass@proxy.example.com:1080"

# DNS प्रॉक्सी के माध्यम से हल होता है (सही)
proxy = "socks5h://user:pass@proxy.example.com:1080"

Python, Node.js और cURL के लिए काम करने वाले उदाहरण

Python requests के साथ

import requests
from urllib.parse import quote

# प्रॉक्सी डेटा
proxy_host = "proxy.example.com"
proxy_port = "8080"
proxy_user = "username"
proxy_pass = quote("p@ssword!", safe="")  # विशेष वर्णों को एस्केप करें

# प्रॉक्सी URL बनाएं
proxy_url = f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"

proxies = {
    "http": proxy_url,
    "https": proxy_url
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
}

try:
    response = requests.get(
        "https://httpbin.org/ip",
        proxies=proxies,
        headers=headers,
        timeout=30
    )
    print(f"Status: {response.status_code}")
    print(f"IP: {response.json()}")
except requests.exceptions.ProxyError as e:
    print(f"प्रॉक्सी त्रुटि: {e}")
except requests.exceptions.ConnectTimeout:
    print("प्रॉक्सी से कनेक्शन टाइमआउट")

Python aiohttp के साथ (अतुल्यकालिक)

import aiohttp
import asyncio

async def fetch_with_proxy():
    proxy_url = "http://user:pass@proxy.example.com:8080"
    
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://httpbin.org/ip",
            proxy=proxy_url,
            headers={"User-Agent": "Mozilla/5.0..."}
        ) as response:
            return await response.json()

result = asyncio.run(fetch_with_proxy())
print(result)

Node.js axios के साथ

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const proxyUrl = 'http://user:pass@proxy.example.com:8080';
const agent = new HttpsProxyAgent(proxyUrl);

axios.get('https://httpbin.org/ip', {
    httpsAgent: agent,
    headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
    }
})
.then(response => console.log(response.data))
.catch(error => console.error('Error:', error.message));

Node.js node-fetch और SOCKS के साथ

const fetch = require('node-fetch');
const { SocksProxyAgent } = require('socks-proxy-agent');

const agent = new SocksProxyAgent('socks5://user:pass@proxy.example.com:1080');

fetch('https://httpbin.org/ip', { agent })
    .then(res => res.json())
    .then(data => console.log(data));

cURL

# HTTP प्रॉक्सी
curl -x "http://user:pass@proxy.example.com:8080" \
     -H "User-Agent: Mozilla/5.0..." \
     https://httpbin.org/ip

# SOCKS5 प्रॉक्सी प्रॉक्सी के माध्यम से DNS के साथ
curl --socks5-hostname "proxy.example.com:1080" \
     --proxy-user "user:pass" \
     https://httpbin.org/ip

# डिबगिंग - कनेक्शन प्रक्रिया दिखाएँ
curl -v -x "http://user:pass@proxy.example.com:8080" \
     https://httpbin.org/ip

निदान चेकलिस्ट

यदि कोड में प्रॉक्सी काम नहीं करता है, तो क्रम में जांचें:

  1. प्रॉक्सी URL प्रारूप - क्या स्कीम (http://, socks5://) मौजूद है?
  2. पासवर्ड में विशेष वर्ण - क्या वे URL-एन्कोडिंग के माध्यम से कोडित हैं?
  3. प्रॉक्सी का प्रकार - क्या निर्दिष्ट प्रोटोकॉल वास्तविक से मेल खाता है?
  4. प्रमाणीकरण - क्या यह IP द्वारा है या लॉगिन द्वारा? क्या सर्वर का IP व्हाइटलिस्ट में है?
  5. शीर्षलेख - क्या User-Agent और अन्य ब्राउज़र शीर्षलेख जोड़े गए हैं?
  6. SSL - क्या कोई प्रमाणपत्र त्रुटि है?
  7. DNS - क्या DNS को प्रॉक्सी के माध्यम से हल करने के लिए socks5h:// का उपयोग किया जाता है?
  8. टाइमआउट - क्या कनेक्शन के लिए पर्याप्त समय है (विशेषकर रेजिडेंशियल प्रॉक्सी के लिए)?

निष्कर्ष

ब्राउज़र और कोड के बीच का अंतर विवरण में है: शीर्षलेख, प्रोटोकॉल, SSL, DNS। ब्राउज़र इस जटिलता को छुपाता है, जबकि कोड में हर पहलू को स्पष्ट रूप से कॉन्फ़िगर करने की आवश्यकता होती है। URL प्रारूप और प्रमाणीकरण की जाँच करके शुरुआत करें, फिर ब्राउज़र शीर्षलेख जोड़ें - यह 90% समस्याओं का समाधान करता है।

पार्सिंग और स्वचालन कार्यों के लिए, जहां स्थिरता और कम अवरोधन दर महत्वपूर्ण है, रेजिडेंशियल प्रॉक्सी अच्छी तरह से काम करते हैं - आप उनके बारे में proxycove.com पर अधिक जानकारी प्राप्त कर सकते हैं।

```