Socks5Proxy

Pengaturan proxy Puppeteer, menghubungkan dengan --proxy-server dan page.authenticate

Panduan ini menjelaskan cara menghubungkan HTTP proxy Socks5Proxy ke argumen --proxy-server dan autentikasi page.authenticate saat menjalankan Chrome dengan Puppeteer, koneksi SOCKS5, serta kode untuk membuka browser dengan beberapa IP.

Bagaimana cara kerja proxy di Puppeteer?

Puppeteer menentukan proxy melalui argumen saat menjalankan Chrome. Jika Anda memasukkan alamat ke --proxy-server, semua halaman di browser tersebut akan menggunakan proxy yang sama. Nama pengguna dan kata sandi proxy HTTP tidak bisa dimasukkan sebagai argumen, jadi Anda harus meneruskannya dengan page.authenticate setelah membuka halaman. Dengan begitu, Puppeteer akan otomatis merespons saat proxy meminta autentikasi.

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

npm install puppeteer

Bagaimana cara menghubungkan HTTP proxy dengan autentikasi?

Tambahkan --proxy-server=198.51.100.23:8000 ke args launch, dan setelah membuat halaman dengan newPage, berikan username dan password ke page.authenticate. Autentikasi diperlukan untuk setiap halaman, jadi lakukan panggilan yang sama setiap kali membuat halaman baru.

Situs HTTPS tetap bisa dibuka. Browser membuat tunnel CONNECT dan berkomunikasi secara terenkripsi di dalamnya.

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

Bagaimana cara menggunakan proxy SOCKS5?

Masukkan alamat socks5:// ke --proxy-server. Namun, Chrome tidak mendukung autentikasi username/password untuk SOCKS proxy, sehingga page.authenticate tidak berlaku untuk SOCKS5. Untuk koneksi SOCKS5, gunakan IP authorization di dashboard dengan mendaftarkan IPv4 server tempat kode ini dijalankan.

Jika lingkungan Anda mengharuskan koneksi dengan username dan password, cara paling sederhana adalah menggunakan port HTTP dari IP yang sama. IP yang sama berarti lokasi yang terlihat oleh situs target juga sama.

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

Bagaimana cara membuka beberapa browser dengan IP yang berbeda?

Chrome hanya mendukung satu proxy per browser yang dijalankan. Jika membutuhkan IP yang berbeda, Anda perlu menjalankan browser secara terpisah. Kode berikut mengambil daftar ip:port:user:pass dari API dan membuka 3 browser dengan IP berbeda, lalu menampilkan IP yang terlihat di setiap halaman.

Membuka banyak browser akan memakan banyak memori. Disarankan untuk membuat antrian tugas dan menentukan jumlah browser yang bisa dijalankan secara bersamaan.

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

Bagaimana cara membuka halaman lebih cepat?

Melewati proxy berarti gambar, font, dan video juga diambil melalui proxy, membutuhkan lebih banyak bandwidth dan waktu. Jika yang dibutuhkan hanya teks dan data, memblokir permintaan gambar dan font dengan page.setRequestInterception dapat mempercepat dan menghemat bandwidth bulanan paket shared.

Nilai waitUntil juga penting. networkidle0 menunggu hingga semua permintaan selesai dan bisa lambat, jadi lebih baik menggunakan page.waitForSelector untuk langsung melanjutkan setelah elemen yang diperlukan terlihat.

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

Bisakah menggunakan IP berbeda untuk setiap halaman dalam satu browser?

Opsi --proxy-server di Chrome berlaku untuk seluruh browser, sehingga sulit menggunakan IP berbeda per halaman. Puppeteer 22+ mendukung proxyServer di browser.createBrowserContext untuk menggunakan proxy berbeda per konteks. Konteks terisolasi dengan cookie dan penyimpanan terpisah, cocok untuk pekerjaan multi-akun.

Halaman yang dibuat dalam konteks juga bisa menggunakan page.authenticate untuk mengirim username dan password. Ini menggunakan lebih sedikit memori dibandingkan membuka beberapa browser.

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

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

Gunakan page.setExtraHTTPHeaders untuk mengatur Accept-Language dan page.emulateTimezone untuk zona waktu sesuai negara IP. Jika bahasa dan zona waktu berbeda dengan negara IP, halaman mungkin muncul dalam bahasa yang salah atau format tanggal yang berbeda.

Atur ukuran layar dengan page.setViewport, dan jika Anda memerlukan layar ponsel, gunakan pengaturan perangkat dari KnownDevices puppeteer dan teruskan ke 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 });

Bagaimana menjaga browser tetap stabil untuk tugas jangka panjang?

Untuk pekerjaan yang berjalan sepanjang hari, lebih stabil menutup dan membuka kembali browser setelah memproses sejumlah halaman tertentu daripada membiarkannya terbuka terus. Browser yang dibiarkan terbuka lama akan menggunakan memori semakin banyak, dan sekali terjadi error, semua pekerjaan berikutnya bisa berhenti.

Pastikan memanggil page.close dengan try dan finally di setiap halaman, dan tambahkan timeout ke goto agar tidak terjebak di halaman yang tidak merespons. Jika gagal, coba lagi dengan proxy lain dan buka browser baru.

Mencatat waktu respons dan error per proxy membantu menemukan baris yang lambat untuk menghubungi dukungan pelanggan atau mengubah batch pekerjaan.

Bagaimana cara menyelesaikan kesalahan yang sering terjadi?

net::ERR_INVALID_AUTH_CREDENTIALS atau 407 terjadi jika nilai page.authenticate salah atau tidak dipanggil setelah newPage. Pastikan memanggilnya sebelum goto di setiap halaman.

net::ERR_PROXY_CONNECTION_FAILED terjadi jika alamat atau port salah. Pastikan menggunakan port HTTP untuk alamat HTTP, dan port SOCKS5 untuk alamat SOCKS5. Jika koneksi SOCKS5 ditolak, periksa apakah IP keluar server terdaftar dalam otorisasi IP.

Pengaturan proxy Puppeteer, autentikasi page.authenticate | Socks5Proxy