SOCKS5-прокси — это популярный инструмент для анонимизации трафика и обхода ограничений. Однако большинство современных браузеров (Chrome, Firefox) не поддерживают SOCKS5-прокси с авторизацией (логин и пароль) напрямую. Playwright, мощный инструмент для автоматизации браузеров, также имеет ограничения: он позволяет использовать SOCKS5-прокси без авторизации, но не поддерживает аутентификацию. В этой статье мы разберем, как обойти это ограничение с помощью дополнительных библиотек, таких как

socks-proxy-agent

и

proxy-chain

Проблема: Playwright и SOCKS5-прокси с авторизацией

Playwright предоставляет встроенную поддержку SOCKS5-прокси, но без авторизации. Пример базовой настройки:

const { chromium } = require('playwright');  
(async () => {  
    const browser = await chromium.launch({  
    proxy: {  
    server: 'socks5://127.0.0.1:1080' // SOCKS5 без авторизации  
}  
});  
const page = await browser.newPage();  
await page.goto('https://example.com');  
await browser.close();  
})();

Однако если ваш прокси требует логин и пароль, этот код не сработает. Для решения проблемы потребуются сторонние библиотеки.

Решение 1: Использование socks-proxy-agent и node-fetch

Если вам нужно выполнять HTTP/HTTPS-запросы через SOCKS5-прокси с авторизацией, используйте

socks-proxy-agent

и

node-fetch

Установка зависимостей:

npm install socks-proxy-agent node-fetch

Пример кода:

const { SocksProxyAgent } = require('socks-proxy-agent');  
const http = require('http');  

async function **startProxy**() {  

  *// Настройки SOCKS5 прокси*  
const proxyUrl = 'socks5://login:password@proxy:port';  
  const agent = new SocksProxyAgent(proxyUrl);  

  *// Создаем локальный прокси-сервер*  
  const server = http.createServer((*req*, *res*) => {  
    const options = {  
      method: *req*.method,  
      headers: *req*.headers,  
      agent: agent  
    };  
    const proxyReq = http.request('https://example.com', options, (*proxyRes*) => {  
      *res*.writeHead(*proxyRes*.statusCode, *proxyRes*.headers);  
      *proxyRes*.pipe(*res*);  
    });  
    *req*.pipe(proxyReq);  
  });  

  *// Запускаем локальный сервер*  
  server.listen(8080, () => {  
    console.log('Прокси-сервер запущен на порту 8080');  
    openBrowser();  
  });  
}  
async function **openBrowser**() {  
  const { chromium } = require('playwright');  
  try {  
    const browser = await chromium.launch({  
      headless: false,  
      args: ['--start-maximized']  
    });  
    const context = await browser.newContext();  
    const page = await context.newPage();  

    *// Открываем через локальный прокси*  
    await page.goto('http://localhost:8080');  
    *// Держим браузер открытым*  
    await new Promise(() => {});  
  } catch (error) {  
    console.error('Ошибка:', error);  
  }  
}  
startProxy();

Ограничения:

  • Этот метод работает только для HTTP/HTTPS-запросов, а не для автоматизации браузера через Playwright.

Решение 2: Использование proxy-chain для автоматизации в Playwright

Для работы с браузером через SOCKS5-прокси с авторизацией можно создать промежуточный HTTP-прокси с помощью библиотеки

proxy-chain

Установка зависимостей:

npm install proxy-chain

Пример кода:

const { chromium } = require('playwright');  
const ProxyChain = require('proxy-chain');  

async function **openBrowser**() {  
  const oldProxyUrl = 'socks5://login:password@proxy:port';  
  try {  

    *// Создаем новый прокси URL без аутентификации*  
    const newProxyUrl = await ProxyChain.anonymizeProxy(oldProxyUrl);  
    console.log('Запускаем браузер с прокси...');  

    *// Запускаем браузер с анонимизированным прокси*  
    const browser = await chromium.launch({  
      headless: false,  
      args: [  
        '--start-maximized',  
        `--proxy-server=${newProxyUrl}`  
      ]  
    });  
    const context = await browser.newContext();  
    const page = await context.newPage();  
    console.log('Открываем example.com...');  
    await page.goto('https://example.com');  
    *// Держим браузер открытым*  
    await new Promise(() => {});  
  } catch (error) {  
    console.error('Ошибка:', error);  
  }  
}  
openBrowser();

Как это работает:

  1. proxy-chain создает HTTP-прокси на локальном порту (например, 8080)

  2. Этот прокси перенаправляет трафик на SOCKS5-прокси с авторизацией.

  3. Playwright использует локальный HTTP-прокси, который не требует авторизации.

Заключение

  • Playwright поддерживает SOCKS5-прокси без авторизации.
  • Для работы с авторизацией используйте:
  • socks-proxy-agent + node-fetch для HTTP-запросов.
  • proxy-chain для автоматизации браузера.
  • Выбор метода зависит от ваших задач: автоматизация браузера, API-запросы или анонимность.