Задать вопрос
@MIX89

Как встроить прокси в ChromeDriver на C#?

1. Не работает
ChromeOptions options = chromeDriversHelpers.GenerateChromeOptions(
    Uuid,
    userAgent,
    width,
    height,
    pixelRatio: 2,
    disableImage: true
);
options.AddArguments($"--proxy-server={proxyItem.IP}:{proxyItem.Port} --proxy-user={proxyItem.Login} --proxy-password={proxyItem.Password}");
var driver = UndetectedChromeDriver.Create(
    options,
    //browserExecutablePath: 
    driverExecutablePath: chromeDriversHelpers.GetPathToChomeDriver(0),
    headless: appSettings.headless,
    commandTimeout: TimeSpan.FromSeconds(appSettings.timeoutBrowser),
    hideCommandPromptWindow: true,
    userDataDir: Path.Combine(AppSettings.CurrentDir, "browser-data", "profiles", Uuid)
);
driver.GoToUrl(url);

// https://jiaopucun.com/2023/03/16/set-a-proxy-for-g...

2. ERR_NO_SUPPORTED_PROXIES
ChromeOptions options = chromeDriversHelpers.GenerateChromeOptions(
    Uuid,
    userAgent,
    width,
    height,
    pixelRatio: 2,
    disableImage: true
);
options.AddArguments($"--proxy-server=\"{proxyItem.Login}:{proxyItem.Password}@{proxyItem.IP}:{proxyItem.Port}\""); 
var driver = UndetectedChromeDriver.Create(
    options,
    //browserExecutablePath: 
    driverExecutablePath: chromeDriversHelpers.GetPathToChomeDriver(0),
    headless: appSettings.headless,
    commandTimeout: TimeSpan.FromSeconds(appSettings.timeoutBrowser),
    hideCommandPromptWindow: true,
    userDataDir: Path.Combine(AppSettings.CurrentDir, "browser-data", "profiles", Uuid)
);
driver.GoToUrl(url);


3. Просит вручную вводить логин и пароль от прокси
ChromeOptions options = chromeDriversHelpers.GenerateChromeOptions(
    Uuid,
    userAgent,
    width,
    height,
    pixelRatio: 2,
    disableImage: true
);
options.AddArgument($"--proxy-server=http://{proxyItem.IP}:{proxyItem.Port}");
options.AddArgument($"--proxy-auth={proxyItem.Login}:{proxyItem.Password}");
var driver = UndetectedChromeDriver.Create(
    options,
    //browserExecutablePath: 
    driverExecutablePath: chromeDriversHelpers.GetPathToChomeDriver(0),
    headless: appSettings.headless,
    commandTimeout: TimeSpan.FromSeconds(appSettings.timeoutBrowser),
    hideCommandPromptWindow: true,
    userDataDir: Path.Combine(AppSettings.CurrentDir, "browser-data", "profiles", Uuid)
);
driver.GoToUrl(url);


Эти базовые варианты не работают как я ожидаю.

Я хочу указать прокси и что бы они применились на все запросы в запущенном браузере и логин и пароль автоматически подставились, без ручного ввода.

Ожидаемое поведение.
Программа запускает например 3 браузера и каждый берет свою прокси и подставляет. Все последующие запросы в каждом браузере идут через свои прокси.

Как это реализовать ?

Вариант с расширением не предлагать. В текущее время это очень трудно затратный процесс.
1. Генерится файл с расширением.
2. Конвертируется в crx формат, потому что сейчас в текущей последней версии не удается просто указать путь к папке с расширением

var (tempDir, zipPath) = ChromeProxyAuthExtensionHelper.CreateProxyAuthExtension(proxyItem.IP, proxyItem.Port, proxyItem.Login, proxyItem.Password);
//options.AddExtension(extensionPath);
//options.AddArgument($"--load-extension=\"{tempDir}\"");
//options.AddAdditionalOption("extensions", new[] { extensionPath });

Что бы получить crx нужно генерить сертификаты, подписывать в специальном формате файл и надеется что хром текущей версии будет читать его.

UPD:
У меня вышло только так пока - 2 варианта, что работают, но хочется по нормальному.

// 1
options.AddArgument($"--proxy-server=http://{proxyItem.IP}:{proxyItem.Port}");
AutoItX.WinWait("Войти", "", 1);
AutoItX.Send(proxyItem.Login);
AutoItX.Send("{TAB}");
AutoItX.Send(proxyItem.Password);
AutoItX.Send("{ENTER}");
driver.GoToUrl(url);


// 2
options.AddArgument($"--proxy-server=http://{proxyItem.IP}:{proxyItem.Port}");
var network = driver.Manage().Network;
var authHandler = new NetworkAuthenticationHandler
{
    UriMatcher = uri => true,
    Credentials = new PasswordCredentials(proxyItem.Login, proxyItem.Password)
};
network.AddAuthenticationHandler(authHandler);
await network.StartMonitoring();
driver.GoToUrl(url);
await network.StopMonitoring();
  • Вопрос задан
  • 70 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы