إعداد بروكسي Playwright، توصيل عناوين IP مختلفة لكل متصفح وسياق
يشرح هذا الدليل كيفية توصيل بروكسي HTTP وSOCKS5 من Socks5Proxy في خيار proxy لـ Playwright باستخدام server، username، وpassword، وكيفية استخدام عناوين IP مختلفة لكل سياق متصفح في Node.js وPython.
ما هو الإعداد الأكثر ملاءمة للبروكسي في Playwright؟
يقبل Playwright عنوان البروكسي واسم المستخدم وكلمة المرور كخيار proxy واحد، لذا لا داعي للتعامل مع نوافذ المصادقة بشكل منفصل. تعمل نفس الخيارات مع جميع المتصفحات: Chromium وFirefox وWebKit.
يمكنك أيضًا تشغيل متصفح واحد وإنشاء عدة سياقات داخله، مع إعطاء كل سياق وكيل مختلف. السياقات هي ملفات تعريف منفصلة مع كوكيز ومخزن منفصل، لذا يمكنك إدارة عدة IPs وجلسات باستخدام متصفح واحد وتوفير الذاكرة.
يستخدم المثال عنوان IP 198.51.100.23 ومنفذ HTTP 8000 ومنفذ SOCKS5 1080 واسم المستخدم spx_user وكلمة المرور spx_pass.
npm install playwright
npx playwright install chromiumكيف يمكنني ربط بروكسي HTTP بالمتصفح بالكامل؟
أضف server و username و password إلى خيار proxy في launch لاستخدام نفس الوكيل لجميع صفحات المتصفح. يتم نقل مواقع HTTPS عبر نفق CONNECT مشفر.
import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();كيفية استخدام IP مختلف لكل سياق؟
إضافة خيار proxy إلى newContext يجعل هذا السياق فقط يستخدم الوكيل. يوضح الكود أدناه كيفية إنشاء 3 سياقات بعناوين IP مختلفة وعرض IP كل منها. لإدارة حسابات متعددة في وقت واحد، قم بإقران كل حساب مع IP في سياق منفصل.
في بعض إصدارات Chromium وفي بيئة Windows، كان من الضروري وجود خيار proxy في launch لاستخدام بروكسي لكل سياق. في هذه الحالة، يمكنك إدخال البروكسي الأول في launch ثم التجاوز لكل سياق.
import { chromium } from "playwright";
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);
const browser = await chromium.launch();
for (const line of lines) {
const [ip, port, user, pass] = line.trim().split(":");
const context = await browser.newContext({
proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
locale: "en-US",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(ip, await page.textContent("body"));
await context.close();
}
await browser.close();كيف يتم استخدام بروكسي SOCKS5؟
أضف عنوان socks5:// إلى server. لا يدعم Chromium مصادقة اسم المستخدم/كلمة المرور لـ SOCKS5، لذا نوصي باستخدام تفويض IP مع SOCKS5. سجل IPv4 لخادم التنفيذ في لوحة التحكم واستخدم server فقط بدون username أو password.
إذا كنت بحاجة إلى الاتصال باستخدام اسم المستخدم وكلمة المرور، يمكنك استخدام منفذ HTTP لنفس IP. سيظهر الموقع نفسه لأنك تستخدم نفس IP.
import { chromium } from "playwright";
const browser = await chromium.launch({
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.textContent("body"));
await browser.close();كيفية الاستخدام في Python؟
يتبع Playwright لـ Python نفس الهيكل. أضف server و username و password إلى قاموس proxy. ستجد مثالًا للطريقة المتزامنة أدناه. خيارات الطريقة غير المتزامنة هي نفسها.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://198.51.100.23:8000",
"username": "spx_user",
"password": "spx_pass",
})
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.text_content("body"))
browser.close()ما الذي يجب ضبطه لجعل النتائج تبدو وكأنها من مستخدمين في تلك الدولة؟
قم بتعيين locale و timezoneId في السياق لتتناسب مع دولة IP، حتى يتم عرض الصفحة باللغة والوقت المناسبين لمستخدمي تلك الدولة. على سبيل المثال، إذا كان IP من ألمانيا، استخدم locale de-DE و timezoneId Europe/Berlin.
إذا لم تكن بحاجة إلى الصور ومقاطع الفيديو، يمكنك حظر هذه الطلبات باستخدام page.route لتوفير النطاق الترددي والوقت. الخطط المشتراة لها نطاق ترددي شهري محدد، مما يجعل هذا مفيدًا بشكل خاص.
- ضبط locale و timezoneId ليتطابقا مع بلد IP
- سياق واحد، حساب واحد، IP واحد
- حظر طلبات الصور/الفيديو غير الضرورية باستخدام page.route
- SOCKS5 يعمل مع تفويض IP، بينما اسم المستخدم وكلمة المرور لمنفذ HTTP
كيف يمكنني الحصول على القائمة تلقائيًا وتقسيمها لكل مهمة؟
يُرجع GET /proxies في API قائمة JSON مع IP، المنفذ، والدولة لكل سطر. يمكنك استقبال القائمة حسب الدولة لإنشاء قائمة مناسبة للمهام حسب الدولة. الكود التالي هو مثال لاستقبال وكيلات الولايات المتحدة فقط وإنشاء سياقات حسب عدد المهام. يمكنك التحقق من أسماء حقول الاستجابة في وثائق API.
إذا كانت لديك العديد من المهام، لا تترك السياق مفتوحًا حتى النهاية، بل أغلقه بعد كل مهمة لإعادة الذاكرة.
import { chromium } from "playwright";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();
const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
const context = await browser.newContext({
proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
locale: "en-US",
timezoneId: "America/New_York",
});
const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await context.close();
}
await browser.close();كيف يمكنني توفير النطاق الترددي عن طريق حظر الطلبات غير الضرورية؟
حظر طلبات الصور والخطوط ومقاطع الفيديو باستخدام page.route أو context.route يسرع تحميل الصفحة ويوفر نطاقًا تردديًا للوكيل. هذا مفيد بشكل خاص في مهام جمع البيانات.
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});هل يمكن استخدام نفس البروكسي في Firefox و WebKit؟
نعم. Playwright يدعم نفس خيارات البروكسي لجميع المتصفحات الثلاثة. إذا كنت جزءًا من فريق اختبار، يمكنك استخدام نفس البروكسي لفتح Chromium، Firefox، وWebKit بالتتابع للتحقق من أن الصفحات متطابقة عبر المتصفحات.
Firefox لا يدعم مصادقة اسم المستخدم وكلمة المرور لـ SOCKS5 في المتصفح، مثل Chromium، لذا قم بتوصيل SOCKS5 عبر IP تفويض. منفذ HTTP يتصل عبر اسم المستخدم وكلمة المرور في جميع المتصفحات الثلاثة.
إذا كنت تستخدم Playwright Test، يمكنك إضافة proxy إلى قسم use في ملف playwright.config لتطبيقه على جميع الاختبارات، أو تقسيم المشروع حسب الدولة وإعطاء بروكسي مختلف لكل منها.
import { defineConfig } from "@playwright/test";
export default defineConfig({
projects: [
{ name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
{ name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
],
});كيف يتم حل الأخطاء الشائعة؟
net::ERR_PROXY_CONNECTION_FAILED تشير إلى عنوان أو منفذ خادم غير صحيح. الأخطاء 407 أو المتعلقة بالمصادقة تتطلب التحقق من username و password. خطأ Browser does not support socks5 proxy authentication يظهر عند استخدام اسم مستخدم وكلمة مرور مع SOCKS5. استخدم تفويض IP أو المنفذ HTTP بدلاً من ذلك.