Skip to content

Instantly share code, notes, and snippets.

@rajat-np

rajat-np/proxy.py

Last active Mar 19, 2021
Embed
What would you like to do?
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.chrome.options import Options
import zipfile,os
def proxy_chrome(PROXY_HOST,PROXY_PORT,PROXY_USER,PROXY_PASS):
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%(host)s",
port: parseInt(%(port)d)
},
bypassList: ["foobar.com"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%(user)s",
password: "%(pass)s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
""" % {
"host": PROXY_HOST,
"port": PROXY_PORT,
"user": PROXY_USER,
"pass": PROXY_PASS,
}
pluginfile = 'extension/proxy_auth_plugin.zip'
with zipfile.ZipFile(pluginfile, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
co = Options()
#extension support is not possible in incognito mode for now
#co.add_argument('--incognito')
co.add_argument('--disable-gpu')
#disable infobars
co.add_argument('--disable-infobars')
co.add_experimental_option("excludeSwitches",["ignore-certificate-errors"])
#location of chromedriver, please change it according to your project.
chromedriver = os.getcwd()+'/Chromedriver/chromedriver'
co.add_extension(pluginfile)
driver = webdriver.Chrome(chromedriver,chrome_options=co)
#return the driver with added proxy configuration.
return driver
@gregorleban

This comment has been minimized.

Copy link

@gregorleban gregorleban commented Mar 22, 2019

Hi Rajat,

thank you for this clip. It works great if I create Chrome with a visible window, but if I set also co.add_argument("--headless") then I get an exception while creating Chrome driver:

unknown error: failed to wait for extension background page to load: chrome-extension://jbflbinpmhgggppkkcgkgokiankgofla/_generated_background_page.html from unknown error: page could not be found: chrome-extension://jbflbinpmhgggppkkcgkgokiankgofla/_generated_background_page.html   (Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64) 
  File "E:\development\IJS\EventRegistry\python\ERAnalytics\ArticleDetectAdsInBody.py", line 83, in urlTaskLoop
    chromeDriver2 = webdriver.Chrome(chrome_options=options2, executable_path="chromedriver.exe")

Any idea how to fix this?

@repen

This comment has been minimized.

Copy link

@repen repen commented Jun 25, 2019

thank you.
My moped went

@JasonCrowe

This comment has been minimized.

Copy link

@JasonCrowe JasonCrowe commented Sep 11, 2019

Any idea how to fix this?

I am running into the same issue. Did anyone find a way around it?

@rajat-np

This comment has been minimized.

@taimursaeed

This comment has been minimized.

Copy link

@taimursaeed taimursaeed commented Nov 14, 2019

Is is possible to make use of multiple proxies without opening multiple chrome windows
Currently when i initialize new instance of proxy_chrome it opens up a new window

@saileshkush95

This comment has been minimized.

Copy link

@saileshkush95 saileshkush95 commented Jan 28, 2020

Screen Shot 2020-01-28 at 4 10 19 PM

@aziz06193

This comment has been minimized.

Copy link

@aziz06193 aziz06193 commented Mar 18, 2020

Hey there, I am newbie and I want to ask one question. is this the correct format of manifest_json = """ code """ and background_js = """code""",
I mean these consecutive double quotes are necessary? and is there any need to change other than path to chrome driver. Thanks

@adv-zl

This comment has been minimized.

Copy link

@adv-zl adv-zl commented Apr 9, 2020

Is it possible to use it with socks5 proxy?

@saikalyanBotlaguduru

This comment has been minimized.

Copy link

@saikalyanBotlaguduru saikalyanBotlaguduru commented Nov 20, 2020

Is it possible to use it with socks5 proxy?

Hi Did you manage to get the code for Socks5 proxy with chrome . Can you share pls

@BlairCurrey

This comment has been minimized.

Copy link

@BlairCurrey BlairCurrey commented Jan 20, 2021

@saileshkush95 you need to create the extension directory

@ehuijzer

This comment has been minimized.

Copy link

@ehuijzer ehuijzer commented Feb 18, 2021

@rajat-np. Thanks. This works!

Maybe a usefull tip for others.
I was struggling with Chrome versions getting automatically updating causing errors of non-matching chromedriver.
I found the package webdriver_manager which can handle this automatically

I replaced line
chromedriver = os.getcwd()+'/Chromedriver/chromedriver'
by

from webdriver_manager.chrome import ChromeDriverManager
chromedriver = ChromeDriverManager().install()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment