Selenium ও Playwright-এ প্রক্সি অথেন্টিকেশন: যেসব পদ্ধতি কাজ করে (২০২৬)

4 জুন 2026 প্রকাশিত · ≈10 মিনিট পড়া

প্রতিটি ব্রাউজার-অটোমেশন ডেভেলপার ঠিক একবার যে ফাঁদে পড়ে সেটি এই: আপনি Chrome-এর লঞ্চ ফ্ল্যাগে --proxy-server=http://user:pass@host:port যোগ করেন, ব্রাউজার দিব্যি চালু হয়, আর তারপর প্রতিটি পেজ এমন একটি অথেন্টিকেশন পপআপে আটকে যায় যা আপনার স্ক্রিপ্ট দেখতেও পারে না, ক্লিকও করতে পারে না। Chrome নীরবে প্রক্সি ফ্ল্যাগ থেকে ক্রেডেনশিয়াল ছেঁটে ফেলে। কোনো এরর নেই, কোনো লগ লাইন নেই, শুধু এমন এক ব্রাউজারে একটি মোডাল ডায়ালগ যেদিকে কেউ তাকিয়ে নেই।

এই গাইডটি ২০২৬ সালে Selenium ও Playwright-এ আসলেই কাজ করে এমন প্রক্সি অথেন্টিকেশন পদ্ধতিগুলোর সম্পূর্ণ মানচিত্র — কোনটি ব্যবহার করবেন, কোনটি এড়াবেন, এবং প্রতিটির জন্য হুবহু কোড। (এই টুলগুলোতে প্রক্সি নির্বাচন ও রোটেশন কৌশলের জন্য দেখুন Playwright ও Puppeteer-এর সাথে প্রক্সি ব্যবহার — এই নিবন্ধটি শুধুমাত্র ক্রেডেনশিয়াল পার করানোর বিষয়ে।)

ব্রাউজারে কেন user:pass@host ব্যর্থ হয়

কমান্ড-লাইন HTTP ক্লায়েন্টগুলো প্রক্সি URL থেকে ক্রেডেনশিয়াল পার্স করে নেয় এবং প্রক্সির 407 Proxy Authentication Required-এর উত্তর স্বয়ংক্রিয়ভাবে একটি Proxy-Authorization হেডার দিয়ে দেয়। Chromium তা করে না: --proxy-server শুধুমাত্র scheme://host:port গ্রহণ করে, আর যখন 407 ফিরে আসে তখন এটি একটি ইন্টারঅ্যাক্টিভ ডায়ালগ দেখায়। হেডলেস মোডে তো ডায়ালগও থাকে না — রিকোয়েস্টটি শুধু ব্যর্থ হয়।

তাই প্রশ্নটি কখনোই "URL-এ পাসওয়ার্ড কীভাবে বসাবো" নয় — বরং "কোন স্তরটি আমার হয়ে 407-এর উত্তর দেবে।" চারটি কার্যকর উত্তর, সেরাটি প্রথমে।

পদ্ধতি ১: Playwright নেটিভ অথ (পারলে এটিই ব্যবহার করুন)

Playwright সমস্যাটি ঠিকঠাকভাবে সমাধান করেছে: এটি CDP-র মাধ্যমে প্রক্সি অথ চ্যালেঞ্জের উত্তর নিজেই দেয়। ক্রেডেনশিয়াল লঞ্চ বা কনটেক্সট অপশনে যায়:

# Python
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server": "http://us.jibaoproxy.com:913",
            "username": "USERNAME-session-job1",
            "password": "PASSWORD",
        }
    )
// Node.js - and per-context, which is where it gets powerful:
const browser = await chromium.launch({
  proxy: { server: 'per-context' }   // declare intent at launch
});
const ctx = await browser.newContext({
  proxy: {
    server: 'http://us.jibaoproxy.com:913',
    username: 'USERNAME-session-job2',
    password: 'PASSWORD',
  }
});

প্রতি-কনটেক্সট প্রক্সির মানে একটি ব্রাউজার প্রসেস N-টি ভিন্ন sticky সেশনে N-টি কনটেক্সট চালাতে পারে — প্রতিটি সিরিয়াস Playwright স্ক্র্যাপিং সেটআপের ভিত্তি। আপনি যদি Playwright-এ থাকেন, আপনার কাজ শেষ; ভেরিফিকেশন সেকশনে চলে যান। নিচের সবকিছু আছে কারণ Selenium-এর সমতুল্য কিছু নেই।

পদ্ধতি ২: selenium-wire (Selenium, Python)

selenium-wire একটি লোকাল MITM প্রক্সি দিয়ে Selenium-কে মোড়ায় যা আপস্ট্রিম অথেন্টিকেশন সামলায়:

from seleniumwire import webdriver   # pip install selenium-wire

options = {
    "proxy": {
        "http":  "http://USERNAME:[email protected]:913",
        "https": "https://USERNAME:[email protected]:913",
    }
}
driver = webdriver.Chrome(seleniumwire_options=options)
driver.get("https://example.com")

প্রোডাকশনের আগে যেসব সতর্কতা জানা উচিত:

পদ্ধতি ৩: ক্রেডেনশিয়াল ইনজেক্টকারী Chrome এক্সটেনশন (Selenium, যেকোনো ভাষা)

ক্লাসিক উপায়: একটি ছোট জেনারেটেড এক্সটেনশন যা প্রক্সি সেট করে এবং chrome.webRequest.onAuthRequired-এর মাধ্যমে অথের উত্তর দেয়। কোনো MITM নেই, কোনো অতিরিক্ত প্রসেস নেই, সাদামাটা Selenium-এ কাজ করে:

import zipfile, json

HOST, PORT = "us.jibaoproxy.com", 913
USER, PASS = "USERNAME-session-sel1", "PASSWORD"

manifest = {
    "version": "1.0.0", "manifest_version": 2, "name": "Proxy Auth",
    "permissions": ["proxy", "webRequest", "webRequestBlocking", ""],
    "background": {"scripts": ["background.js"]},
}
background = f"""
chrome.proxy.settings.set({{value: {{mode: "fixed_servers", rules: {{
  singleProxy: {{scheme: "http", host: "{HOST}", port: {PORT}}}
}}}}, scope: "regular"}}, () => {{}});
chrome.webRequest.onAuthRequired.addListener(
  () => ({{authCredentials: {{username: "{USER}", password: "{PASS}"}}}}),
  {{urls: [""]}}, ["blocking"]
);
"""

with zipfile.ZipFile("proxy_auth.zip", "w") as zp:
    zp.writestr("manifest.json", json.dumps(manifest))
    zp.writestr("background.js", background)

from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_extension("proxy_auth.zip")
driver = webdriver.Chrome(options=opts)

দুটি ফাঁদ: ক্লাসিক হেডলেস মোডে এক্সটেনশন লোড হয় না--headless=new (Chrome 109+) ব্যবহার করুন বা হেডেড চালান; এবং Manifest V2 ব্যাকগ্রাউন্ড স্ক্রিপ্ট সাইডলোড করা অটোমেশন এক্সটেনশনের জন্য এখনও কাজ করে কিন্তু Chrome-এর MV2 ডিপ্রিকেশন টাইমলাইনের দিকে নজর রাখুন — MV3 সমতুল্যের জন্য একটি সার্ভিস ওয়ার্কার এবং একই onAuthRequired লিসেনার প্রয়োজন।

পদ্ধতি ৪: লোকাল ফরওয়ার্ডার (সর্বজনীন ফলব্যাক)

একটি ছোট লোকাল প্রক্সি চালান যা ক্রেডেনশিয়াল ধরে রাখে; ব্রাউজারকে কোনো অথ ছাড়াই localhost-এর দিকে নির্দেশ করুন। প্রতিটি ব্রাউজার, প্রতিটি ড্রাইভার, প্রতিটি ভাষা, হেডলেস হোক বা না হোক, সবেতে কাজ করে:

# Using pproxy (pip install pproxy) - terminal 1:
pproxy -l http://127.0.0.1:8899 \
       -r "http://USERNAME:[email protected]:913"

# Your script - terminal 2: plain Selenium, no auth needed
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://127.0.0.1:8899")
driver = webdriver.Chrome(options=opts)

এটিই Firefox/geckodriver-এর জন্যও সবচেয়ে পরিচ্ছন্ন উত্তর (যেখানে এক্সটেনশন কৌশল প্রযোজ্য নয়) এবং Electron অ্যাপ টেস্টিংয়ের মতো অস্বাভাবিক পরিবেশের জন্যও। খরচ: তদারকি করার আরও একটি চলমান অংশ, এবং প্রতি-কনটেক্সট রাউটিংয়ের জন্য প্রতি সেশনে একটি করে ফরওয়ার্ডার পোর্ট প্রয়োজন।

পদ্ধতির তুলনা

পদ্ধতিকোথায় কাজ করেহেডলেসপ্রতি-কনটেক্সট সেশনপ্রোডাকশন রায়
Playwright nativePlaywrightহ্যাঁহ্যাঁডিফল্ট পছন্দ
selenium-wireSelenium (Py)হ্যাঁপ্রতি-ড্রাইভারমাঝারি স্কেলে ঠিক আছে
Auth extensionSelenium (যেকোনো ভাষা)শুধু --headless=newপ্রতি-ড্রাইভারমজবুত, MV3-এর দিকে নজর রাখুন
Local forwarderসবকিছুহ্যাঁপ্রতি সেশনে একটি পোর্টসর্বজনীন ফলব্যাক

যাচাই করুন এটি আসলেই কাজ করেছে কিনা

আপনার আসল IP-তে নীরব ফলব্যাকই সেই ব্যর্থতার ধরন যা অ্যাকাউন্ট ব্যান করায়। প্রতিটি রানের শুরুতে এক্সিট IP অ্যাসার্ট করুন:

ip = driver.execute_script(
    "return fetch('https://api.ipify.org').then(r => r.text())"
) if hasattr(driver, 'execute_script') else page.evaluate(
    "fetch('https://api.ipify.org').then(r => r.text())"
)
assert ip != MY_REAL_IP, "Proxy not applied - aborting before we leak"
ফ্রি টুল · সাইনআপ নেই

আপনার অটোমেটেড ব্রাউজার চোখে দেখে যাচাই করুন

আপনার Selenium/Playwright ব্রাউজারকে আমাদের What Is My IP পেজে নিয়ে যান: এটি এক ভিউতে এক্সিট IP, জিওলোকেশন, ASN টাইপ এবং প্রক্সি/VPN ফ্ল্যাগ দেখায় — অথ স্তর কাজ করেছে এবং IP রেসিডেনশিয়াল কিনা তার তাৎক্ষণিক নিশ্চয়তা।

IP চেকার খুলুন →

"রেসিডেনশিয়াল" প্রক্সিতে একটি ডেটাসেন্টার ASN দেখছেন? এমন একটি পুলে যান যা আসলেই রেসিডেনশিয়াল — $৫ ফ্রি ক্রেডিট →

ট্রাবলশুটিং দ্রুত রেফারেন্স

সারসংক্ষেপ

ব্রাউজার user:pass@ প্রক্সি URL পড়ে না — তাদের হয়ে কাউকে 407-এর উত্তর দিতে হয়। Playwright-এ সেই কেউটি বিল্ট-ইন; Selenium-এ এটি selenium-wire, একটি জেনারেটেড অথ এক্সটেনশন, কিংবা একটি লোকাল ফরওয়ার্ডার। তুলনা টেবিল থেকে আপনার স্ট্যাক অনুযায়ী বেছে নিন, তারপর প্রতিটি রানে এক্সিট IP অ্যাসার্ট করুন যাতে একটি নীরব অথ ব্যর্থতা ক্রল চলাকালীন আপনার আসল ঠিকানা কখনোই ফাঁস করতে না পারে।

আজ রাতেই চারটি পদ্ধতিই টেস্ট করুন

$৫ ফ্রি রেসিডেনশিয়াল ক্রেডিট — একটি গেটওয়ে, sticky বা রোটেটিং, HTTP এবং SOCKS5।

ফ্রি ট্রায়াল শুরু করুন

সকল IP পণ্যের জন্য · যেকোনো সময় উপলব্ধ বিশাল নোড পুল

এখনই নিবন্ধন করুন এবং আপনার রিচার্জে ১০০% পর্যন্ত ফেরত পান

নতুন ব্যবহারকারীরা নিবন্ধনের সময় 500MB পান, সাথে প্রথম রিচার্জে বোনাস। সীমিত সময়ের অফার।