-
-
Save rajat-np/5d901702a33e7b4b5132b1acee5d778e to your computer and use it in GitHub Desktop.
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 |
thank you.
My moped went
Any idea how to fix this?
I am running into the same issue. Did anyone find a way around it?
I think this SO answer can help.
https://stackoverflow.com/questions/45372066/is-it-possible-to-run-google-chrome-in-headless-mode-with-extensions
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
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
Is it possible to use it with socks5 proxy?
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
@saileshkush95 you need to create the extension
directory
@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()
Hey @rajat-np, I copied every line of code exactly and for some reason, I'm still having a problem, I get no error message, but when I check the ip that the chrome is using, it's my IP instead of proxy IP, could anyone pls help me, at this point, I have no idea what to do next. Here is my code, if anyone can spot a mistake
from turtle import back
from weakref import proxy
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.proxy import Proxy
#from seleniumwire import webdriver
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
import time
import json
import zipfile
import os
import random
from threading import Thread, Lock
FILE_LOCK = Lock()
chrome_options = Options()
#chrome_options.add_argument("--headless")
logins_file = open('./logins.json')
login_content = logins_file.read()
login_content = json.loads(login_content)
proxy_file = open('./proxies.txt')
proxy_contents = proxy_file.readlines()
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 = './chromedriver'
co.add_extension(pluginfile)
driver = webdriver.Chrome(chromedriver,chrome_options=co)
#return the driver with added proxy configuration.
return driver
def run():
[PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS] = random.choice(proxy_contents).split(":")
#print(hostname, port, username, proxy_password)
#driver = get_chromedriver(use_proxy=True) #, PROXY_HOST=hostname, PROXY_PASS=proxy_password, PROXY_PORT=port, PROXY_USER=username)
#driver = webdriver.Chrome("./chromedriver", seleniumwire_options=options)
driver = proxy_chrome(PROXY_HOST,int(PROXY_PORT),PROXY_USER,PROXY_PASS)
try:
while True:
# do something with the driver
finally:
driver.close()
i = 0
threads = []
while True:
try:
t = Thread(target=run)
t.start()
time.sleep(5)
threads.append(t)
i+= 1
print(i)
for z in threads:
if z._is_stopped:
continue
if i >= 2:
break
except:
#logins_file.write(json.dumps(login_content))
logins_file.close()
for t in threads:
t.join()
Hi UrsaarDev, maybe too late, but the zip file is created when you run the file
This has worked great for me! Until 2025...
Any chance of "manifest_version": 3 version due to chrome disabling v2?
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:Any idea how to fix this?