প্রতিটি ব্রাউজার-অটোমেশন ডেভেলপার ঠিক একবার যে ফাঁদে পড়ে সেটি এই: আপনি Chrome-এর লঞ্চ ফ্ল্যাগে --proxy-server=http://user:pass@host:port যোগ করেন, ব্রাউজার দিব্যি চালু হয়, আর তারপর প্রতিটি পেজ এমন একটি অথেন্টিকেশন পপআপে আটকে যায় যা আপনার স্ক্রিপ্ট দেখতেও পারে না, ক্লিকও করতে পারে না। Chrome নীরবে প্রক্সি ফ্ল্যাগ থেকে ক্রেডেনশিয়াল ছেঁটে ফেলে। কোনো এরর নেই, কোনো লগ লাইন নেই, শুধু এমন এক ব্রাউজারে একটি মোডাল ডায়ালগ যেদিকে কেউ তাকিয়ে নেই।
এই গাইডটি ২০২৬ সালে Selenium ও Playwright-এ আসলেই কাজ করে এমন প্রক্সি অথেন্টিকেশন পদ্ধতিগুলোর সম্পূর্ণ মানচিত্র — কোনটি ব্যবহার করবেন, কোনটি এড়াবেন, এবং প্রতিটির জন্য হুবহু কোড। (এই টুলগুলোতে প্রক্সি নির্বাচন ও রোটেশন কৌশলের জন্য দেখুন Playwright ও Puppeteer-এর সাথে প্রক্সি ব্যবহার — এই নিবন্ধটি শুধুমাত্র ক্রেডেনশিয়াল পার করানোর বিষয়ে।)
কমান্ড-লাইন HTTP ক্লায়েন্টগুলো প্রক্সি URL থেকে ক্রেডেনশিয়াল পার্স করে নেয় এবং প্রক্সির 407 Proxy Authentication Required-এর উত্তর স্বয়ংক্রিয়ভাবে একটি Proxy-Authorization হেডার দিয়ে দেয়। Chromium তা করে না: --proxy-server শুধুমাত্র scheme://host:port গ্রহণ করে, আর যখন 407 ফিরে আসে তখন এটি একটি ইন্টারঅ্যাক্টিভ ডায়ালগ দেখায়। হেডলেস মোডে তো ডায়ালগও থাকে না — রিকোয়েস্টটি শুধু ব্যর্থ হয়।
তাই প্রশ্নটি কখনোই "URL-এ পাসওয়ার্ড কীভাবে বসাবো" নয় — বরং "কোন স্তরটি আমার হয়ে 407-এর উত্তর দেবে।" চারটি কার্যকর উত্তর, সেরাটি প্রথমে।
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 একটি লোকাল 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.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 native | Playwright | হ্যাঁ | হ্যাঁ | ডিফল্ট পছন্দ |
| selenium-wire | Selenium (Py) | হ্যাঁ | প্রতি-ড্রাইভার | মাঝারি স্কেলে ঠিক আছে |
| Auth extension | Selenium (যেকোনো ভাষা) | শুধু --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"
--proxy-server-এ ক্রেডেনশিয়াল পাস করেছেন; Chrome সেগুলো ফেলে দিয়েছে। চারটি পদ্ধতির একটি ব্যবহার করুন।ERR_PROXY_CONNECTION_FAILED — হোস্ট/পোর্ট ভুল বা প্রোটোকল অমিল। প্রথমে একই লাইন curl -x দিয়ে টেস্ট করুন; curl কাজ করলে, সমস্যা আপনার ব্রাউজার ওয়্যারিংয়ে।--headless=new-এ যান।ব্রাউজার user:pass@ প্রক্সি URL পড়ে না — তাদের হয়ে কাউকে 407-এর উত্তর দিতে হয়। Playwright-এ সেই কেউটি বিল্ট-ইন; Selenium-এ এটি selenium-wire, একটি জেনারেটেড অথ এক্সটেনশন, কিংবা একটি লোকাল ফরওয়ার্ডার। তুলনা টেবিল থেকে আপনার স্ট্যাক অনুযায়ী বেছে নিন, তারপর প্রতিটি রানে এক্সিট IP অ্যাসার্ট করুন যাতে একটি নীরব অথ ব্যর্থতা ক্রল চলাকালীন আপনার আসল ঠিকানা কখনোই ফাঁস করতে না পারে।
$৫ ফ্রি রেসিডেনশিয়াল ক্রেডিট — একটি গেটওয়ে, sticky বা রোটেটিং, HTTP এবং SOCKS5।
ফ্রি ট্রায়াল শুরু করুননতুন ব্যবহারকারীরা নিবন্ধনের সময় 500MB পান, সাথে প্রথম রিচার্জে বোনাস। সীমিত সময়ের অফার।