Socks5Proxy

Pengaturan proxy Playwright, menghubungkan IP berbeda untuk setiap browser dan konteks

Panduan ini menjelaskan cara menghubungkan HTTP proxy dan SOCKS5 proxy Socks5Proxy ke opsi proxy Playwright dengan server, username, password, serta cara menggunakan IP berbeda per konteks dalam satu browser dengan kode Node.js dan Python.

Apa yang paling mudah dalam pengaturan proxy Playwright?

Playwright menerima alamat proxy, nama pengguna, dan kata sandi dalam satu opsi proxy sehingga tidak perlu menangani jendela autentikasi secara terpisah. Ketiga browser (Chromium, Firefox, WebKit) menggunakan opsi yang sama.

Anda juga bisa menjalankan satu browser dengan beberapa konteks, memberi proxy berbeda per konteks. Konteks adalah profil terpisah dengan cookie dan penyimpanan terpisah, sehingga satu browser bisa menangani beberapa IP dan sesi sekaligus, menghemat memori.

Contoh menggunakan IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, username spx_user, password spx_pass.

npm install playwright
npx playwright install chromium

Bagaimana cara menghubungkan proxy HTTP ke seluruh browser?

Tambahkan server, username, dan password ke opsi proxy launch, maka semua halaman di browser tersebut akan menggunakan proxy yang sama. Situs HTTPS dikirimkan melalui terowongan CONNECT yang terenkripsi.

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();

Bagaimana menggunakan IP berbeda untuk setiap konteks?

Dengan menambahkan opsi proxy ke newContext, hanya konteks tersebut yang akan menggunakan proxy itu. Kode berikut mengambil daftar melalui API, membuat 3 konteks dengan IP berbeda, dan menampilkan IP yang terlihat di setiap konteks. Untuk menangani banyak akun sekaligus, pasangkan satu akun dengan satu IP dalam satu konteks.

Beberapa versi Chromium dan lingkungan Windows memerlukan opsi proxy di launch untuk proxy per konteks. Solusinya, tambahkan proxy pertama di launch lalu timpa untuk setiap konteks.

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();

Bagaimana cara menggunakan proxy SOCKS5?

Gunakan alamat socks5:// untuk server. Chromium tidak mendukung autentikasi username/password untuk proxy SOCKS5, jadi disarankan menggunakan otorisasi IP dengan SOCKS5. Daftarkan IPv4 server eksekusi di dashboard dan gunakan hanya server tanpa username dan password.

Jika harus terhubung dengan username dan password, gunakan port HTTP dari IP yang sama. IP dan lokasi yang terlihat oleh situs target akan sama.

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();

Bagaimana cara menggunakannya di Python?

Playwright untuk Python memiliki struktur yang sama. Masukkan server, username, password ke kamus proxy. Contoh sinkron ada di bawah. Nama opsi untuk versi asinkron juga sama.

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()

Apa yang perlu disesuaikan agar hasil terlihat seperti pengguna dari negara tersebut?

Atur locale dan timezoneId pada context sesuai negara IP agar halaman dirender dengan bahasa dan waktu yang sesuai untuk pengguna di negara tersebut. Misalnya untuk IP Jerman, gunakan locale de-DE dan timezoneId Europe/Berlin.

Jika gambar dan video tidak diperlukan, Anda dapat memblokir permintaan tersebut dengan page.route untuk menghemat bandwidth dan waktu. Ini sangat membantu untuk paket bersama dengan bandwidth bulanan yang terbatas.

  • Sesuaikan locale dan timezoneId dengan negara IP
  • Satu konteks, satu akun, satu IP
  • Blokir permintaan gambar/video yang tidak perlu dengan page.route
  • SOCKS5 menggunakan IP authorization, username/password menggunakan port HTTP

Bagaimana cara menerima daftar secara otomatis dan membaginya untuk setiap tugas?

GET /proxies di API mengembalikan JSON dengan IP, port, dan negara per baris. Dengan menambahkan kondisi negara, Anda bisa langsung membuat daftar yang sesuai untuk tugas per negara. Kode berikut adalah contoh pembuatan konteks sebanyak tugas untuk proxy AS saja. Nama kolom respon bisa dilihat di dokumentasi API.

Jika Anda memiliki banyak pekerjaan, jangan biarkan konteks tetap terbuka, tutup setiap kali pekerjaan selesai untuk mengembalikan memori.

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();

Bagaimana cara menghemat bandwidth dengan memblokir permintaan yang tidak perlu?

Dengan page.route atau context.route untuk memblokir permintaan gambar, font, atau video, halaman akan terbuka lebih cepat dan menghemat bandwidth proxy. Sangat efektif untuk tugas pengumpulan data yang hanya membutuhkan data.

await context.route("**/*", (route) => {
  const type = route.request().resourceType();
  return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});

Apakah proxy yang sama bisa digunakan di Firefox dan WebKit?

Ya. Playwright menerima opsi proxy yang sama untuk ketiga browser. Tim pengujian dapat menjalankan Chromium, Firefox, WebKit secara bergantian dengan proxy sama untuk memverifikasi konsistensi tampilan per negara.

Seperti Chromium, Firefox tidak mendukung autentikasi username/password untuk SOCKS5 di browser, jadi gunakan otorisasi IP untuk SOCKS5. Port HTTP bisa menggunakan username dan password di ketiga browser.

Jika menggunakan Playwright Test, Anda bisa menambahkan proxy ke bagian use di playwright.config untuk menerapkannya ke semua tes, atau membagi proyek per negara dan memberikan proxy yang berbeda untuk masing-masing.

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" } } },
  ],
});

Bagaimana cara menyelesaikan kesalahan yang sering terjadi?

net::ERR_PROXY_CONNECTION_FAILED terjadi jika alamat atau port server salah. Error 407 atau terkait autentikasi, periksa nilai username dan password. Error 'Browser does not support socks5 proxy authentication' muncul saat menggunakan username dan password dengan SOCKS5. Ubah ke otorisasi IP atau gunakan port HTTP.

Pengaturan proxy Playwright, IP berbeda per browser·konteks | Socks5Proxy