Как установить прокси-аутентификацию (пользователя и пароль) с помощью python selenium

Я использую веб-драйвер Firefox в Python 2.7 с Selenium. Моя программа на Python запускает браузер Firefox и посещает различные веб-сайты, когда я запускаю программу. Но мне нужно настроить прокси-сервер с аутентификацией, чтобы при посещении программой любого веб-сайта она проходила через прокси-сервер.

Есть несколько похожих очередей на SO. Но не существует конкретного решения для веб-драйвера Selenium Firefox Python.

6 ответов

Дубликат: Как установить имя пользователя: пароль для АУТЕНТИФИКАЦИИ прокси с помощью Python/Selenium

Селен-провод: https://github.com/wkeeling/selenium-wire

Установить селен-провод

pip install selenium-wire

Импортируйте это

from seleniumwire import webdriver

Авторизация на прокси

options = {
'proxy': {
    'http': 'http://username:password@host:port',
    'https': 'https://username:password@host:port',
    'no_proxy': 'localhost,127.0.0.1,dev_server:8080'
    }
}
driver = webdriver.Firefox(seleniumwire_options=options)

Предупреждение.
Взгляните в папку кэша selenium-wire. У меня была проблема, потому что она занимала все мое дисковое пространство. Вы должны иногда удалять его в своем скрипте, когда хотите.

В дополнение к запуску Firefox с профилем, в котором сохранены учетные данные. Вы можете сделать это, загрузив расширение, которое пишет в loginTextbox а также password1Textbox из chrome://global/content/commonDialog.xul (альтернативное окно).

Уже есть некоторые расширения, которые сделают эту работу. Например: Close Proxy Authentication

https://addons.mozilla.org/firefox/downloads/latest/close-proxy-authentication/addon-427702-latest.xpi

from selenium import webdriver
from base64 import b64encode

proxy = {'host': HOST, 'port': PORT, 'usr': USER, 'pwd': PASSWD}

fp = webdriver.FirefoxProfile()

fp.add_extension('closeproxy.xpi')
fp.set_preference('network.proxy.type', 1)
fp.set_preference('network.proxy.http', proxy['host'])
fp.set_preference('network.proxy.http_port', int(proxy['port']))
# ... ssl, socks, ftp ...
fp.set_preference('network.proxy.no_proxies_on', 'localhost, 127.0.0.1')

credentials = '{usr}:{pwd}'.format(**proxy)
credentials = b64encode(credentials.encode('ascii')).decode('utf-8')
fp.set_preference('extensions.closeproxyauth.authtoken', credentials)

driver = webdriver.Firefox(fp)

Вы можете написать собственное расширение firefox для прокси и запускать из селена. Вам нужно написать 2 файла и запаковать их.

фон.js

      var proxy_host = "YOUR_PROXY_HOST";
var proxy_port = YOUR_PROXY_PORT;

var config = {
    mode: "fixed_servers",
    rules: {
      singleProxy: {
        scheme: "http",
        host: proxy_host,
        port: proxy_port
      },
      bypassList: []
    }
 };


function proxyRequest(request_data) {
    return {
        type: "http",
        host: proxy_host, 
        port: proxy_port
    };
}

browser.proxy.settings.set({value: config, scope: "regular"}, function() {;});

function callbackFn(details) {
return {
    authCredentials: {
        username: "YOUR_USERNAME",
        password: "YOUR_PASSWORD"
    }
};
}

browser.webRequest.onAuthRequired.addListener(
        callbackFn,
        {urls: ["<all_urls>"]},
        ['blocking']
);

browser.proxy.onRequest.addListener(proxyRequest, {urls: ["<all_urls>"]});

manifest.json

      {
  "name": "My Firefox Proxy",
  "version": "1.0.0b",
  "manifest_version": 2,
  "permissions": [
    "browsingData",
    "proxy",
    "storage",
    "tabs",
    "webRequest",
    "webRequestBlocking",
    "downloads",
    "notifications",
    "<all_urls>"
  ],
  "background": {
    "scripts": ["background.js"]
  },
  "browser_specific_settings": {
    "gecko": {
      "id": "myproxy@example.org"
    }
  }
}

Затем вам нужно запаковать эти файлы в zip-архив в режиме DEFLATED с расширением .xpi в конце, например my_proxy_extension.xpi.

У вас есть два варианта:

  1. Подпишите ваше расширение Структура файла расширения .xpi для Firefox: описание, содержимое, создание и установка

ИЛИ ЖЕ

  1. Запустить без подписи. Для этого шага:

    1. Откройте флаги firefox в about:config и установите для параметров xpinstall.signatures.required значение false .

      ИЛИ ЖЕ

    2. Обновите профиль Firefox в:

      Windows : C:\Program Files\Mozilla Firefox\defaults\pref\channel-prefs.js

      Linux : /etc/firefox/syspref.js

    Добавьте следующую строку в конец файла:

             pref("xpinstall.signatures.required",false);
    

После этих шагов запустите селен и установите это расширение:

      from selenium import webdriver

driver = webdriver.Firefox()
driver.install_addon("path/to/my_proxy_extension.xpi")

driver.get("https://yoursite.com")


 

Существует пример для Firefox + Python, но без аутентификации здесь. Затем вы можете найти другие доступные параметры здесь в исходном коде. Похоже, вам нужно следующее:

socksUsername
socksPassword

Например:

from selenium import webdriver
from selenium.webdriver.common.proxy import *

myProxy = "host:8080"

proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': myProxy, # set this value as desired
    'ftpProxy': myProxy,  # set this value as desired
    'sslProxy': myProxy,  # set this value as desired
    'noProxy': ''         # set this value as desired
    'socksUsername': = ''
    'socksPassword': = ''
    })

driver = webdriver.Firefox(proxy=proxy)

или с настройками:

driverPref = webdriver.FirefoxProfile()
driverPref.set_preference("network.proxy.type", 1)
.
.
.
driverPref.set_preference('network.proxy.socks', proxyHost)
driverPref.set_preference('network.proxy.socks_port', proxyPort)
driverPref.update_preferences()

driver = webdriver.Firefox(firefox_profile=driverPref)

РЕДАКТИРОВАТЬ:

Я посмотрел на это еще раз, и кажется, что невозможно установить детали проверки подлинности в FF, даже вручную. Единственный способ - просто запомнить уже введенные вами данные, которые выполняются двумя параметрами:

signon.autologin.proxy=true
network.websocket.enabled=false

который может быть настроен с set_preference() метод. Вы также можете вручную просмотреть все параметры FF, перейдя к about:config,

В дополнение к ответу с расширением.

Вы также можете использовать заполнение форм для динамического изменения учетных данных на вашем прокси. Просто загрузите страницу расширения, заполните форму автоматически и нажмите "Сохранить"!

Мы можем переключиться на окно предупреждения об аутентификации и ввести имя пользователя и пароль вручную.

      profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference('network.proxy.ssl_port', int(ProxyPort))
profile.set_preference('network.proxy.ssl', ProxyHost)
profile.set_preference("network.proxy.http", ProxyHost)
profile.set_preference("network.proxy.http_port", int(ProxyPort))

webdriver = webdriver.Firefox(firefox_profile=profile, executable_path=GECKO_DRIVER_PATH)

webdriver.get("https://whatismyipaddress.com/")
try:
    alert = webdriver.switch_to_alert()
    print("switched to alert window")
    alert.send_keys(proxy_username + Keys.TAB + proxy_password)
    alert.accept()
    webdriver.switch_to.default_content()
except Exception:
    print("Error in alert switch")
    pass
Другие вопросы по тегам