Socks5Proxy

Puppeteer প্রোক্সি সেটিং, --proxy-server এবং page.authenticate দিয়ে সংযোগ করা

এই গাইডে Puppeteer দিয়ে Chrome চালু করার সময় Socks5Proxy-এর HTTP প্রোক্সি --proxy-server আর্গুমেন্ট ও page.authenticate অথেন্টিকেশন দিয়ে, SOCKS5 সংযোগ, একাধিক IP-এ ব্রাউজার ভাগ করে চালু করার কোড বর্ণনা করা হয়েছে।

Puppeteer-এ প্রোক্সি কীভাবে কাজ করে?

Puppeteer Chrome চালু করার সময় আর্গুমেন্ট দিয়ে প্রোক্সি সেট করে। --proxy-server-এ ঠিকানা দিলে সেই ব্রাউজারের সব পৃষ্ঠা একই প্রোক্সি ব্যবহার করে। HTTP প্রোক্সির ব্যবহারকারী নাম এবং পাসওয়ার্ড আর্গুমেন্ট দিয়ে দেওয়া যায় না, তাই পৃষ্ঠা খোলার পর page.authenticate দিয়ে পাস করা হয়। এতে প্রোক্সি অথেন্টিকেশন চাইলে Puppeteer স্বয়ংক্রিয়ভাবে উত্তর দেয়।

উদাহরণে IP 198.51.100.23, HTTP পোর্ট 8000, SOCKS5 পোর্ট 1080, ইউজারনেম spx_user, পাসওয়ার্ড spx_pass ব্যবহার করা হয়।

npm install puppeteer

HTTP প্রোক্সি এবং অথেন্টিকেশন কিভাবে সংযুক্ত করবো?

launch-এর args-এ --proxy-server=198.51.100.23:8000 যোগ করুন, এবং newPage দিয়ে পৃষ্ঠা তৈরি করার পরপরই page.authenticate-এ ইউজারনেম এবং পাসওয়ার্ড পাস করুন। অথেন্টিকেশন প্রতি পৃষ্ঠায় করতে হয় তাই নতুন পৃষ্ঠা তৈরি করার সময় একই কল যোগ করুন।

HTTPS সাইটও সরাসরি খোলে। ব্রাউজার CONNECT টানেল তৈরি করে এবং তার মধ্যে এনক্রিপ্টেড কানেকশন করে।

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

SOCKS5 প্রোক্সি কিভাবে ব্যবহার করবো?

--proxy-server-এ socks5:// ঠিকানা ব্যবহার করুন। তবে Chrome SOCKS প্রোক্সির ইউজারনেম এবং পাসওয়ার্ড অথেন্টিকেশন সমর্থন করে না, তাই page.authenticate SOCKS5-এ প্রয়োগ হয় না। SOCKS5 সংযোগ করতে, ড্যাশবোর্ডে এই কোড চলছে এমন সার্ভারের IPv4 রেজিস্টার করুন IP অথোরাইজেশন ব্যবহার করুন।

ইউজারনেম এবং পাসওয়ার্ড দিয়ে সংযোগ করতে হলে একই IP-এর HTTP পোর্ট ব্যবহার করা সবচেয়ে সহজ। একই IP হওয়ায় টার্গেট সাইটে দেখা অবস্থান একই থাকে।

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

একাধিক আইপি দিয়ে ব্রাউজার আলাদাভাবে খুলতে চাইলে কী করতে হবে?

Chrome একবারে একটি ব্রাউজারে একটি প্রোক্সি ব্যবহার করে, তাই ভিন্ন IP প্রয়োজন হলে ব্রাউজার আলাদা করে চালু করতে হবে। নিচের কোডটি API থেকে ip:port:user:pass লিস্ট নিয়ে প্রথম তিনটি দিয়ে ব্রাউজার চালু করে এবং প্রতিটি পৃষ্ঠায় প্রদর্শিত IP প্রিন্ট করে।

ব্রাউজার বেশি খুললে মেমরি বেশি ব্যবহার হয়। কাজের কিউ তৈরি করুন এবং একসাথে চালানোর ব্রাউজার সংখ্যা নির্ধারণ করুন।

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

পেজ দ্রুত খুলতে কী করতে হবে?

প্রক্সি মাধ্যমে ছবি, ফন্ট, ভিডিও সব প্রক্সি মাধ্যমে গ্রহণ করলে ব্যান্ডউইথ এবং সময় বেশি লাগে। যদি শুধু টেক্সট এবং ডেটা প্রয়োজন হয়, page.setRequestInterception দিয়ে ছবি এবং ফন্ট রিকোয়েস্ট ব্লক করলে গতি বাড়বে এবং শেয়ার্ড প্ল্যানের মাসিক ব্যান্ডউইথও বাঁচবে।

waitUntil মানও গুরুত্বপূর্ণ। networkidle0 সব রিকোয়েস্ট শেষ হওয়া পর্যন্ত অপেক্ষা করে তাই ধীর হতে পারে, প্রয়োজনীয় এলিমেন্ট দেখা গেলে পরের ধাপে চলে যাওয়ার জন্য page.waitForSelector ব্যবহার ভালো।

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

একটি ব্রাউজারে প্রতিটি পৃষ্ঠার জন্য আলাদা IP ব্যবহার করা যায়?

Chrome-এর --proxy-server পুরো ব্রাউজারে প্রযোজ্য হয়, তাই পৃষ্ঠা অনুযায়ী ভিন্ন IP দেওয়া কঠিন। Puppeteer 22 এবং এর উপরে browser.createBrowserContext-এ proxyServer অপশন দিয়ে কনটেক্সট অনুযায়ী ভিন্ন প্রোক্সি ব্যবহার করা যায়। কনটেক্সটে কুকি এবং স্টোরেজ আলাদা থাকে, তাই অ্যাকাউন্ট অনুযায়ী কাজ করার জন্য এটি উপযুক্ত।

প্রসঙ্গে তৈরি পৃষ্ঠাগুলিও page.authenticate দ্বারা ব্যবহারকারী নাম এবং পাসওয়ার্ড পাস করা যেতে পারে। একাধিক ব্রাউজার খোলার চেয়ে এটি কম মেমরি ব্যবহার করে।

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

সেই দেশের ব্যবহারকারীর মতো দেখাতে কী মেলাতে হবে?

IP দেশের সাথে মিলিয়ে page.setExtraHTTPHeaders দিয়ে Accept-Language এবং page.emulateTimezone দিয়ে সময় অঞ্চল সেট করুন। ভাষা এবং সময় অঞ্চল IP দেশের সাথে মিল না থাকলে পৃষ্ঠাটি ভুল ভাষায় দেখা যেতে পারে বা তারিখ প্রদর্শন ভিন্ন হতে পারে।

স্ক্রিন আকার page.setViewport দিয়ে সেট করুন, এবং মোবাইল স্ক্রিন প্রয়োজন হলে puppeteer এর KnownDevices থেকে ডিভাইস সেটিং page.emulate এ পাস করুন।

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

দীর্ঘ চলমান টাস্কে ব্রাউজার স্থিতিশীল রাখতে কী করবেন?

সারা দিন চলমান কাজ ব্রাউজার একবার চালু করে ক্রমাগত ব্যবহার করার চেয়ে নির্দিষ্ট সংখ্যক পৃষ্ঠা প্রক্রিয়া করার পরে বন্ধ করে নতুন করে চালু করা আরও স্থিতিশীল। দীর্ঘ সময় চালু রাখা ব্রাউজার ক্রমাগত বেশি মেমরি ব্যবহার করে এবং একবার ত্রুটি ঘটলে পরবর্তী কাজগুলি সব বন্ধ হয়ে যেতে পারে।

প্রতিটি পেজের জন্য try এবং finally দিয়ে page.close অবশ্যই কল করুন, এবং goto-তে timeout যোগ করুন যাতে রেসপন্স না পাওয়া পেজে আটকে না যান। ব্যর্থ কাজ অন্য প্রক্সি দিয়ে নতুন ব্রাউজার খুলে আবার চেষ্টা করুন।

প্রক্সি রেসপন্স টাইম এবং এরর প্রতিটি প্রক্সির জন্য রেকর্ড রাখলে ধীর প্রক্সি চিহ্নিত করে ড্যাশবোর্ড কাস্টমার সার্ভিসে যোগাযোগ বা কাজের ব্যাচ পরিবর্তন করতে সাহায্য করে।

ঘন ঘন হওয়া ত্রুটির সমাধান কী?

net::ERR_INVALID_AUTH_CREDENTIALS বা 407 হলে page.authenticate মান ভুল বা newPage-এর পরে কল না করা হয়েছে। প্রতিটি পৃষ্ঠায় goto-এর আগে কল করা হয়েছে কিনা নিশ্চিত করুন।

net::ERR_PROXY_CONNECTION_FAILED হলে ঠিকানা বা পোর্ট ভুল। HTTP ঠিকানায় HTTP পোর্ট, SOCKS5 ঠিকানায় SOCKS5 পোর্ট ব্যবহার করেছেন কিনা নিশ্চিত করুন। SOCKS5-এ সংযোগ প্রত্যাখ্যান হলে IP অথেন্টিকেশনে সার্ভারের আউটগোয়িং IP রেজিস্টার করা আছে কিনা চেক করুন।

Puppeteer প্রোক্সি সেটিং, page.authenticate অথেন্টিকেশন | Socks5Proxy